Физика модели (управление от третьего лица)

Физика в Unity

Физика модели (управление от третьего лица)

Сообщение Satan 03 фев 2010, 21:07

Я прошел 3D Platformer Tutorial (какой же я маладец)! Минус его в том, что грубо говоря тебе дается конструктор и инструкция по сборке...и на мол лепи игру. Я решил создать свой 3д уровень и заставить моего Lerpz'a (модель из туториала) бегать и прыгать как Lerpz из урока. Пробежался по скриптам из туториала и понял, что очень много лишнего там, а если оно и не лишнее , то очень трудно просечь откуда корни растут. Решил заскриптовать с нуля.

Итак ,что мы имеем на сегодняшний день :
-3D уровень собранный в Cinema4d(спасибо базовым урокам Will'а Goldstone'а)
-Модель Lerpza(без изменений выдранная из туториала).
-Character Controller привязанный к Lerpz'у
-Cобственный скрипт привязанный к Lerpz'у ... выглядит так :
Код: Выделить всё
var gravity = 20.0;
var speed = 20.0;

function Update () {
   var x = Input.GetAxis("Horizontal") *Time.deltaTime *100;
   var z = Input.GetAxis("Vertical") * Time.deltaTime * speed;
   transform.Translate(0, 0, z);
   transform.Rotate(0,x,0);
}


Что это мне дает :
Мой персонаж поворачиваеться вокруг оси Y если нажимать влево-вправо. А если жать вперед назад то он перемещаеться вперед-назад.Проблема в том,что он всячески игнорирует уровень как Мэш: проходит сквозь стены, да и не падает на пол (я поставил его где то в метре над землей)

Задача :
-Заставить его упираться в стены ,а не проходить сквозь них.
-Присобачить гравитацию, чтоб стремился к земле.
-Научить перешагивать небольшие ступеньки(мой уровень немного кривоват, в некоторых местах неплохо бы чтоб он перешагивал обьекты скажем высотой в 0.1)

Для начала хватит. Моя цель не получить готовый скрипт, а понять как все работает, буду очень признателен, если к своим скриптам будете писать обьяснение. Спасибо
My name is Legion : For we are many
Аватара пользователя
Satan
UNец
 
Сообщения: 15
Зарегистрирован: 21 янв 2010, 22:52
Откуда: Молдова,Кишинёв

Re: Физика модели (управление от третьего лица)

Сообщение AndrewSt 03 фев 2010, 21:36

1.(Стены).
при импорте уровня поставь галку генерировать meshCollider.
Или для каждой меши добави компонент meshCollider вручную
2. Посмотри как сделан стандартный префарб First Person Controller там как раз и гравитация работает и небольшие неровности переступает за счет использования Capsule Collider.
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Физика модели (управление от третьего лица)

Сообщение 3Dragon 04 фев 2010, 15:45

-Заставить его упираться в стены ,а не проходить сквозь них.
В юнити есть возможность при экспорте модели поставить галку generate colliders, другой вариант:
Component -> Physics -> Mesh Collider.
Но персонаж все равно будет проваливаться, если ему так же не назначен коллайдер.

-Присобачить гравитацию, чтоб стремился к земле.
Один из вариантов описывается в FPS tutorial, скрипт FPSwalker из Standart Assets.
Код: Выделить всё
var gravity = 20.0;
if (Input.GetButton ("Jump")) {
   moveDirection.y = jumpSpeed;
   }
// Apply gravity
moveDirection.y -= gravity * Time.deltaTime;


Другой вариант - назначить персонажу RigidBody с запретом вращения и воздействовать на него физикой.

-Научить перешагивать небольшие ступеньки(мой уровень немного кривоват, в некоторых местах неплохо бы чтоб он перешагивал обьекты скажем высотой в 0.1)
Когда персонажу назначается capsule collider, он автоматически перешагивает невысокие ступени и поднимается по лестнице. Связано это с особенностью формы коллайдера.

Ответы на все ваши вопросы, кстати, есть в FPS tutorial и Platformer tutorial. Читайте внимательнее.
Глаза боятся, а руки - крюки.
3Dragon
UNIт
 
Сообщения: 61
Зарегистрирован: 25 ноя 2009, 21:50
Откуда: Санкт-Петербург
  • ICQ

Re: Физика модели (управление от третьего лица)

Сообщение Satan 04 фев 2010, 20:45

