您的位置:首页 > 移动开发 > Unity3D

U3D-移动、朝向-根据当前摄像机的变化来调整方向

2018-02-01 19:47 465 查看

备注

项目中因需要制作类似王者荣耀的移动和脸朝方向

如:王者荣耀中的马可波罗,他的射击时的:移动、脸朝向是分开的

代码

// author   : jave.lin
// date     : 2018-02-01
private void _update3()
{
// move
var move = moveInput; // moveInput是虚拟摇杆的当前x,y操作分量的Vector2对象,用于控制移动的
var face = faceInput; // faceInput同上,用于控制脸朝向的
if ( move.x != 0 || move.y != 0 )
{
var sp = speed * Time.deltaTime;
var vec = new Vector3( move.x, 0, move.y );
var newRotation = new Vector3(0, camera.transform.eulerAngles.y, 0); // 根据镜头旋转Y分量的欧拉
vec = Quaternion.Euler( newRotation ) * vec; // 旋转一下当前摇杆中的向量vec
Quaternion q = Quaternion.LookRotation( vec ); // 再将这个与镜头y分量同旋转两的vec转为四元数q
transform.position += q * Vector3.forward * sp; // 在用q坐乘vector3,将q的变化应用到vector3.forward中,得到最后的向量方向,最后在将单位方向乘以 sp,速度标量,来作为每帧的位移量

if (animationStateCtrl.getStateByVec(move, face) != 4 ) // 因为这些代码是我自己在测试项目中些的,这里代码不是关键,就不搬过来了,这个方法是,通过:move, face两个操作方向来算出当前用的是什么的动作状态值,4是退后走
{
// 如果不是退后走的动画状态
transform.rotation = q; // 使用移动的方向来冬至
}
else
{
// 如果退后走的话,将人的脸朝向与face的四元数旋转方向一致
_updateFace( face );
}
}
else
{
// 如果移动方向没控制话,将人的脸朝向与face的四元数旋转方向一致
_updateFace( face );
}
}

private void _updateFace( Vector2 face )
{
var faceVec = new Vector3( face.x, 0, face.y );
if ( faceVec.x != 0 || faceVec.z != 0 )
{
var faceNewRotation = new Vector3( 0, camera.transform.eulerAngles.y, 0 );
faceVec = Quaternion.Euler( faceNewRotation ) * faceVec;
Quaternion faceQ = Quaternion.LookRotation( faceVec );
transform.rotation = faceQ;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息