接下来我们布置场景,我们的预期结果(功能分析)是:
? ? ? ? 游戏中中的直升机按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.