前言
控制物体移动是一个游戏中重要的一部分,对于不同的场景,需要运用不同的方式来完成对于游戏物体的移动
1,控制玩家移动
控制玩家移动主要是空过WASD键(方向键)来完成,这种控制方式首先需要输入键盘的控制,然后使用函数方法来完成,主要的方式有:
- 使用transform.Translate:
public float speed = 2f;
// Update is called once per frame
void Update()
{
float x = Input.GetAxis("Horizontal")*Time.deltaTime*speed;
float y = Input.GetAxis("Vertical")*Time.deltaTime*speed;
transform.Translate(x, 0, y);
}
- 使用角色控制器来完成:
角色控制器控制移动的函数为Move,可以配合GetAxis()来使用:
public CharacterController player;
public float speed = 2f;
private void Start()
{
player = GetComponent<CharacterController>();
}
private void Update()
{
float x = Input.GetAxis("Horizontal")*Time.deltaTime*speed;
float y = Input.GetAxis("Vertical")* Time.deltaTime * speed;
player.Move(new Vector3(x, 0, y));
}
2,场景中物体移动
控制场景中的物体移动是很重要的一环,NPC与一些物体的的效果是构成 整个 游戏重要的一环,所以需要在不同的环境下掌握不同的方式
- Vector3.Lerp的插值运算:
插值运算用来控制物体移动某个点,由于速度不均匀,通常用来做相机的跟随效果:
对于其方法为:
Vector3.Lerp(a, b,t);
- a为开始的位置
- b为要到达的位置
- t为插值且取值为0~1之间,如果大于1,效果等同于1,t越大则到达速度越快,若为1,则直接到达
而Vector3.Lerp方法等同于 a+ (b - a) * t 这种计算方式,如下代码所示,脚本每帧调用该插值算法并返回一个经过插值运算后得到的位置给transform,直到transform无限接近Vector(6,0,6)这个位置(但是unity会有取值范围):
private void Update()
{
//最开始距离最大,所以插值算出的数值也最大,所以移动的速度最快
transform.position = Vector3.Lerp(player.position, new Vector3(6, 0, 6), 0.01f);
}
- Vector3.MoveTowards的匀速移动:
MoveTowards可以匀速的控制物体移动,有更宽阔的应用场景,我们可以使用这样的方法:
官方API对其解释为:
Vector3.MoveTowards(a, b, d);
- a为开始位置
- b为要到达的位置
- d为每帧移动的最大距离,所以d相当于移动速度
private void Update()
{
//使用Time.deltaTime来确保物体可以匀速的运动,不会受帧率的波动而影响
transform.position = Vector3.MoveTowards(transform.position, new Vector3(6, 0, 6), 1f*Time.deltaTime);
}
总结
对于不同的场景可以采用不同的控制一定方式。一句话,要灵活的使用,选择很重要