【发布时间】:2020-04-22 14:51:19
【问题描述】:
我的游戏中有一个布尔变量,用于控制 NPC 每回合可以移动多少次。这是一款战术角色扮演游戏。 NPC每回合只能移动一次。布尔值被称为 canMoveNPC 并且它被初始化为真。然后,当 NPC 到达目的地时,我将其设置为 false。
但是,当我将回合传递给人类玩家时,我希望这个变量再次为真,因为这样,当轮到 NPC 时,他能够再次移动。但它并没有恢复为真,它保持为假。我不知道我做错了什么。
我用这段代码来移动 NPC 并将变量设置为 false:
ublic void Move()
{
for (int i = 0; i < mov.NPCS.Length; i++)
{
if (!Physics.Raycast(Sherrif.transform.position, Sherrif.Left_Right, out Sherrif.hitRight) || Sherrif.hitLeft.transform.tag != "Human")
{
if (mov.gameManager.NPCTurn && canMoveNPC )
{
mov.NPCPlayer = mov.NPCS[2];
mov.NPCS[2].GetComponent<NPC>().isNPC = true;
IsMoving = true;
this.transform.position = Vector3.MoveTowards(this.transform.position, targetPosition, velocity * Time.deltaTime);
}
if(this.transform.position == targetPosition)
{
mov.NPCS[2].GetComponent<NPC>().isNPC = false;
IsMoving = false;
canMoveNPC = false;
}
}
}
}
在这里,我有一个游戏管理器,用于控制回合并将变量再次设置为 true。当 NPC 轮到他时,我使用下面的代码:
else if (mov.gameManager.playerTurn == 2)
{
mov.gameManager.playerTurn = 1;
mov.gameManager.NPCTurn = false;
mov.gameManager.HumanTurn = true;
mov.TurnEnd();
mov.interfaceManager.ChangeTurn();
for (int i = 0; i < mov.NPCS.Length; i++)
{
mov.NPCS[i].GetComponent<NPC>().canMoveNPC = true;
}
}
我该如何解决?
【问题讨论】:
-
这可能会有所帮助。
MoveTowards不会超出其目标,因此您需要检查“近似等效”。请参阅 Unity 文档中的Update方法,了解他们是如何做到的。文档描述也可能有所帮助。 docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html -
但是当我打印 NPC 位置和目标位置时,它们是相同的。目标位置是一个向量3,我用它来将 NPC 移动到他面前的瓷砖上。
-
基本上看起来还可以。我会使用调试器并首先在设置所有标志的循环之后设置一个断点,然后将断点放在标志设置为假的点上。也许由于某种原因,您的 NPC 代码会立即假定轮到它,并再次将其设置为 false。您还可以更进一步并使用观察点来查看该变量何时返回为假。 docs.microsoft.com/en-us/visualstudio/debugger/…
-
我已经尝试过使用断点,但我不知道它是如何工作的。我认为当我再次设置为 NPC 转弯时会发生错误。
-
我怀疑它会在人类玩家轮到 NPC 回合时发生变化