如何获取角色的正确朝向?
首先,你要确定从unity里面导出的时候,角色默认朝向的方向。一般都是将角色朝向z轴正方向,那么,你导出放到layabox里面,角色也是默认朝向z轴正方向的。
在layabox中,你可以调用transform.getForward(forward)方法,传入一个Vector3来接收朝向。但是,接收的这个朝向默认角色z轴负方向的朝向。所以,我们需要将这个法向量,转成z轴正方向的法向,才实现了,和角色的朝向同步。
实现这一步,很简单,只需要将法向的x轴和z轴的值转为负值即可实现。
const forward = new Laya.Vector3();
actor.actorView.transform.getForward(forward);
forward.x *= -1;
forward.z *= -1;
Laya.Vector3.normalize(forward, forward);
获取角色和指定方向的偏移
其次,我们还有需求,就是,有一个目标,我们可以通过角色位置和目标位置获取到一个向量,然后,通过求点积,获取到角色正法向和这个向量的夹角(角色默认垂直与地面,所以,位置向量,我们也默认平行于地面)
//获取到移动方向
const moveNor = new Laya.Vector3(1, 0, 0);
//获取当前朝向和移动方向的夹角
const value = Laya.Vector3.dot(moveNor, forward);
//求出角度
const deltaAng = (Math.acos(value) * 180) / Math.PI;
你求出了角度,但是,你根本无法知道这个需要往哪个方向偏移,我们就需要求叉积,求出的叉积的y的值,如果为负值,那么就向顺时针偏移,反之,则往逆时针偏移。接着,我们将值给角色使用即可。
const out = new Laya.Vector3();
Laya.Vector3.cross(forward, moveNor, out);
if (out.y < 0) deltaAng = -deltaAng;
sprite.transform.rotate(new Laya.Vector3(0, deltaAng, 0), true, false);