1

我想知道如何获取 Navmesh Agent 行走的方向,我计划使用这些值将它们引用到 Blendtree 以根据 AI 方向播放某些动画,使用 2D 自由形式笛卡尔平面我计划使用这些引用的方向值来播放某些动画,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);
        }
    }

我的笛卡尔平面如下 笛卡尔平面

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

4

1 回答 1

2

您可以使用desiredVelocity它来找到它正在移动的方向,然后Vector3.Project将其分解为它如何向前/向右移动。

Vector3 normalizedMovement = nav.desiredVelocity.normalized;

Vector3 forwardVector = Vector3.Project(normalizedMovement, transform.forward);

Vector3 rightVector = Vector3.Project (normalizedMovement, transform.right);

获取幅度(因为我们预测了归一化运动,它将是 -1 和 1 之间的浮点数)并用于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

anim.SetFloat("Enemy Z", Mathf.InverseLerp(-1f, 1f, forwardVelocity));
anim.SetFloat("Enemy X", Mathf.InverseLerp(-1f, 1f, rightVelocity));
于 2019-05-20T21:57:34.447 回答