@ne_Sci_fi

Что делать что бы перестал трястись gameobject?

Вообщем, у меня есть скрипт enemy, с помощью которого enemy преследует plaer'а,
как только player.transform.position.x равен enemy.ransform.position.x , enemy начинает трястись верх и вниз, а когда player.transform.position.y равен enemy.ransform.position.y , то enemy трясется в влево и вправо. Вот мой скрипт:
public class Enemy : MonoBehaviour
{
GameObject player;
public float maxDis;
public float speedMove;
public bool isFacingRight;
byte h;
public Animator anim;

void Start()
{
player = GameObject.FindWithTag("Player");
}

void FixedUpdate()
{
Follow();
Povorot();
}
void Follow()
{
float direction_x = player.transform.position.x - transform.position.x;
float direction_y = player.transform.position.y - transform.position.y - 0.7f;

if (Mathf.Abs(direction_x) < maxDis && Mathf.Abs(direction_y) < maxDis)
{
Vector3 pos = transform.position;
pos.x += Mathf.Sign(direction_x) * speedMove * Time.deltaTime;
pos.y += Mathf.Sign(direction_y) * speedMove * Time.deltaTime;
transform.position = pos;
h = 1;
}
else
{
h = 0;
}
anim.SetFloat("Speed", Mathf.Abs(h));
}

void Povorot()
{
if(player.transform.position.x < transform.position.x && isFacingRight)
{
Flip();
}
else if(player.transform.position.x > transform.position.x && !isFacingRight)
{
Flip();
}
}
void Flip()
{
isFacingRight = !isFacingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
вы бы код оформили как код.

а по делу.
вы знаете что делает у вас кусок (и такой же для Y )
pos.x += Mathf.Sign(direction_x) * speedMove * Time.deltaTime; ??

а понимаете полностью суть проверки
if (Mathf.Abs(direction_x) < maxDis && Mathf.Abs(direction_y) < maxDis) ??

ну и главное , у вас как только "поровняются" объект и его цель -они не будут один в один совпадать координатами.
у вас значение direction_x и direction_y будет становиться то крохотным положительным, то крохотным отрицательным.
связанно это с тем что вы двигаете объект за целью, независимо от текущего между ними расстояния.
всегда, если не слишком далеко друг от друга - начинает преследование.
и как бы близко не подошел к цели движется со скоростью (условно то самое
pos.x += Mathf.Sign(direction_x) * speedMove * Time.deltaTime; ))

в итоге чуток обгоняет. начинает двигаться обратно. отстает - снова начинает обгонять.

как решение можете ввести минимальное расстояние, на котором считается что уже "догнал" и перестать преследовать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы