Вызов MoveTowards
один раз перемещает игровой объект только один раз во время этой итерации игрового цикла.Вызов MoveTowards
один раз не перемещает игровой объект до цели (если параметр maxDistanceDelta
не достаточно велик, чтобы переместить игровой объект к цели за одну итерацию).
Если боссмгновенно появляется у цели, я предполагаю, что ваш chargeSpeed
слишком большой.
То, что вы хотите сделать, это звонить MoveTowards
один раз за цикл Update
.Однако, как вы делаете свою сопрограмму, сопрограмма будет перемещать игровой объект только один раз и затем выходить.Обычно сопрограммы имеют внутри себя цикл (в противном случае сопрограмма выйдет после запуска один раз).Примерно так:
IEnumerator TankCharge()
{
while (Vector3.Distance(transform.position, chargeTarget.position) > Mathf.Epsilon)
{
// Adjust this so this game object doesn't move the entire
// distance in one iteration
float distanceToMove = Time.deltaTime * chargeSpeed;
transform.position = Vector3.MoveTowards(transform.position, chargeTarget.position, distanceToMove)
yield return null;
}
}
Однако для вашей ситуации вам не нужен сопрограмма.Вы можете просто сделать это прямо в Update()
private bool returnToStart = false;
private float timer;
void Update
{
float distanceToMove = Time.deltaTime * chargeSpeed;
if (timer <= 0)
{
if (!returnToStart)
{
transform.position = Vector3.MoveTowards(transform.position, chargeTarget.position, distanceToMove)
// Target reached? If so, start moving back to the original position
if (Vector3.Distance(transform.position, chargeTarget.position) <= Mathf.Epsilon)
{
returnToStart = true;
this.timer = this.chargeRate;
}
}
else
{
transform.position = Vector3.MoveTowards(transform.position, tankStartPosition.position, distanceToMove)
// Original position reached? If so, start moving to the target
if (Vector3.Distance(transform.position, tankStartPosition.position) <= Mathf.Epsilon)
{
returnToStart = false;
this.timer = this.chargeRate;
}
}
}
else
{
this.timer -= Time.time;
}
}