如何在Unity3d中创建一个"排斥"(逃离)玩家的NPC

3

我花了约一个小时的时间研究如何在Unity3d中制作NPC“排斥”(即从玩家处逃离)。无论我在哪里搜索,都会找到大量关于如何让NPC朝着玩家奔跑的内容,但从未涉及排斥。因为我是游戏开发新手,所以不知道怎么做。


1
从玩家那里获取一个向量点,指向NPC。如果你仔细想想,这就是你想要的方向!让NPC朝着那个方向移动。 - Fattie
2个回答

3

获取玩家和NPC的Vector3位置,然后进行以下计算:

Vector3 direction = NPCPosition - playerPosition;
direction.y = 0;
direction = Vector3.Normalize(direction);
NPCTransform.rotation = Quaternion.Euler(direction);

//MOVE NPC forward (the calculations above calculate the direction away from the player)
NPCTransform.Translate(NPCTransform.position + (transform.forward * NPCSpeed));

我希望这可以帮到你。 :)
如果有任何不清楚的地方,请直接问我。:D
编辑:我添加了 direction = Vector3.Normalize(direction); 这一行代码。

1

在这个答案中,我会尽力解释我写的代码。

向量只是浮点数数组。Vector2 包含两个浮点数,Vector3 包含三个浮点数……在 Unity 中,Vector3 用于位置和方向。

第一行:

Vector3 direction = NPCPosition - playerPosition;

我们正在创建一个Vector3方向。我们采用Vector3 NCPPosition - playerPosition。那么,我们为什么要这样做呢?想象一下一条直线上的两个点。假设你想知道第二个点沿着该直线行驶到达第一个点的距离。假设第一个点离该直线的起点1英寸远。并且假设第二个点距离该直线的起点2英寸。那么第二个点必须向哪个方向移动才能远离第一个点呢?嗯,向右移动。我们如何计算这个方向?我们取要移动的点的位置,并减去要远离的点的位置。这将给我们一个值(1)。这意味着,我们可以向右移动1英寸。如果这些点在不同的位置,例如我们要移动的点在2上,而我们要远离的点在5上,则上述计算将返回-3。这意味着,我们可以向右移动-3英寸(向左移动3英寸)来远离该点。现在让我们对所有轴(x、y和z)进行此操作,这将得到一个我们想要移动的方向(远离玩家)的Vector 3。

在第二行中,

direction.y = 0;

我们将y轴设为零。为什么?在Unity中,y轴代表上下移动。由于我们不希望NPC在高于玩家时飞走,低于玩家时卡到地面,因此将该轴设置为零。
我在之前的回答中漏掉了这一行:
direction = Vector3.Normalize(direction);

在这行代码中,我们实际上将方向变成了一个方向(对于这个解释比较差,抱歉)。这是因为我们计算了物体在全局空间中的距离差,并希望NPC以恒定速度移动。如果没有写这行代码,NPC的速度将随着与玩家的距离变化而改变。
在下一行代码中,
NPCTransform.rotation = Quaternion.Euler(direction);

我们将NPC从玩家那里旋转开来。为什么要使用Quaternion.Euler()?因为我们不能将旋转设置为Vector,必须先将其转换为Quaternion。在Unity中,四元数用于旋转。在最后一行,我们实际上移动了NPC。
NPCTransform.Translate(transform.forward * NPCSpeed);

在Unity中有很多移动物体的方法。 如果你想让NPC有重力(以防他从某个地方掉下来,而不是漂浮在空中:D),你应该给NPC添加一个刚体并勾选“使用重力”。 在这种情况下,最后一行将会像这样,而不是NPCTransform.Translate(transform.forward * NPCSpeed):

NPCRigidbody.AddForce(direction * NPCSpeed);

使用变换移动 NPC 时,我们将使用上面的代码行:

NPCTransform.Translate(...);

translate方法将转换(在我们的情况下是NPC对象)移动到给定的位置。那么,我们在该方法中传递了什么?

我们传入了这个:

transform.forward * NPCSpeed

因为这个方法移动对象的位置,所以我们添加了transform.forward * NPCSpeed。在这里,我们只需取方向并将其乘以我们想要NPC移动的速度(速度是一个数字,通常是浮点数)。

因此,如果您要使用转换移动NPC,则代码将如下所示:

Vector3 direction = NPCPosition - playerPosition;
direction.y = 0;
direction = Vector3.Normalize(direction);
NPCTransform.rotation = Quaternion.Euler(direction);
NPCTransform.Translate(transform.forward * NPCSpeed);

如果您使用Rigidbody来移动NPC,就像这样:

Vector3 direction = NPCPosition - playerPosition;
direction.y = 0;
direction = Vector3.Normalize(direction);
NPCTransform.rotation = Quaternion.Euler(direction);
NPCRigidbody.AddForce(direction * NPCSpeed);

我希望解释足够清楚。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接