这是一个基于回合的游戏,其中敌人的角色运行和击中玩家的角色,然后返回到它的开始位置。敌人的目标目标(玩家的角色之一)在每次回合后更新。在第一轮,一切都是正确的,字符沿着一条直线向目标移动。然而,在接下来的回合中,当目标发生变化时,它首先向前一个目标的位置跑去,然后移动到正确的目标,然后它不会立即返回开始位置。就像我说的,第一轮一切都是正确的,但是当目标改变时,这些行为就会发生。
public Vector3 startPos;
public Vector3 targetPos;
void Start()
{
startPos = transform.position;
targetPos = playerCharacter1.transform.position;
}
void Update()
{
Move(targetPos);
}
public void Move(Vector3 targetPos)
{
StartCoroutine(MoveOverTime());
IEnumerator MoveOverTime()
{
while (transform.position != targetPos)
{
transform.position = Vector3.MoveTowards(transform.position, targetPos, 0.04f * Time.deltaTime);
animator.Play("Run");
yield return null;
}
animator.Play("Attack");
yield return new WaitForSeconds(0.2f);
if (transform.localScale.x > 0f)
{
transform.localScale = new Vector3(-0.175f, 0.175f, 1f);
}
else
{
transform.localScale = new Vector3(0.175f, 0.175f, 1f);
}
while (transform.position != startPos)
{
transform.position = Vector3.MoveTowards(transform.position, startPos, 0.04f * Time.deltaTime);
animator.Play("Run");
yield return null;
}
if (transform.localScale.x < 0f)
{
transform.localScale = new Vector3(0.175f, 0.175f, 1f);
}
else
{
transform.localScale = new Vector3(-0.175f, 0.175f, 1f);
}
yield return null;
}
}发布于 2022-01-12 00:45:26
将targetPos移动到一个公共的全局值并不是一个好的解决方案!
使用您提供的代码,您实际上正在使用每个更新循环创建一个新的CoRoutine (正如@Fredrik所指出的)。使targetPos全球化似乎“有效”的原因是所有这些协作机制都将这个新的位置作为目标。然而,,,您仍然在创建和执行许多只在它们最终到达transform.position == targetPos时才会停止的协同机制。
在这里,有一些事情你应该修复:
if (Vector3.Distance(transform.position, targetPos) < 0.001f)
...
OR
if (Vector3.Distance(transform.position, targetPos) < Vector3.kEpsilon)请参阅此页面上的统一示例:https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html
Coroutine moveRoutine;
...
if (moveRoutine == null)
moveRoutine = StartCoroutine(MoveOverTime());在您的MoveOverTime协同器的末尾,只需设置moveRoutine = null;,然后您将确保如果需要另一个coroutine,将启动一个。或者,您也可以使用设置的布尔值来跟踪是否有协同线。同样的原则。
yield return null;。WaitForSeconds attackPause;
void Start()
{
attackPause = new WaitForSeconds(0.2f);
}然后,在您的协同线而不是yield return new WaitForSeconds(0.2f);中使用yield return attackPause;
https://stackoverflow.com/questions/70666352
复制相似问题