如何记录NavMesh AI代理的方向

时间:2019-05-20 20:49:24

标签: c# unity3d animator navmesh

我想知道如何掌握Navmesh代理的行走方向,我计划使用这些值将它们引用到Blendtree中,根据AI方向,某些动画将在其中播放,使用2D Free形式我计划在笛卡尔平面上使用这些参考方向值来播放某些动画,并且X和Z方向均从零开始。所以向前走Z值为1,而X值为0

目前,我已经尝试使用刚体速度和transform.forward(X和Z),而使用速度,transform.forward没有收到任何值,但是确实增加了值,但是看起来好像不是我要寻找的值(这些值必须在0-1的范围内,并且永远不会将起始位置(空闲)设为0,0

void animationUpdate() {
        anim.SetFloat("Enemy Z", /* Unsure what to do*/);
        anim.SetFloat("Enemy X", /* Unsure what to do*/);

        if (/*transform.forward.x != 0 && transform.forward.z != 0*/) {
            anim.SetBool("isWalking", true);
        } else {
            anim.SetBool("isWalking", false);
        }
    }

我的笛卡尔平面如下 Cartesian Plane

任何帮助将不胜感激,  谢谢您的阅读

1 个答案:

答案 0 :(得分:2)

您可以使用81 00 00 5C B1 13 3E 01 0C 43 B1 13 A6 00 1C 43 B1 13 38 01 32 D0 10 00 FD 3F 03 43 00 00 00 02 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 14 5C 00 5C CF 0C 来查找移动的方向,然后使用desiredVelocity将其分解为前进/向右的方向。

Vector3.Project

获取幅度(由于我们预测了归一化的运动,它将是-1和1之间的浮点数),并使用Vector3 normalizedMovement = nav.desiredVelocity.normalized; Vector3 forwardVector = Vector3.Project(normalizedMovement, transform.forward); Vector3 rightVector = Vector3.Project (normalizedMovement, transform.right); 确定每个分量中幅度的符号:

Vector3.Dot

现在,您可以将它们分配给动画,并使用// Dot(direction1, direction2) = 1 if they are in the same direction, -1 if they are opposite float forwardVelocity = forwardVector.magnitude * Vector3.Dot(forwardVector, transform.forward); float rightVelocity = rightVector.magnitude * Vector3.Dot(rightVector, transform.right); 将范围从[-1,1]转换为[0,1]:

Mathf.InverseLerp