Unity人物移动的几种方法

  • 方法一:transform.Translate
  • 世界坐标系移动
  • 自身移动的案例
  • 方法二:CharacterController.Move(vector dir)
  • 按照世界坐标轴移动
  • 按照自身坐标轴移动
  • 方法三:CharacterController.SimpleMove(vector dir)慎用
  • 按照世界坐标轴移动:
  • 按照自身坐标轴移动:


方法一:transform.Translate

再讲之前先知道Vector3.forward就是朝前也就是Z轴的方向,如果不明白的可以看一下图

unity怎么将一个动画重定向不同规格的人体骨骼上 unity人物怎么移动_Move

世界坐标系移动

代码中写的是根据世界坐标轴的z轴方向移动,然后再看一下右上角的世界坐标轴发现是根据世界坐标轴的z轴移动是没有问题的,这里在观察一个问题就是这个物体的自身坐标轴的z轴是朝向左侧的,这个就是因为方法第二个参数的作用,Space.World为根据世界坐标轴方向移动,Space.Self则是根据自身的方向移动

// Update is called once per frame
	void Update () {
        transform.Translate(Vector3.forward * Time.deltaTime * 10f, Space.World);
    }

unity怎么将一个动画重定向不同规格的人体骨骼上 unity人物怎么移动_Unity人物移动_02

自身移动的案例

下一行注释的一行就相当于上一行,这个方法默认有一个枚举是根据自身的坐标系来进行位移,也就是说这里写不写Space.self都一样。

// Update is called once per frame
	void Update () {
        transform.Translate(Vector3.forward * Time.deltaTime * 10f,Space.Self); //1
        //transform.Translate(Vector3.forward * Time.deltaTime * 10f); //2
    }

看一下效果:

unity怎么将一个动画重定向不同规格的人体骨骼上 unity人物怎么移动_Unity人物移动_03

方法二:CharacterController.Move(vector dir)

CharacterController.Move这个方法没有明确的枚举告诉我们是世界坐标系还是自身坐标系,所以这里通常transform.XXX(forward)来代表自身坐标,用Vector.XXX(forward)来代表世界坐标。
如下图所示:

按照世界坐标轴移动

unity怎么将一个动画重定向不同规格的人体骨骼上 unity人物怎么移动_Unity人物移动_02


代码如下:

// Update is called once per frame
	void Update () {
        chars.Move(Vector3.forward * Time.deltaTime * 10f);
    }

按照自身坐标轴移动

unity怎么将一个动画重定向不同规格的人体骨骼上 unity人物怎么移动_Unity人物移动_03


代码如下:

// Update is called once per frame
	void Update () {
        chars.Move(transform.forward * Time.deltaTime * 10f);
    }

方法三:CharacterController.SimpleMove(vector dir)慎用

为什么说慎用这个方法是因为这个移动是需要有某种基础来可以移动的

  1. 首先需要一个地面去让移动的物体在上面,如果没有则是不起到任何作用的
  2. 这个方法是自带刚体的,当使用时附带刚体效果自由下落,如果不使用时则没有刚体的自由下落效果
  3. 这个方法跟我上面介绍的两种方法速度机制不一样,不需要 * Time.delatetime 即可使用

效果图放在下面:

按照世界坐标轴移动:

unity怎么将一个动画重定向不同规格的人体骨骼上 unity人物怎么移动_人物控制器移动_06

代码如下:

void Update () {
        chars.SimpleMove(Vector3.forward);
    }

按照自身坐标轴移动:

unity怎么将一个动画重定向不同规格的人体骨骼上 unity人物怎么移动_Move_07

代码如下:

void Update () {
        chars.SimpleMove(transform.forward);
    }