Вообщем, у меня есть скрипт 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");
}
а по делу.
вы знаете что делает у вас кусок (и такой же для 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; ))
в итоге чуток обгоняет. начинает двигаться обратно. отстает - снова начинает обгонять.
как решение можете ввести минимальное расстояние, на котором считается что уже "догнал" и перестать преследовать.
pos.x += Mathf.Sign(direction_x) * speedMove * Time.deltaTime;
не сильно понял, что это, но это что-то вроде передвижения enemy за player''ом,
но if (Mathf.Abs(direction_x) < maxDis && Mathf.Abs(direction_y) < maxDis) это проверка на то, если player в "зоне видимости" enemy, то enemy его начинает преследовать.
Как решение можете ввести минимальное расстояние, на котором считается что уже "догнал" и перестать преследовать.
Сейчас попробую.
if(Mathf.Abs(direction_x) == minDis && Mathf.Abs(direction_y) == minDis)
{
speedMove = 0f;
}
Это типо вот так надо было реализовать?
Но это вообщем не сработало.
Help me! Dude!
"как только player.transform.position.x равен enemy.ransform.position.x , enemy начинает трястись"
как это не в зависимости от догнал или нет. вы же сами именно так написали.
и нет с приравниванием минимальному не верно. когда это флоатовское значение может так вот ровно стать заданному??
3.12333 != 3.12334
меньше минимального. дистанция между игроком и врагом меньше минимальной (условно меньше чем пол метра) - перестаем догонять, начинаем атаковать игрока.
само "перестаем догонять" как вы оформите - это дело уже за вами. простите - но учитесь. разбирайте. отлаживайте. по простому не выйдет)) по крайней мере не со мной. я за обучение через страдания и старания))
GavriKos, так то верно, но тут это чуть ли не минимальная беда, мало на что влияющая))
разве что на немного странную скорость, не в "метрах в секунду" скажем так.
до этого мы еще дойдем, если человек поймет где у него принципиально в логике косяк)
Denis Gaydak,
"как только player.transform.position.x равен enemy.ransform.position.x , enemy начинает трястись"
как это не в зависимости от догнал или нет. вы же сами именно так написали.
Denis Gaydak, само "перестаем догонять" как вы оформите - это дело уже за вами. простите - но учитесь. разбирайте. отлаживайте. по простому не выйдет)) по крайней мере не со мной. я за обучение через страдания и старания))
ne_Sci_fi, не за что. надеюсь суть уловили. и условия сможете прописать. чтоб не дожидалось выравнивания с целью по координатам.
а прекращало движение.
и еще я предложил наверно использовать не отдельно направление по X и Y
а на Vector2 переписать
ну или не полностью прекращать преследование, а разделить.
если сравнялось по вертикали - то прекращать по вертикали движение. продолжая приближаться по горизонтали)
черт надеюсь не запутал. а все же пояснил где именно проблема и выпоняли.
удачи в разруливании))
а то сейчас вы делая
speedMove = 0.
останавливаете полностью преследование.
а надо только одну из составляющих.)) та что уже сравнялась с целью (игроком)
+ надо как то потом вернуть скорость. а то догнав разок - перестанет в будущем преследовать)
в общем много чего в голове надо держать)) крепитесь.
Denis Gaydak, спасибо, за обьяснение, но я понял по этому
и еще я предложил наверно использовать не отдельно направление по X и Y
а на Vector2 переписать
ну или не полностью прекращать преследование, а разделить.
если сравнялось по вертикали - то прекращать по вертикали движение. продолжая приближаться по горизонтали)
черт надеюсь не запутал. а все же пояснил где именно проблема и выпоняли.
удачи в разруливании))
я вполне разбираюсь, что к чему, но иногда очень туплю и говнокодю)