Перемещение по клику мыши.

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

Перемещение по клику мыши.

Сообщение nogard 05 май 2012, 20:27

Приветствую.

Только начал изучение движка и C#. Написал простой код на перемещение персонажа по клику мыши. Вроде все перемещается нормально. Но этот код не учитывает местонахождение объектов на пути. В связи с чем два вопроса:
1. Как учитывать "клики" только по определенному объекту (ландшафту или иной плоскости движения), игнорируя клики или отказ выдать координаты при пересечении луча с другим объектом на карте?
2. Какая может быть использована методика для обучения персонажа "обходить" препятствия при утыкании в них?

Приведу части кода которые есть на данный момент.

Переменные
Синтаксис:
Используется csharp
              public bool go=false;                             //Переменная для постоянного движения
        public Vector3 pos;                                             //Тут будет хранится точка назначения
        public Transform myTransform;                   //Тут хранится положение игрока
        public float speed = 2.0f;                              //Скорость перемещения
        public float FallSpeed = 10.0f;                 //Скорость падения
        public float RotateSpeed = 10.0f;               //Скорость поворота
        public Collider col;                                    //С этим объектом идет проверка пересечения
        public CharacterController _player;             //Переменная для сферы передвижения
        public float radiusNoClick = 0.01f;             //Радиус проверки достижения точки движения
        private Vector3 direction;                              //Вектор направления
        private RaycastHit hit;                                 //Информация о луче
 


Определяет координаты клика
Синтаксис:
Используется csharp

        public void Cordinate () {
               
                // Получаем направление луча
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

                // Кидаем луч бесконечной длинны и проверяем пересечение слоев
                            if (col.Raycast(ray, out hit, Mathf.Infinity)) {
               
                        pos = hit.point;  
                        go=true;                       
                }
        }

 



Собсно функция перемещения
Синтаксис:
Используется csharp
                if (go && pos != null) {
                        }
                        Debug.Log("Function Move");
                        if ((Mathf.Abs(myTransform.position.x - pos.x) >= radiusNoClick) && (Mathf.Abs(myTransform.position.z - pos.z) >= radiusNoClick))
                         {
                        // Вычисляем вектор перемещения
                         direction = pos - this.transform.position;
                        // Нормализуем, что бы персонаж смотрел не в землю, а прямо
                         direction = new Vector3(direction.x, 0, direction.z);
                         direction.Normalize();
                       
                        //Debug.DrawLine (pos, myTransform.position, Color.yellow);
                        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(direction), RotateSpeed*Time.deltaTime);
                        _player.Move(direction * Time.deltaTime * speed);
                }
                else {
                        Debug.Log ("Raven");
                        go=false;}
                }
 
nogard
UNец
 
Сообщения: 8
Зарегистрирован: 03 май 2012, 12:03

Re: Перемещение по клику мыши.

Сообщение seaman 05 май 2012, 21:49

Как учитывать "клики" только по определенному объекту

Анализировать hit. Он содержит очень много сведений об объекте, в который стукнулся луч.
"обходить" препятствия

Pathfinding. Алгоритмов море.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Перемещение по клику мыши.

Сообщение nogard 05 май 2012, 22:19

seaman писал(а):Анализировать hit. Он содержит очень много сведений об объекте, в который стукнулся луч.


Судя по тому что я нашел в оффлайн Wiki по запросу RaycastHit не так уж много, и из тех что есть подходит как мне кажется только collider. Однако в лог выводится при любом клике, в том числе и по кубу на ландшафте. У куба есть коллайдер стандартный боксовский.

Синтаксис:
Используется csharp
if (hit.collider == col) {
Debug.Log ("Verno");
}
 


Тыркаюсь не в том направлении? Необходимо искать другие сведения об объекте? Ведь теоретически, как я понимаю, еще во время "прокладки" луча учитывается именно пересечение с "землей"

Синтаксис:
Используется csharp
 if (col.Raycast(ray, out hit, Mathf.Infinity))
nogard
UNец
 
Сообщения: 8
Зарегистрирован: 03 май 2012, 12:03

Re: Перемещение по клику мыши.

Сообщение seaman 05 май 2012, 22:27

оффлайн Wiki

Это что?- мануал?
По делу - копайте дальше. Что содержит collider? А содержит он и имя и тег объекта, в который стукнулся луч!
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Перемещение по клику мыши.

Сообщение nogard 05 май 2012, 22:41

seaman писал(а):Это что?- мануал?
По делу - копайте дальше. Что содержит collider? А содержит он и имя и тег объекта, в который стукнулся луч!


Да, под оффлайн Wiki я имел ввиду Help->Scripting Reference

