Unity -物体移动的所有实现方式

前言

控制物体移动是一个游戏中重要的一部分,对于不同的场景,需要运用不同的方式来完成对于游戏物体的移动

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);
        
    }

总结

对于不同的场景可以采用不同的控制一定方式。一句话,要灵活的使用,选择很重要

猜你喜欢

转载自blog.csdn.net/xinzhilinger/article/details/109821533