AndrewSt
1. Это было сделанно. Я перед тем как начать играться с моделью ...я опробовал свой уровень на FPS префабе. Все работает замечательно. Проблема не в уровне, проблема в персонаже ,скриптах, физике, гравитации и прочем.
2. Второй совет оказался куда более дельным, хотя я до этого уже пытался смотреть скрипты из 3дПлатформера и это привело к тому, что я не нашел корней (одна функция использует другую, которая в свою очередь использует переменную, которая используется в другом скрипте...это примерная зарисовка). Я потому и начал с нуля писать ,чтобы понимать откуда что куда идет и как это все взаимосвязанно.

Итак :
Я разобрался каким кодом опустить инопланетянина на землю.

Код: Выделить всё
moveDirection.y -= gravity * Time.deltaTime; //1
   
      // Move the controller
   var controller : CharacterController = GetComponent(CharacterController); //2
   var flags = controller.Move(moveDirection * Time.deltaTime); //3
   grounded = (flags & CollisionFlags.CollidedBelow) != 0; //4


private var moveDirection = Vector3.zero;
private var grounded : boolean = false;

Только я вот понять не могу этот код.
в 1ой строке мы задаем направление - уменьшая значение Y. Другими словами падаем со скоростью указанной в значении gravity.
во 2ой строке мы создаем переменную и привязываем ее к компоненту CharacterController (внутренность самого компонента для меня до сих пор загадка)
в 3ей строке мы задаем переменую flags равную текущему передвижению компонента CharacterController'а.
в 4ой ??? эту строку я целиком не понимаю, обьясните кто разобрался. *

3Dragon
Все коллайдеры в норме. Префаб FPS спокойно ходит как надо по уровню.

Сам по себе MoveDirection.y не заставит меня под гравитацией падать вниз и остановится когда достигну пола.

Ответы на все ваши вопросы, кстати, есть в FPS tutorial и Platformer tutorial. Читайте внимательнее.

Ответов кстати нет - не в первом не во втором! Там тупо готовые скрипты без разбора. И советы типа перетащите скрипт на префаб и тд. Спасибо,перетаскивать скрипты я научился, сейчас хочу понять как их самому писать.


Ребят,я конечно начинающий, но я не полный тупица ;) Сейчас для теста я добавил одновременно и FPS префаб и Lerpza на сцену...и то и то обладает CharacterController'ом.Едиственное различие, это у Префаба FPS скрипты MouseLook(сомневаюсь,что в нем может быть что то) и FPSWalker ,а у моего Lerpz'a - LerpzController скрипт.
Тоесть ответ прячеться где то в FPSWalker'е - ответ на то,почему инопланетянин проходит сквозь стены. Ну а теперь ,когда я свел круг поиска к минимуму...Прошу разбирающехся людей поведать мне...что же в FPSWalker'e не дает обьекту пройти сквозь стену и еще как работает четвертая строка вышеуказанного скрипта*
My name is Legion : For we are many
Аватара пользователя
Satan
UNец
 
Сообщения: 15
Зарегистрирован: 21 янв 2010, 22:52
Откуда: Молдова,Кишинёв

Re: Физика модели (управление от третьего лица)

Сообщение 3Dragon 04 фев 2010, 21:08

http://unity3d.com/support/documentatio ... oller.html
Справку еще не забывайте почитывать.
Глаза боятся, а руки - крюки.
3Dragon
UNIт
 
Сообщения: 61
Зарегистрирован: 25 ноя 2009, 21:50
Откуда: Санкт-Петербург
  • ICQ

Re: Физика модели (управление от третьего лица)

Сообщение Zaicheg 04 фев 2010, 21:20

Satan писал(а):Прошу разбирающехся людей поведать мне...что же в FPSWalker'e не дает обьекту пройти сквозь стену

Ничего. Я гарантирую.

как работает четвертая строка вышеуказанного скрипта*

Вот тут могу ошибиться, так как синтаксис мне непонятен, но примерно так:
если CharacterController.Move имеет значение CollisionFlags.Below, то grounded = true;
То есть, определяется наличие коллизии CharacterController снизу.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Физика модели (управление от третьего лица)

Сообщение Satan 04 фев 2010, 22:02

3Dragon
Спасибо, сяду почитаю! И не думал там искать...всетаки я тупица)

Zaicheg
Зря) Полностью скопированный код FPSWalker и вставленный вместо моего - заставляет Lerpz'a тыкаться в стены, а не проходить сквозь них.

Код: Выделить всё
      moveDirection = new Vector3(0, 0, Input.GetAxis("Vertical"));
      moveDirection = transform.TransformDirection(moveDirection);
      moveDirection *= speed;

Это заставляет контролер двигаться по заданному вектору.

Что же тогда делает transform.Translate() ? Получаеться он не толкает обьект, а каждый фрейм перемещает его, на заданную величину. Так чтоли?

Ой, чуть не забыл поблагодарить,за обьяснение Определения нижней колизии.Спасибо B-)
My name is Legion : For we are many
Аватара пользователя
Satan
UNец
 