Я пробовал и тег и имя проверять, эффект тот же. В логе выводится обе надписи. Что по кубу, что по "левому" импортированому модельке-префабу с боксовским коллайдером. Тег ландшафту назначал.


Синтаксис:
Используется csharp
if (hit.collider.tag == "Zemlya") {
Debug.Log ("VernoTag");
}
if (hit.collider.name == "Terrain") {
Debug.Log ("VernoName");
}
 


Быть может есть ошибка в функции пускания луча? К примеру делать не пересечение с именно террейном, а вообще с чем-нибудь, и потом уже проверять тег\имя с чем пересеклось? Если такой вариант более правильный, то приведите, пожалуйста, сразу пример (там вроде всего 1-2 строки тоже получится).
nogard
UNец
 
Сообщения: 8
Зарегистрирован: 03 май 2012, 12:03

Re: Перемещение по клику мыши.

Сообщение Левш@ 05 май 2012, 22:45

не пересечение с именно террейном, а вообще с чем-нибудь

Так и нужно.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Перемещение по клику мыши.

Сообщение nogard 05 май 2012, 22:59

Левш@ писал(а):Так и нужно.


Попробовал сделать луч по другому алгоритму. Так:

Синтаксис:
Используется csharp
Physics.Raycast(ray, out hit, Mathf.Infinity, mask)

//В mask засунул "Default" слой, кубу присвоил "Water".
 


Проверки по тегу и имени (парой постов выше) -> результата нет. =) Не тот алгоритм?
nogard
UNец
 
Сообщения: 8
Зарегистрирован: 03 май 2012, 12:03

Re: Перемещение по клику мыши.

Сообщение nogard 05 май 2012, 23:26

Вроде разобрался. Немного не так применял алгоритм Raycast. Изменил. По первому впечатлению все работает. Всем спасибо.
nogard
UNец
 
Сообщения: 8
Зарегистрирован: 03 май 2012, 12:03

Re: Перемещение по клику мыши.

Сообщение Syberex 06 май 2012, 03:01

Неправильное сравнение строк, надо так:
Синтаксис:
Используется csharp
if (hit.collider.CompareTag("Zemlya")) {
 Debug.Log ("VernoTag");
}
if (hit.collider.name.Equals("Terrain")) {
 Debug.Log ("VernoName");
}
 
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Перемещение по клику мыши.

Сообщение waruiyume 06 май 2012, 03:26

Почему неправильно, в чём разница?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Перемещение по клику мыши.

Сообщение nogard 06 май 2012, 08:20

Пока остановился на таком варианте. Работает вроде бы как надо.

Синтаксис:
Используется csharp
if (Physics.Raycast (ray, out hit)) {
                                if (hit.collider == col) {
                                pos = hit.point;
                                go=true;
                        }
                               
                }
 


Теперь вопрос в другом: Взял с сети модельку человека, с bip-анимациями отдельно. Когда делал экспорт-импорт в формат FBX с одним привязаным bip-ом , то анимация была (PlayAutomatic для проверки делал). Взял Mixer (3D Max 2012) и в нем поставил несколько bip-ов анимации один-за-другим через 5 кадров. TimeLine тоже выставил на необходимую длину, учитывающую все анимации. Однако после импортирования в Unity, модель не реагирует на анимации. То есть когда допустим анимация "безделье" она просто стоит столбом и шатается, вроде бы воспроизводя анимацию, но без телодвижений. При импорте указывал все анимации с раскадровкой (в самом движке см.картинку во вложении). В чем может быть проблема?
Проблема исчезла сама собой непостижимым образом! :-?


Да, и еще вот назначил я для перемещения анимацию ходьбы. Сама анимация не воспроизводится пока что (см. текст выше), однако при перемещении моделька начинает совершать скачки назад. Т.е. переместилась на n-метров и дернулась на несколько метров назад, затем продолжает движение к точке назначения. И так по 2-3 раза за маршрут (короткий, на длинных наверное больше, не тестил =) ) Решено!
У вас нет доступа для просмотра вложений в этом сообщении.
nogard
UNец
 
Сообщения: 8
Зарегистрирован: 03 май 2012, 12:03

Re: Перемещение по клику мыши.

Сообщение Левш@ 06 май 2012, 11:35

Mixer (3D Max 2012)

Не знаю что за миксер... я работаю с 2009.
Я монтирую трек анимации из loadAnimation:

Изображение

И все работает.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Перемещение по клику мыши.

Сообщение Syberex 06 май 2012, 15:38

Сотри, я не прав :-s ... Оказалось в шарпе операторы == и ¡= сравнивают строки по значению :-) (а я думал что как в java)...
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт


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

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

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