1 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
該Rigidbody.AddForce函數(shù)用于沿某個(gè)方向向?qū)ο筇砑恿?。由于您有一個(gè)需要移動(dòng)Rigidbody到的位置,因此您必須使用該Rigidbody.MovePosition功能。您可能還想將剛體標(biāo)記為運(yùn)動(dòng)學(xué)。
將 Rigidbody 對(duì)象移動(dòng)到特定位置的簡(jiǎn)單協(xié)程函數(shù):
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();
}
}
最好從另一個(gè) coorutine 函數(shù)調(diào)用它,以便您可以讓步或等待它完成,然后執(zhí)行其他任務(wù),例如再次生成隨機(jī)位置并將剛體移動(dòng)到那里。
您想生成新位置然后將其移動(dòng)到Rigidbody那里,這是如何調(diào)用上述函數(shù)的示例:
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));
}
}
并啟動(dòng)該StartMoveMent功能:
void Start()
{
StartCoroutine(StartMoveMent());
}
雖然我上面所說(shuō)的應(yīng)該可行,但我建議您使用 Unity 的內(nèi)置尋路系統(tǒng)。這是一個(gè)教程。它簡(jiǎn)化了尋找通往目的地的路徑,NavMesh也可以使用baked during run-time.
- 1 回答
- 0 關(guān)注
- 174 瀏覽