Unity 3D: c# NPC相互碰撞

本文关键字:碰撞 NPC 3D Unity | 更新日期: 2023-09-27 18:09:02

我知道如何阻止NPC撞到玩家,但我似乎不知道如何让NPC和玩家避免碰撞?

NPC有一个"AI"的标签,我已经尝试了一些事情,但我真的不能弄清楚?

这是我的代码,任何帮助是感激的。

using UnityEngine;
using System.Collections;
public class AI : MonoBehaviour {
public Transform target;
public int moveSpeed = 5;
public int rotationSpeed = 2;
public Transform myTransform;
public float minDistance = 0.1f;

void Awake ()
{
    myTransform = transform;
}
void Start ()
{
    target = GameObject.FindWithTag ("Player").transform;
}
void Update ()
{
    Vector3 Distance = target.position - myTransform.position;
    if(Distance.sqrMagnitude>minDistance*minDistance)
    {
        myTransform.rotation = Quaternion.Slerp (myTransform.rotation, Quaternion.LookRotation (target.position - myTransform.position), rotationSpeed * moveSpeed * Time.deltaTime);
        myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
    }

Unity 3D: c# NPC相互碰撞

在你的AI GameObject上找到碰撞器组件,要么删除它,要么检查itrigger选项。

更多关于IsTrigger:

对撞机是触发器吗?

触发器不注册与传入刚体的碰撞。相反,当刚体进入或退出触发卷时,它会发送OnTriggerEnter, OnTriggerExit和OnTriggerStay消息。

如果你设置了与玩家的距离以及与其他npc的距离作为避免相互碰撞的机制,那么它们可能会发生冲突。

例如,代码可能会告诉NPC远离玩家,这可能意味着要移动到离另一个NPC太近的地方,所以这两个命令会相互冲突。

更模块化的方法可能是将命令分成方法:

AvoidPlayer()
{
    // Code here to move away from player.
}
AvoidNPC()
{
    // Code here to move away from NPC.
}

您可以在适当的时候调用它们。如果你想确保npc与玩家之间、npc与玩家之间保持最小距离,就要牢记冲突命令的逻辑问题。