Страница 1 из 2

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

СообщениеДобавлено: 03 фев 2010, 21:07
Satan
Я прошел 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)

Для начала хватит. Моя цель не получить готовый скрипт, а понять как все работает, буду очень признателен, если к своим скриптам будете писать обьяснение. Спасибо

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

СообщениеДобавлено: 03 фев 2010, 21:36
AndrewSt
1.(Стены).
при импорте уровня поставь галку генерировать meshCollider.
Или для каждой меши добави компонент meshCollider вручную
2. Посмотри как сделан стандартный префарб First Person Controller там как раз и гравитация работает и небольшие неровности переступает за счет использования Capsule Collider.

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

СообщениеДобавлено: 04 фев 2010, 15:45
3Dragon
-Заставить его упираться в стены ,а не проходить сквозь них.
В юнити есть возможность при экспорте модели поставить галку 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. Читайте внимательнее.

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

СообщениеДобавлено: 04 фев 2010, 20:45
Satan
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 не дает обьекту пройти сквозь стену и еще как работает четвертая строка вышеуказанного скрипта*

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

СообщениеДобавлено: 04 фев 2010, 21:08
3Dragon
http://unity3d.com/support/documentatio ... oller.html
Справку еще не забывайте почитывать.

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

СообщениеДобавлено: 04 фев 2010, 21:20
Zaicheg
Satan писал(а):Прошу разбирающехся людей поведать мне...что же в FPSWalker'e не дает обьекту пройти сквозь стену

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

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

Вот тут могу ошибиться, так как синтаксис мне непонятен, но примерно так:
если CharacterController.Move имеет значение CollisionFlags.Below, то grounded = true;
То есть, определяется наличие коллизии CharacterController снизу.

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

СообщениеДобавлено: 04 фев 2010, 22:02
Satan
3Dragon
Спасибо, сяду почитаю! И не думал там искать...всетаки я тупица)

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

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

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

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

Ой, чуть не забыл поблагодарить,за обьяснение Определения нижней колизии.Спасибо B-)

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

СообщениеДобавлено: 04 фев 2010, 22:41
Zaicheg
Zaicheg
Зря) Полностью скопированный код FPSWalker и вставленный вместо моего - заставляет Lerpz'a тыкаться в стены, а не проходить сквозь них.

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

Насколько я это понимаю, да.

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

СообщениеДобавлено: 04 фев 2010, 23:06
Satan
Zaicheg
Ну в передвижении мы разобрались, я просто и выставил на показ свой недоКОД*, чтоб мне указали сразу на мои огрехи. Ну никто меня в это не тыкнул носом, я и подумал,что пока в коде все верно.

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

СообщениеДобавлено: 04 фев 2010, 23:47
3Dragon
Для перемещений объекта лучше использовать transform.position имхо.

что-нибудь типа:
Код: Выделить всё
function Update () {
var xMoving = Input.GetAxis ("Vertical");
vat yMoving = Input.GetAxis ("Horizontal");
transform.position += Vector3(yMoving, 0, xMoving);
}

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

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

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

Кстати, с объяснением строки из fpswalker я ошибся. В ней ещё и перемещение задаётся. Я честно не вкуриваю синтаксис и взаимодействие типов. Может кто-то более опытный объяснит.

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

СообщениеДобавлено: 05 фев 2010, 01:53
gnoblin
Никакой разницы как двигать - через position или Translate :p

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

СообщениеДобавлено: 05 фев 2010, 01:58
3Dragon
Уговорили B-)

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

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

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

Насколько понимаю,способов столкнуться со стеной ,а не пройти множество - было бы интересно послушать если есть и другие. Хочу изначально на вооружении иметь несколько.*

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

СообщениеДобавлено: 05 фев 2010, 02:29
warr11r
Например, если тригер вашего коллайдера вошел в коллизию со стеной, то ГО отодвигается назад, пока коллизия не вернет false.