Как подъехать к объекту с разных сторон?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как подъехать к объекту с разных сторон?

Сообщение alebaster 10 ноя 2011, 22:39

Здравствуйте.
Пишу двух роботов, которые будут в ближнем бою друг друга "бороть" (Robot Wars помните?). Написал скрипт подъезда друг к другу: находим противника
Синтаксис:
Используется csharp
FindGameObjectWithTag
, поворачиваемся к нему
Синтаксис:
Используется csharp
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
                                                        Quaternion.LookRotation(target.position - myTransform.position),
                                                        rotationSpeed*Time.deltaTime);
и потом
Синтаксис:
Используется csharp
myTransform.position += myTransform.forward*moveSpeed*Time.deltaTime;


То есть робот тупо едет напролом к противнику.

И вот, собственно, вопрос: у робота оружие с двух противоположных сторон, каким образом ему
1) подъехать другой стороной. Подозреваю. что все решается одним минусом, но с кватернионами не получается дружить.
2) как подъехать с выбранной стороны? Как вообще определить где какая сторона у робота?
Последний раз редактировалось alebaster 22 ноя 2011, 21:17, всего редактировалось 5 раз(а).
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Как подъехать к объекту с разных сторон + анимация

Сообщение Левш@ 11 ноя 2011, 12:15

И еще вопрос появился: куда пихать анимацию удара? Если в Update() - то, логично, она не прекращается.

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

Re: Как подъехать к объекту с разных сторон + анимация

Сообщение alebaster 11 ноя 2011, 16:22

Конечно не судьба, она все равно останавливается на один фрейм. Решил вопрос ифами, просто думал есть какое-то более стандартное решение.

И еще вопрос появился: как повернуть объект только по двум координатам? А то у меня роботы взлетают, т.е. сделать поворот только влево-вправо, без вниз-вверх.
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Как подъехать к объекту с разных сторон + анимация

Сообщение Левш@ 11 ноя 2011, 17:41

все равно останавливается на один фрейм.

Можно дождаться пока она закончиться:
Синтаксис:
Используется javascript
yield WaitForSeconds (animation.clip.length);


И еще вопрос появился: как повернуть объект только по двум координатам?

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

Re: Как подъехать к объекту с разных сторон + анимация

Сообщение alebaster 11 ноя 2011, 19:33

transform.RotateAround (Vector3.up, rotSpeed * Time.deltaTime);


Почему это - ахинея?
Синтаксис:
Используется csharp
public class robot1AI : MonoBehaviour {
       
        public Transform target; //цель
        public int moveSpeed;  //скорость перемещения
        public int rotationSpeed;  //скорость поворота
       
        private Transform myTransform;  
       
        void Awake(){
                myTransform = transform;
        }
        // Use this for initialization
        void Start () {
        }
        // Update is called once per frame
        void Update () {
                GameObject tg = GameObject.FindGameObjectWithTag("robot2");
                target = tg.transform;
                Debug.Log(target.position);
                //рисуем линию(для красоты)
                Debug.DrawLine(target.position,myTransform.position,Color.yellow);
               
                Vector3 fixedTargetPosition = new Vector3(target.position.x, myTransform.position.y, target.position.z);
                transform.RotateAround (fixedTargetPosition, rotationSpeed * Time.deltaTime);
               
                float dist = Vector3.Distance(myTransform.position, target.position);
                Debug.Log(dist);
                if(dist <=60) return;
               
                myTransform.position += myTransform.forward*moveSpeed*Time.deltaTime;
                //myTransform.transform.Translate(fixedTargetPosition*moveSpeed*Time.deltaTime);
        }
}

 


Почему он вообще не поворачивается? И какого черта при перемещении через
Синтаксис:
Используется csharp
myTransform.transform.Translate(fixedTargetPosition*moveSpeed*Time.deltaTime);

он меньше чем за секунду телепортируется черт знает куда за пределы видимости?

UPD. Черт с ним с разворотом, разобрался, опять через кватернионы. (Но тем не менее очень интересна неработоспособность второго вида перемещения(более логичного и очевидного) и поворота). Теперь совсем идиотская проблема. Стоят и у одного и у другого бокс коллайдеры(галочка про гравитацию стоит), после столкновения (один подбрасывает другого) гравитации словно нет, левитируют себе потихоньку и не собираются возвращаться на землю. Почему?
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Почему на импортированную модель не действует rigidbody?

Сообщение alebaster 13 ноя 2011, 12:20

