接下来我们布置场景,我们的预期结果(功能分析)是:
游戏中中的直升机按E键螺旋桨加速,加速至800直升机向上飞行,达到2000转速不再加速,直升机向上飞行10m向前飞,向前飞10米向下飞并且螺旋桨减速。螺旋桨减速至0再次起飞,并且螺旋桨不再旋转。
首先进入资源商店准备下载直升机模型资源,
搜索helicopter,
将免费资源导入unity包,
将导入资源完全解压缩 以让我们进行修改,
解开预制体之后,创建一个地面Plane,
设置其大小,
设置地面颜色(可不做)
创建脚本文件夹,
创建脚本,
命名为Fly
双击打开脚本编写代码:
using UnityEngine;
public class Fly : MonoBehaviour{
public float speed = 2f;//向上的位移速度
//每一帧被调用一次
void Update(){
if (transform.position.z > 10f)
FlyDown();
else if (transform.position.y < 10)
FlyUp();
else
FlyForWard();
}
//向上飞
void FlyUp(){
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
//向前飞
void FlyForWard(){
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
//向下飞
void FlyDown(){
if (transform.position.y > 0)
transform.Translate(Vector3.down * speed * Time.deltaTime);
}
}
编写好代码 ctrl + s 保存,将Fly.cs代码绑定在 飞机物体上,并修改飞机名字为Helicopter,
点击 Main Camera 按住ctrl + shift + f 可调整运行视角 与 编辑视角 一致,
运行即按照代码要求自动飞行,
但飞行并不真实,直升机的螺旋桨没有旋转,
修改Fly.cs:
using UnityEngine;
public class Fly : MonoBehaviour{
public GameObject mainRotorObj;//主螺旋桨物体
public GameObject tailRotorObj;//尾部螺旋桨
public float rotSpeed;//旋转速度
public bool isOnOff = false;//是否开关引擎
public float rotAcceleration;//旋转加速度
//定义枚举类型
public enum Status{
ZeroEngine,//停机状态
RunEngine,//启动状态
TakeOff,//起飞状态
FlyForward,//平飞状态
Landing//降落状态
}
Status status;//直升机状态
void Start(){
if (mainRotorObj == null || tailRotorObj == null)
Debug.LogError("部分子物体没有拽入参数栏");
}
void Update(){
//开关语句进行状态分支,引入枚举变量
if (status == Status.ZeroEngine)
rotAcceleration = -1f;
else if (status == Status.RunEngine)
rotAcceleration = 1f;
else if (status == Status.TakeOff)
transform.Translate(Vector3.up * 2f * Time.deltaTime);
else if (status == Status.FlyForward)
transform.Translate(Vector3.forward * 2f * Time.deltaTime);
else if (status == Status.Landing){
if (transform.position.y > 0)
transform.Translate(Vector3.down * 2f * Time.deltaTime);
rotAcceleration = -0.5f;
}
if (Input.GetKeyUp(KeyCode.E))
isOnOff = !isOnOff;
if (isOnOff)
status = Status.RunEngine;
else
status = Status.ZeroEngine;
if (rotSpeed < 0)
rotSpeed = 0;
if (rotSpeed > 2000f)
rotSpeed = 2000;
//螺旋桨公共代码
rotSpeed += rotAcceleration;
mainRotorObj.transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);
tailRotorObj.transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);
if (rotSpeed > 800)
status = Status.TakeOff;
if (transform.position.y > 10f)
status = Status.FlyForward;
if (transform.position.x > 20f)
status = Status.Landing;
if (rotSpeed == -0.5)
status = Status.TakeOff;
if (status == Status.TakeOff)
rotSpeed += 0.5f;
}
}
将主螺旋桨与尾螺旋桨绑定在代码框选上,
运行项目 按 键盘E键 即可按照要求飞行,
End.