您当前的位置: 首页 >  3d

Jave.Lin

暂无认证

  • 1浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

Jave.Lin 发布时间:2018-02-01 19:47:19 ,浏览量:1

备注

项目中因需要制作类似王者荣耀的移动和脸朝方向 如:王者荣耀中的马可波罗,他的射击时的:移动、脸朝向是分开的

代码
// 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;
    }
}
关注
打赏
1664331872
查看更多评论
立即登录/注册

微信扫码登录

0.0387s