Unity3d 团结是寻找NPC和玩家之间距离的最佳方式
我已经写了一些代码来找出玩家和一些NPC之间的距离,如果他们中的任何一个有Unity3d 团结是寻找NPC和玩家之间距离的最佳方式,unity3d,Unity3d,我已经写了一些代码来找出玩家和一些NPC之间的距离,如果他们中的任何一个有
void Update()
{
for (int i = 0; i < characters.Length; i++)
{
distances[i] = Vector3.Distance(player.transform.position, characters[i].transform.position);
if (distances[i] < minDistanceToTalk)
{
playerCloseCharacter = true;
currentCharacter = characters[i];
talkWithCharacterText.gameObject.SetActive(true);
}
}
if (!playerCloseCharacter)
{
talkWithCharacterText.gameObject.SetActive(false);
}
playerCloseCharacter = false;
}
void Update()
{
for(int i=0;i
是的,这对性能非常不利。LOL,此更新每秒运行60多帧,想象一下每秒60*3=120次操作。对于1000个NPC,即每秒1000*60=60000次操作,这将导致性能的提高和降低。尽量不要在更新中放入for循环,更新本身就像一个for循环,因为它是一个持续运行的循环
有两种方法可以做到这一点:
[简易方法]
您可以创建一个球体碰撞器,该碰撞器覆盖您希望玩家与NPC交互的特定距离,该碰撞器将位于NPC上,并在碰撞器上将isTrigger设置为true。然后在上面创建一个脚本,检查玩家是否在附近。例如:
private void OnTriggerEnter(Collider other)
{
Player player = other.GetComponent<Player>();
if(player != null)
{
// Do stuff if the player is within the collider
}
}
专用无效对撞机(对撞机其他)
{
Player=other.GetComponent();
如果(玩家!=null)
{
//如果玩家在对撞机内,则执行操作
}
}
或者,您可以将此代码放在播放器上或您可能拥有的“player.cs”脚本中。您可以做同样的事情,但不是Player=other.GetComponent()
您将执行NPC NPC=other.GetComponent()
然后在if语句中是if(npc!=null)
在其中执行所需操作。这是一个简单的方法,你会有很多对撞机,但这比在所有NPC中循环要好。
[最佳性能]
我没有这方面的代码,但以下是相关文档:
你要做的基本上是在你周围的一个圆圈里投射一条光线到一定的距离,这条光线会返回它碰撞到的任何东西(注意物体必须有某种类型的碰撞器才能被检测到)。所以你可以检查它碰撞的物体是否是NPC,如果是,你可以做你想做的事情或者调用NPC本身的函数。这是有性能的,因为您不需要像第一个实现那样创建多个碰撞器,而是投射一条不可见的光线,不必渲染,因此可以节省性能。您还可以在某一层遮罩上投射一条光线,而忽略所有其他遮罩,这样性能会更好,因为您可以节省不使用的操作
事实上,我在youtube上找到了一段很好的视频:
祝你好运 您可以使用。。。我不明白为什么光线投射的性能比物理引擎更好(不管怎样,这两次你都需要对撞机)。。光线投射每帧触发一次,而不是物理更新(
fixeupdate
-通常约0.02秒)。你对物理的看法是正确的。重叠球,这就是我发布的视频所谈论的。至于物理引擎,你会有一个额外的对撞机,它仍然是一个额外的组件,必须加载到场景中,即使你只做触发器。但是光线投射只是与已经存在且需要的碰撞器的碰撞点,因此您可以为NPC@derHugo使用一个碰撞器,而不是2+碰撞器