Поворот в сторону игрока по оси Y

Программирование на Юнити.

Поворот в сторону игрока по оси Y

Сообщение ZamDmytro 27 июл 2017, 16:45

Здравствуйте!
Пишу ИИ врага (слайма) и появился вопрос.
Мне нужно, чтобы при приближении слайм начал смотреть в сторону персонажа.
Сделать это вроде как легко, transform.LookAt(player);
Но тут есть проблема - мне нужно чтобы поворачивалась только ось Y (т.е. направо-налево)
Лазил по форумах, но нигде не сказано про эту проблему. В свойствах rigidbody заморозка других осей не помогла.
Что делать?
Код:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AIScript : MonoBehaviour {

        public Transform player;
        public float distance;
        public int damage;
        public float speed;

        private Rigidbody rb;

        public void Start() {
                rb = transform.GetComponent<Rigidbody> ();
        }

        void AI_Jump(float JumpPower, float DirectionPower) {
                Vector3 temp = new Vector3 (DirectionPower, JumpPower, 0);
                rb.velocity = transform.forward + temp;
        }

        bool IntersectFloor() {
                return (Physics.Raycast (transform.position, Vector3.down, 2f));
        }

        private float timer_jump = 0f;
        void AI_JumpTime() {
                timer_jump += Time.deltaTime * 1f;
                if (timer_jump >= speed && IntersectFloor()) {
                        AI_Jump (10f, 3f);
                        if(!AI_PlayerDetected(player, distance))
                                transform.Rotate (new Vector3 (0, Random.Range (0, 360), 0));
                        timer_jump = 0f;
                }
        }

        bool AI_PlayerDetected(Transform player, float minDistance) {
                return (Vector3.Distance (player.position, transform.position) < minDistance);
        }

        void AI_MoveToPlayer() {
                if (AI_PlayerDetected (player, distance)) {
                        transform.LookAt (player);     
                }
        }

        public void Update() {
                AI_JumpTime ();
                AI_MoveToPlayer ();
        }
}

 
ZamDmytro
UNец
 
Сообщения: 26
Зарегистрирован: 31 май 2017, 16:46

Re: Поворот в сторону игрока по оси Y

Сообщение snezhok_13 27 июл 2017, 17:00

Вам нужно делать LookAt не на персонажа, а на точку Vec3(charPos.x, aiChar.y, charPos.z), например
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: Поворот в сторону игрока по оси Y

Сообщение ZamDmytro 27 июл 2017, 17:41

Есть другие способы? Потому что как по мне это совсем не решение проблемы т.к. достаточно совсем немного изменить координату этого объекта и весь ИИ крашится.
Плюс к тому же это я делаю к ассету. Заставлять пользователя создавать 20 empty чтобы всё нормально работало... Совсем не хочется.
ZamDmytro
UNец
 
Сообщения: 26
Зарегистрирован: 31 май 2017, 16:46

Re: Поворот в сторону игрока по оси Y

Сообщение ZamDmytro 27 июл 2017, 17:45

Сделал по вашему способу. Всё работает, но всё же хочется найти более оптимальное решение.
ZamDmytro
UNец
 
Сообщения: 26
Зарегистрирован: 31 май 2017, 16:46

Re: Поворот в сторону игрока по оси Y

Сообщение snezhok_13 27 июл 2017, 17:54

ZamDmytro писал(а):Есть другие способы? Потому что как по мне это совсем не решение проблемы т.к. достаточно совсем немного изменить координату этого объекта и весь ИИ крашится.
Плюс к тому же это я делаю к ассету.

Опасения про быдлокод, понимаю. Может вы не правильно поняли что я имел ввиду? Я имею ввиду "взять высоту AI персонажа и посмотреть в точку где стоит Character на этой высоте, тогда никаких лишних поворотов не случится".

ZamDmytro писал(а):Заставлять пользователя создавать 20 empty чтобы всё нормально работало... Совсем не хочется.

Не очень понимаю зачем что-то дополнительное создавать..
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: Поворот в сторону игрока по оси Y

Сообщение ZamDmytro 27 июл 2017, 20:10

Я так понял, что нужно сделать объект, который будет по y совпадать с ИИ, а по x и z совпадать с персонажем.
ZamDmytro
UNец
 
Сообщения: 26
Зарегистрирован: 31 май 2017, 16:46

Re: Поворот в сторону игрока по оси Y

Сообщение snezhok_13 28 июл 2017, 11:40

Да нет же, не нужно ничего создавать, нужно просто в LookAt эту позицию передавать, не нужно там создавать никакой дополнительный объект.

У LookAt есть перегруженная версия функции, которая принимает позицию первым параметром, а не трансформ.

Синтаксис:
Используется csharp
public void LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: Поворот в сторону игрока по оси Y

Сообщение vitalik77 13 апр 2022, 21:44

готовый вариант, на случай если кто искать будет, проверено рабочий. А то много вариантов видел, но большинство не работают как надо.
player - позиция куда надо повернуть и на что целимся
gameObject.transform.position позиция объекта который поворачиваем.
это все заталкивать в Update



Синтаксис:
Используется csharp
Vector3 tempDirection = (player.position - gameObject.transform.position).normalized;
        Quaternion tempLookRotation = Quaternion.LookRotation(new Vector3(tempDirection.x, 0.0f, tempDirection.z));
        transform.rotation = Quaternion.Lerp(gameObject.transform.rotation, tempLookRotation, Time.deltaTime * speedRotation);
vitalik77
UNIверсал
 
Сообщения: 434
Зарегистрирован: 06 май 2021, 09:56


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14