1 回答
TA贡献1776条经验 获得超12个赞
该Rigidbody.AddForce函数用于沿某个方向向对象添加力。由于您有一个需要移动Rigidbody到的位置,因此您必须使用该Rigidbody.MovePosition功能。您可能还想将刚体标记为运动学。
将 Rigidbody 对象移动到特定位置的简单协程函数:
IEnumerator MoveRigidbody(Rigidbody rb, Vector3 destination, float speed = 50f)
{
const float destThreshold = 0.4f;
while (true)
{
Vector3 direction = (destination - rb.position).normalized;
rb.MovePosition(rb.position + direction * speed * Time.deltaTime);
float dist = Vector3.Distance(rb.position, destination);
//Exit function if we are very close to the destination
if (dist <= destThreshold)
yield break;
yield return null;
//yield return new WaitForFixedUpdate();
}
}
最好从另一个 coorutine 函数调用它,以便您可以让步或等待它完成,然后执行其他任务,例如再次生成随机位置并将刚体移动到那里。
您想生成新位置然后将其移动到Rigidbody那里,这是如何调用上述函数的示例:
IEnumerator StartMoveMent()
{
Rigidbody targetRb = GetComponent<Rigidbody>();
while (true)
{
//Generate random position
Vector3 destination = new Vector3();
destination.y = 0;
destination.x = UnityEngine.Random.Range(0, 50);
destination.z = UnityEngine.Random.Range(0, 50);
//Move and wait until the movement is done
yield return StartCoroutine(MoveRigidbody(targetRb, destination, 30f));
}
}
并启动该StartMoveMent功能:
void Start()
{
StartCoroutine(StartMoveMent());
}
虽然我上面所说的应该可行,但我建议您使用 Unity 的内置寻路系统。这是一个教程。它简化了寻找通往目的地的路径,NavMesh也可以使用baked during run-time.
- 1 回答
- 0 关注
- 156 浏览
添加回答
举报