前言
在很多游戏中都会有控制飞行物的情况,可以通过研究对于鸟的控制来了解一些飞行模式
1,如何控制鸟飞行
为了尽量模拟鸟的飞行方式,采用下面的控制策略:
移动:
- 按住W键控制鸟向前加速到最大速度并保持
- 按住S键控制鸟减速到最小的速度
- 不按住W键和S键则鸟同样缓慢减速
转向:
- Space键控制鸟向下飞
- Shift键控制鸟向上飞
- 不按Space键和Shift键则鸟上下角度回正
- A键和D键则控制物体左转和右转
2,通过代码来实现相关功能
移动的代码实现:
首先定义一个float变量speedOne作为控制物体的飞行速度,判断物体按下不同的按键时,speed做出不同的改变,然后在Update中调用speed控制物体的移动,使用transform.Translate来完成:
if(Input.GetKey(KeyCode.W) && speedOne<10f)
{
speedOne = speedOne + Time.deltaTime*0.2f;
}
//按下S键并且速度没达到最小,则速度减小
if (Input.GetKey(KeyCode.D) && speedOne > 1f)
{
speedOne = speedOne + Time.deltaTime * 0.2f;
}
//没有执行速度操作并且速度大于最小速度,则缓慢操作
if (!Input.GetKey(KeyCode.W)&& !Input.GetKey(KeyCode.D)&&speedOne >1f)
{
speedOne = speedOne - Time.deltaTime * 0.1f;
}
transform.Translate(Vector3.forward * speedOne * Time.deltaTime);
转向代码的编写:
- 首先就是实现按键的控制功能,可以让鸟进行正常的转向,首先是上下的转向,当按下Space和Shift键时开始转向:
//按下空格,若在可旋转角度,则向上旋转
if (Input.GetKey(KeyCode.Space) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 350))
{
transform.Rotate(Vector3.left * 0.1f);
}
//按下左Shift键,若在可旋转角度,则向下旋转
if (Input.GetKey(KeyCode.LeftShift) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 350))
{
Debug.Log("yes");
transform.Rotate(Vector3.right * 0.1f);
}
- 当没有按下控制上下的键时,上下角度回正,使用欧拉角来进行操作时要将角度分开来判断,并使用插值将角度回正:
if (!Input.GetKey(KeyCode.Space) && !Input.GetKey(KeyCode.LeftShift)&& transform.eulerAngles.x != 0)
{
if(transform.eulerAngles.x<=40) //为保证不出错,要比最大旋转角度大
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z), 0.1f);
if(transform.eulerAngles.x>=330) //欧拉角角度是0~360,所以分开判断
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(380, transform.eulerAngles.y, transform.eulerAngles.z), 0.01f);
}
- 鸟的左右旋转的控制,并保证鸟不侧翻:
//使用A和D来控制物体左右旋转
y = Input.GetAxis("Horizontal") * 10f * Time.deltaTime;
transform.Rotate(0,y,0);
if (transform.eulerAngles.z!=0)
{
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);
}
总结
话不多说,附上完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bordrun : MonoBehaviour
{
private float y;
float speedOne = 1f;
// Update is called once per frame
void Update()
{
//鼠标隐藏
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
//按下W键并且速度没达到最大,则速度增加
if(Input.GetKey(KeyCode.W) && speedOne<10f)
{
speedOne = speedOne + Time.deltaTime*0.2f;
}
//按下S键并且速度没达到最小,则速度减小
if (Input.GetKey(KeyCode.D) && speedOne > 1f)
{
speedOne = speedOne + Time.deltaTime * 0.2f;
}
//没有执行速度操作并且速度大于最小速度,则缓慢操作
if (!Input.GetKey(KeyCode.W)&& !Input.GetKey(KeyCode.D)&&speedOne >1f)
{
speedOne = speedOne - Time.deltaTime * 0.1f;
}
transform.Translate(Vector3.forward * speedOne * Time.deltaTime);
//使用A和D来控制物体左右旋转
y = Input.GetAxis("Horizontal") * 10f * Time.deltaTime;
transform.Rotate(0,y,0);
//按下空格,若在可旋转角度,则向上旋转
if (Input.GetKey(KeyCode.Space) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 340))
{
transform.Rotate(Vector3.left * 0.1f);
}
//按下左Shift键,若在可旋转角度,则向下旋转
if (Input.GetKey(KeyCode.LeftShift) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 340))
{
Debug.Log("yes");
transform.Rotate(Vector3.right * 0.1f);
}
if (!Input.GetKey(KeyCode.Space) && !Input.GetKey(KeyCode.LeftShift)&& transform.eulerAngles.x != 0)
{
if(transform.eulerAngles.x<=40) //为保证不出错,要比最大旋转角度大
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z), 0.1f);
if(transform.eulerAngles.x>=330) //欧拉角角度是0~360,所以分开判断
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(380, transform.eulerAngles.y, transform.eulerAngles.z), 0.01f);
}
if (transform.eulerAngles.z!=0)
{
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);
}
}
}
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!