Сообщения: 15
Зарегистрирован: 21 янв 2010, 22:52
Откуда: Молдова,Кишинёв

Re: Физика модели (управление от третьего лица)

Сообщение Zaicheg 04 фев 2010, 22:41

Zaicheg
Зря) Полностью скопированный код FPSWalker и вставленный вместо моего - заставляет Lerpz'a тыкаться в стены, а не проходить сквозь них.

Не зря. Значит, ваш код заставлял Лерпца проходить сквозь стены.
Насколько я успел понять, вы задаёте перемещение через Translate(). Нет ничего удивительного, что он проходит через коллайдеры.
Что же тогда делает transform.Translate() ? Получаеться он не толкает обьект, а каждый фрейм перемещает его, на заданную величину. Так чтоли?

Насколько я это понимаю, да.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Физика модели (управление от третьего лица)

Сообщение Satan 04 фев 2010, 23:06

Zaicheg
Ну в передвижении мы разобрались, я просто и выставил на показ свой недоКОД*, чтоб мне указали сразу на мои огрехи. Ну никто меня в это не тыкнул носом, я и подумал,что пока в коде все верно.
My name is Legion : For we are many
Аватара пользователя
Satan
UNец
 
Сообщения: 15
Зарегистрирован: 21 янв 2010, 22:52
Откуда: Молдова,Кишинёв

Re: Физика модели (управление от третьего лица)

Сообщение 3Dragon 04 фев 2010, 23:47

Для перемещений объекта лучше использовать transform.position имхо.

что-нибудь типа:
Код: Выделить всё
function Update () {
var xMoving = Input.GetAxis ("Vertical");
vat yMoving = Input.GetAxis ("Horizontal");
transform.position += Vector3(yMoving, 0, xMoving);
}
Глаза боятся, а руки - крюки.
3Dragon
UNIт
 
Сообщения: 61
Зарегистрирован: 25 ноя 2009, 21:50
Откуда: Санкт-Петербург
  • ICQ

Re: Физика модели (управление от третьего лица)

Сообщение Zaicheg 05 фев 2010, 01:19

3Dragon писал(а):Для перемещений объекта лучше использовать transform.position имхо.

Я, конечно, могу дико заблуждаться, но это ничем не отличается от использования transform.Translate()

Кстати, с объяснением строки из fpswalker я ошибся. В ней ещё и перемещение задаётся. Я честно не вкуриваю синтаксис и взаимодействие типов. Может кто-то более опытный объяснит.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Физика модели (управление от третьего лица)

Сообщение gnoblin 05 фев 2010, 01:53

Никакой разницы как двигать - через position или Translate :p
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Физика модели (управление от третьего лица)

Сообщение 3Dragon 05 фев 2010, 01:58

Уговорили B-)
Глаза боятся, а руки - крюки.
3Dragon
UNIт
 
Сообщения: 61
Зарегистрирован: 25 ноя 2009, 21:50
Откуда: Санкт-Петербург
  • ICQ

Re: Физика модели (управление от третьего лица)

Сообщение Satan 05 фев 2010, 02:09

gnoblin,3Dragon,Zaicheg
Ребят, лично сегодня проверил - Translate заставляет обьект оказаться в заданной точке.Если передвинуться на координату x=x+1, то системе всеравно есть там колайдер или нет. Она продвинет!
Судя по названию - position сделает тоже самое.Ведь если в режиме DesignTime прописать обьекту что он находится в стене, то он не начнет брыкаться,мол колизия и все дела.

Другое дело moveDirection, встроенная функция в CharacterController.Видимо она просчитывает расстояние до колизии и если впереди преграда,то продвигает ровно до нее.

Насколько понимаю,способов столкнуться со стеной ,а не пройти множество - было бы интересно послушать если есть и другие. Хочу изначально на вооружении иметь несколько.*
My name is Legion : For we are many
Аватара пользователя
Satan
UNец
 
Сообщения: 15
Зарегистрирован: 21 янв 2010, 22:52
Откуда: Молдова,Кишинёв

Re: Физика модели (управление от третьего лица)

Сообщение warr11r 05 фев 2010, 02:29

Например, если тригер вашего коллайдера вошел в коллизию со стеной, то ГО отодвигается назад, пока коллизия не вернет false.
Мудрость - это когда начинаешь понимать, что все время занимаешься какой-то х...ней.
Изображение
Аватара пользователя
warr11r
UNITрон
 
Сообщения: 310
Зарегистрирован: 06 июн 2009, 03:21
Откуда: Украина, Ровно
  • ICQ

След.

Вернуться в PhysX

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

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