遇到的问题
今天在用Character Controller的move写人物的移动时,参考了一下unity的api,遇到了一句这样的代码:moveDirection = transform.TransformDirection(moveDirection);
transform.TransformDirection以前是见过的,文档上一笔带过,说是自身坐标到世界坐标变换方向,由于当时也没用到,也就没怎么注意,现在用到了倒有些棘手了,不知道这个函数到底返回的是什么值?
解决问题
打印出来看看
既然不知道返回的是什么值,那么我们就打印出来看看呗。
当然咯,既然文档已经说了是自身坐标到世界坐标变换方向,那么就应该设置一些特殊条件,这样容易看出来。
这里我在场景中只放了一个红色cube,然后Y轴旋转180°,这样cube自身坐标的X、Z轴就恰好和世界坐标的X、Z轴相反。然后我们打印cube自身的Z轴方向以及TransformDirection的Z轴方向。
1 | Debug.Log("转换后的向量"+this.transform.TransformDirection(this.transform.forward)); |
结果:
发现答案
从结果中我们可以清楚的看到:transform.forward是自身的坐标的Z方向;而经过TransformDirection转换后就变成了世界坐标的Z轴了。
在api中还有一个和这个类似的方法:Transform.TransformPoint
它是将自身坐标转化为世界坐标,和TransformDirection大同小异。只是TransformPoint强调的是坐标点;TransformDirection则强调方向。
有什么用?
对啊,将自身坐标到世界坐标变换方向有什么用呢?
其实,这样的例子挺多的。
比如我遇到的问题:在第一人称射击类游戏中,方向键控制人物走动,鼠标控制镜头也就是旋转。如果我们不用TransformDirection;直接用
moveDirection = new Vector3(-Input.GetAxis("Vertical"), 0, Input.GetAxis("Horizontal"));
charController.Move(moveDirection * speed * Time.deltaTime);
那么会出现一个问题,当鼠标进行旋转后,用方向键控制移动,此时的运动是世界的,自身坐标和世界坐标并没有建立联系。这会出现什么情况呢?
当你的镜头向左旋转90°,然后按前进键,此时我们想要的效果是人物向前走(也就是相对于世界坐标向左走);但是人物却是侧这身子走的。也就是说无论人物如何旋转,人物的移动总是正东西方向,或者正南北方向的。
而如果改为
charController.Move(transform.TransformDirection(moveDirection) *speed*Time.deltaTime);
那么在移动时,自身坐标方向就被修改为相对于世界的坐标了。也就变成了绝对运动。
再比如:一个人在投篮,球的坐标相对世界坐标是不断变化的,而人在投篮的时候,我们需要知道这个投篮力的方向和大小,但是我们根本不知道篮球的坐标具体在什么方向上,我们知道的只是世界坐标,这个时候就可以使用TransformDirection来确定力的方向了。
后记
在网上也找了一下TransformDirection的文章,基本上没人写过,可能别人觉得比较好理解吧,总之我遇到了就记一下吧。now I guessed what is mean,maybe…..