Внезапно обнаружил, что на импортированные модели роботов тупо не действует rigidbody. Почему?! Можно конечно создать пустой объект и поместить в него модель, но тогда модель и этот gameobject имеют разные координаты, что вообще выходит за рамки моего представления о разумном.

И как сделать нормальную гравитацию? Смотрб уроки - объекты падают быстро и уверенно, у меня же как в замедленном действии.
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Почему на импортированную модель не действует rigidbody?

Сообщение seaman 13 ноя 2011, 12:47

Почему это - ахинея?

Этого не понял.
Почему он вообще не поворачивается?

Поворачиваться должен. Только зачем Вы его поворачиваете вокруг направления на цель? Вам же четко написали, что надо поворачивать вокруг направления вверх.
какого черта при перемещении через

Вы справку по этому методу читали? Там написано, что перемещение происходит на указанное расстояние. Какое у Вас расстояние? Длина вектора fixedTargetPosition на скорость, на время. Какая длина вектора? Это расстояние до цели,- т.е. очень большая. Естественно он улетает. Нормализуйте вектор.
левитируют себе потихоньку

Одно из двух. Или Вы используете физику, или сами меняете позицию. Вы делаете второе:
myTransform.position +=...
Тогда с чего Вы взяли, что они должны падать?
Двигайте объекты прикладывая силу.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему на импортированную модель не действует rigidbody?

Сообщение alebaster 13 ноя 2011, 14:38

Спасибо, теперь насчет rigidbody стало ясно. И с силой вроде ясно. Но насчет поворота - нет. Этот метод крутит его... и крутит. Остановить-то как?) Нагромождать условия, высчитывать углы?
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Разные вопросы

Сообщение seaman 13 ноя 2011, 15:50

Куда он должен смотреть? НА цель? Сравнивайте fransform.forward с направлением на цель, и если != крутите. Углы высчитывать не надо.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Разные вопросы

Сообщение alebaster 13 ноя 2011, 17:36

seaman писал(а):Куда он должен смотреть? НА цель? Сравнивайте fransform.forward с направлением на цель, и если != крутите. Углы высчитывать не надо.

Простите за тупой вопрос, но как узнать направление на цель?
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Разные вопросы

Сообщение seaman 13 ноя 2011, 17:47

Как-то не стыкуется это:
но как узнать направление на цель

с этим (в первом посте):
поворачиваемся к нему

Получается, что 10 ноября Вы знали как узнать направление на цель, а сегодня не знаете.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Разные вопросы

Сообщение Левш@ 13 ноя 2011, 17:59

Этот метод крутит его... и крутит. Остановить-то как?)

Oбнулить значение rotSpeed

Простите за тупой вопрос, но как узнать направление на цель?

Тогда проще, сам будет наводиться на цель:

Синтаксис:
Используется javascript
var direction = target.position - transform.position;
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotateSpeed * Time.deltaTime);
transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
 


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

Re: Разные вопросы

Сообщение alebaster 13 ноя 2011, 18:16

seaman писал(а):Как-то не стыкуется это:
но как узнать направление на цель

с этим (в первом посте):
поворачиваемся к нему

Получается, что 10 ноября Вы знали как узнать направление на цель, а сегодня не знаете.


Как я сравню вектор3 и кватернион? Или я опять все не так понял?

Левш@ писал(а):
Этот метод крутит его... и крутит. Остановить-то как?)

Oбнулить значение rotSpeed

Простите за тупой вопрос, но как узнать направление на цель?

Тогда проще, сам будет наводиться на цель:

Синтаксис:
Используется javascript
var direction = target.position - transform.position;
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotateSpeed * Time.deltaTime);
transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
 


Где:
target = трансформ вашей цели.
rotateSpeed = скорость вращения.


Спасибо),
Последний раз редактировалось alebaster 13 ноя 2011, 18:32, всего редактировалось 1 раз.
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Разные вопросы

Сообщение seaman 13 ноя 2011, 18:30

Специально для Вас в предыдущем посте Левша выделил отдельной строкой направление. Вы это делали еще в первом посте, только внутри выражения. Отсюда вывод - Вы не понимаете что делаете. Думайте, учитесь.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Разные вопросы

Сообщение alebaster 13 ноя 2011, 18:34

seaman писал(а):Специально для Вас в предыдущем посте Левша выделил отдельной строкой направление. Вы это делали еще в первом посте, только внутри выражения. Отсюда вывод - Вы не понимаете что делаете. Думайте, учитесь.


Чтобы думать и учиться я сюда и пишу.
Вы про: target.position - myTransform.position ?
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

След.

Вернуться в Почемучка

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

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 14