Реализация FPS контроллера для игры с поддержкой геймпада. - Форум Игроделов
Ср, 08 Май 2024, 13:03 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » ОБЩИЕ ВОПРОСЫ » Реализация FPS контроллера для игры с поддержкой геймпада.
Реализация FPS контроллера для игры с поддержкой геймпада.
freedomizeДата: Вт, 05 Апр 2016, 17:48 | Сообщение # 1
Нет аватара
 
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
Всем привет. Я хочу сделать шутер от первого лица типа первого дума в 3d. Из современных аналогов можно выделить игру Wrack.
Сейчас передо мной стоит задача создать контроллер персонажа. Есть 3 варианта:
1) Использовать стандартные контроллеры которые предоставляет Unity (Fps controller/ Rigidbody fps controller)
2) Написать свой контроллер персонажа.
3) Использовать контроллеры с ассетстора (UFPS/ Adwanced Shooter Kit итд.)

Как бы вы поступили на моем месте? Писали бы свое решение, использовали стандартный контроллер или взяли бы с ассетстора?

Какие могут быть подводные камни, учитывая то, что игра должна управляться как с клавиатуры, так и с геймпада (ps4/xbox) ?

Кстати, используя стандартный контроллер я столкнулся с багом, когда прикрутил к нему геймпад (если начать крутиться, то текстуры поверхности, по которой ходит персонаж как то очень странно рендерятся. Такое ощущение что они накладываются друг на друга. Для того чтобы вы представили что происходит если у вас нету геймпада - надо зажать клавишу стрейфа влево (A), непрерывно тянуть мышку вправо и смотреть вниз на поверхность по которой ходит персонаж. Это касается как обычного fps controller, так и rigidbody fps controller).
 
СообщениеВсем привет. Я хочу сделать шутер от первого лица типа первого дума в 3d. Из современных аналогов можно выделить игру Wrack.
Сейчас передо мной стоит задача создать контроллер персонажа. Есть 3 варианта:
1) Использовать стандартные контроллеры которые предоставляет Unity (Fps controller/ Rigidbody fps controller)
2) Написать свой контроллер персонажа.
3) Использовать контроллеры с ассетстора (UFPS/ Adwanced Shooter Kit итд.)

Как бы вы поступили на моем месте? Писали бы свое решение, использовали стандартный контроллер или взяли бы с ассетстора?

Какие могут быть подводные камни, учитывая то, что игра должна управляться как с клавиатуры, так и с геймпада (ps4/xbox) ?

Кстати, используя стандартный контроллер я столкнулся с багом, когда прикрутил к нему геймпад (если начать крутиться, то текстуры поверхности, по которой ходит персонаж как то очень странно рендерятся. Такое ощущение что они накладываются друг на друга. Для того чтобы вы представили что происходит если у вас нету геймпада - надо зажать клавишу стрейфа влево (A), непрерывно тянуть мышку вправо и смотреть вниз на поверхность по которой ходит персонаж. Это касается как обычного fps controller, так и rigidbody fps controller).

Автор - freedomize
Дата добавления - 05 Апр 2016 в 17:48
ЛевшаДата: Ср, 06 Апр 2016, 17:00 | Сообщение # 2
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Цитата freedomize ()
используя стандартный контроллер я столкнулся с багом, когда прикрутил к нему геймпад (если начать крутиться, то текстуры поверхности, по которой ходит персонаж как то очень странно рендерятся.

Контроллер тут совершенно не при чем...

Цитата freedomize ()
Как бы вы поступили на моем месте?

Цитата freedomize ()
2) Написать свой контроллер персонажа.


X.cor.R (Prologue)
 
Сообщение
Цитата freedomize ()
используя стандартный контроллер я столкнулся с багом, когда прикрутил к нему геймпад (если начать крутиться, то текстуры поверхности, по которой ходит персонаж как то очень странно рендерятся.

Контроллер тут совершенно не при чем...

Цитата freedomize ()
Как бы вы поступили на моем месте?

Цитата freedomize ()
2) Написать свой контроллер персонажа.

Автор - Левша
Дата добавления - 06 Апр 2016 в 17:00
freedomizeДата: Ср, 06 Апр 2016, 18:18 | Сообщение # 3
Нет аватара
 
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
Ответил вам на русском форуме юнити но на всякий случай отвечу и здесь.
"Не знаю при чем тут стандартный контроллер. Но если взять с ассетстора любой, например этот https://www.assetstore.unity3d.com/en/#!/content/39505 то при его использовании я этого не наблюдая. Возможно это не текстуры дергаются а камера контроллера дрожит при быстром вращении. Возможно она просто не рассчитана на быстрое вращение. Ну если просто скрипт создать который будет менять ротацию камеры в зависимости от смещения позиции курсора в методе Update то мне кажется что таких глюков при резком вращении не будет. Возможно я ошибаюсь.

Я буду либо сам писать, либо возьму с ассетстора тот на который кинул ссылку. Не только по причине того что стандартный контроллер дрожит при быстром вращении но и по причине того что в своем коде или коде автора того ассета мне будет проще разобраться чем в коде стандартного контроллера.

Можете дать совет по самописному контроллеру? Если я не ошибаюсь есть 3 способа его реализации:
1) Двигать персонажа с помощью Character Controller.
2)Двигать персонажа через Rigidbody.
3)Двигать персонажа меняя его transform.position.
Я правильно понимаю, что во всех трех вариантах есть только один вариант реализации Mouse Look - менять ротацию камеры в зависимости от изменения позиции курсора?

Если вам не сложно - можете сказать какой из этих трех способов реализации перемещения персонажа вы считаете оптимальным? И если вам не сложно, можете вкратце написать плюсы и минусы этих вариантов?"
 
СообщениеОтветил вам на русском форуме юнити но на всякий случай отвечу и здесь.
"Не знаю при чем тут стандартный контроллер. Но если взять с ассетстора любой, например этот https://www.assetstore.unity3d.com/en/#!/content/39505 то при его использовании я этого не наблюдая. Возможно это не текстуры дергаются а камера контроллера дрожит при быстром вращении. Возможно она просто не рассчитана на быстрое вращение. Ну если просто скрипт создать который будет менять ротацию камеры в зависимости от смещения позиции курсора в методе Update то мне кажется что таких глюков при резком вращении не будет. Возможно я ошибаюсь.

Я буду либо сам писать, либо возьму с ассетстора тот на который кинул ссылку. Не только по причине того что стандартный контроллер дрожит при быстром вращении но и по причине того что в своем коде или коде автора того ассета мне будет проще разобраться чем в коде стандартного контроллера.

Можете дать совет по самописному контроллеру? Если я не ошибаюсь есть 3 способа его реализации:
1) Двигать персонажа с помощью Character Controller.
2)Двигать персонажа через Rigidbody.
3)Двигать персонажа меняя его transform.position.
Я правильно понимаю, что во всех трех вариантах есть только один вариант реализации Mouse Look - менять ротацию камеры в зависимости от изменения позиции курсора?

Если вам не сложно - можете сказать какой из этих трех способов реализации перемещения персонажа вы считаете оптимальным? И если вам не сложно, можете вкратце написать плюсы и минусы этих вариантов?"

Автор - freedomize
Дата добавления - 06 Апр 2016 в 18:18
ЛевшаДата: Ср, 06 Апр 2016, 18:50 | Сообщение # 4
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Если вы в юнити новичек то будет оптимальным начать с CharacterController.
При отсутствии должного опыта - Rigidbody вам скорее всего сложно будет отладить.

Цитата freedomize ()
Возможно это не текстуры дергаются а камера контроллера дрожит

Ну тогда определитесь, ибо визуально - это далеко не одно и то же...
А то что в движке юнити с зетФайтингом беда - это уже давно не новость.


X.cor.R (Prologue)
 
СообщениеЕсли вы в юнити новичек то будет оптимальным начать с CharacterController.
При отсутствии должного опыта - Rigidbody вам скорее всего сложно будет отладить.

Цитата freedomize ()
Возможно это не текстуры дергаются а камера контроллера дрожит

Ну тогда определитесь, ибо визуально - это далеко не одно и то же...
А то что в движке юнити с зетФайтингом беда - это уже давно не новость.

Автор - Левша
Дата добавления - 06 Апр 2016 в 18:50
freedomizeДата: Ср, 06 Апр 2016, 22:16 | Сообщение # 5
Нет аватара
 
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
Спасибо за ответы. Я так понимаю, что двигать игрока с помощью transform.translate в fixedupdate не вариант?

Нужно управлять движением персонажа либо физикой, либо c помощью character controller?

По поводу проблемы с зетфайтингом, почему я ее вижу когда использую стандартный контроллер персонажа, а в этой демке все работает нормально http://vkdemos.ucoz.org/UnityAssets/sfpc/webDemo/v1-1/SmartFirstPersonController.html ?

В чем сложность отладки rigidbody? Я просто использовал его в очень простом шутере с видом сверху и единственная проблема с которой я столкнулся - объект отскакивал от стен но я ее решил.

И последний вопрос, как можно реализовать прыжок персонажа без использования rigidbody?


Сообщение отредактировал freedomize - Ср, 06 Апр 2016, 22:17
 
СообщениеСпасибо за ответы. Я так понимаю, что двигать игрока с помощью transform.translate в fixedupdate не вариант?

Нужно управлять движением персонажа либо физикой, либо c помощью character controller?

По поводу проблемы с зетфайтингом, почему я ее вижу когда использую стандартный контроллер персонажа, а в этой демке все работает нормально http://vkdemos.ucoz.org/UnityAssets/sfpc/webDemo/v1-1/SmartFirstPersonController.html ?

В чем сложность отладки rigidbody? Я просто использовал его в очень простом шутере с видом сверху и единственная проблема с которой я столкнулся - объект отскакивал от стен но я ее решил.

И последний вопрос, как можно реализовать прыжок персонажа без использования rigidbody?

Автор - freedomize
Дата добавления - 06 Апр 2016 в 22:16
NapalmRainДата: Ср, 06 Апр 2016, 22:53 | Сообщение # 6
 
Сообщений: 473
Награды: 0
Репутация: 31
Статус: Offline
Цитата freedomize ()
Нужно управлять движением персонажа либо физикой, либо c помощью character controller?

Да
Цитата freedomize ()
И последний вопрос, как можно реализовать прыжок персонажа без использования rigidbody?

описывать свою "гравитацию" или реализовывать вовсе без физики средствами анимаций.
 
Сообщение
Цитата freedomize ()
Нужно управлять движением персонажа либо физикой, либо c помощью character controller?

Да
Цитата freedomize ()
И последний вопрос, как можно реализовать прыжок персонажа без использования rigidbody?

описывать свою "гравитацию" или реализовывать вовсе без физики средствами анимаций.

Автор - NapalmRain
Дата добавления - 06 Апр 2016 в 22:53
ЛевшаДата: Чт, 07 Апр 2016, 00:01 | Сообщение # 7
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Прыжок можно сделать и через трансформ, но желательно с проверкой крыши.

X.cor.R (Prologue)
 
СообщениеПрыжок можно сделать и через трансформ, но желательно с проверкой крыши.

Автор - Левша
Дата добавления - 07 Апр 2016 в 00:01
freedomizeДата: Сб, 09 Апр 2016, 15:04 | Сообщение # 8
Нет аватара
 
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
А можно использовать Character Controller для перемещения, а rigidbody для прыжка? Я просто знаю что юнитеки не рекомендуют менять transform объекта и одновременно управлять им с помощью rigidbody. Character Controller нормально взаимодействует с rigidbody?

Добавлено (07 Апр 2016, 23:58)
---------------------------------------------
В общем реализовал через изменение трансформа прыжок. Выглядит немного кустарно, но пока что сойдет.

Добавлено (09 Апр 2016, 15:04)
---------------------------------------------
Я столкнулся с проблемой ограничения поворота камеры по вертикали. Я создал объект на сцене, добавил на него компонент Character Controller и осуществил управление его поворотом по горизонтали и движением из следующего скрипта:
[syntax=csharp]
transform.Rotate(new Vector3(0, Input.GetAxis("Mouse X") * sensitivity, 0) * Time.deltaTime);
if (controller.isGrounded) {
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection.normalized);
moveDirection *= speed;
if (Input.GetButton("Jump"))
{
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
[/syntax]
Также я создал дочерний объект с компонентом Camera. Так как родительский объект может поворачиваться по горизонтали, мне нужно лишь поворачивать камеру по вертикали, чтобы смотреть вниз и вверх.
Я модифицировал скрипт для управления Character Controller и дописал туда функционал для движения камеры.
[syntax=csharp]
public Transform cam;
cam.Rotate(new Vector3(-Input.GetAxis("Mouse Y") * sensitivityCam, 0, 0) * Time.deltaTime);
[/syntax]
Тут я столкнулся с проблемой. Проблема в том, что я не понимаю, как можно ограничить поворот камеры по вертикали, если ее поворачивать с помощью transform.Rotate.

Я переписал эту часть скрипта.
[syntax=csharp]
public Transform cam;
rotationY += Input.GetAxis("Mouse Y") * sensitivityCam * Time.deltaTime;
rotationY = Mathf.Clamp(rotationY, -90, 90);
cam.localEulerAngles = new Vector3(-rotationY, cam.localEulerAngles.y, cam.localEulerAngles.z);
[/syntax]

Теперь камера имеет лимиты поворота по вертикали. Проблема в том, что когда я реализовывал движение камеры по вертикали с помощью cam.Rotate, она двигалась значительно плавнее чем сейчас.
Пожалуйста подскажите, как можно ограничить поворот камеры, если двигать ее с помощью cam.Rotate?
Если вы знаете, как сделать поворот с помощью cam.localEulerAngles плавнее - буду рад услышать ваши советы.
Я пробовал просчитывать движения в FixedUpdate а двигать в Update но видимого результата это не дало - все равно движение камеры с помощью cam.localEulerAngles менее плавное чем с помощью transform.Rotate.

Сообщение отредактировал freedomize - Пт, 08 Апр 2016, 00:00
 
СообщениеА можно использовать Character Controller для перемещения, а rigidbody для прыжка? Я просто знаю что юнитеки не рекомендуют менять transform объекта и одновременно управлять им с помощью rigidbody. Character Controller нормально взаимодействует с rigidbody?

Добавлено (07 Апр 2016, 23:58)
---------------------------------------------
В общем реализовал через изменение трансформа прыжок. Выглядит немного кустарно, но пока что сойдет.

Добавлено (09 Апр 2016, 15:04)
---------------------------------------------
Я столкнулся с проблемой ограничения поворота камеры по вертикали. Я создал объект на сцене, добавил на него компонент Character Controller и осуществил управление его поворотом по горизонтали и движением из следующего скрипта:
[syntax=csharp]
transform.Rotate(new Vector3(0, Input.GetAxis("Mouse X") * sensitivity, 0) * Time.deltaTime);
if (controller.isGrounded) {
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection.normalized);
moveDirection *= speed;
if (Input.GetButton("Jump"))
{
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
[/syntax]
Также я создал дочерний объект с компонентом Camera. Так как родительский объект может поворачиваться по горизонтали, мне нужно лишь поворачивать камеру по вертикали, чтобы смотреть вниз и вверх.
Я модифицировал скрипт для управления Character Controller и дописал туда функционал для движения камеры.
[syntax=csharp]
public Transform cam;
cam.Rotate(new Vector3(-Input.GetAxis("Mouse Y") * sensitivityCam, 0, 0) * Time.deltaTime);
[/syntax]
Тут я столкнулся с проблемой. Проблема в том, что я не понимаю, как можно ограничить поворот камеры по вертикали, если ее поворачивать с помощью transform.Rotate.

Я переписал эту часть скрипта.
[syntax=csharp]
public Transform cam;
rotationY += Input.GetAxis("Mouse Y") * sensitivityCam * Time.deltaTime;
rotationY = Mathf.Clamp(rotationY, -90, 90);
cam.localEulerAngles = new Vector3(-rotationY, cam.localEulerAngles.y, cam.localEulerAngles.z);
[/syntax]

Теперь камера имеет лимиты поворота по вертикали. Проблема в том, что когда я реализовывал движение камеры по вертикали с помощью cam.Rotate, она двигалась значительно плавнее чем сейчас.
Пожалуйста подскажите, как можно ограничить поворот камеры, если двигать ее с помощью cam.Rotate?
Если вы знаете, как сделать поворот с помощью cam.localEulerAngles плавнее - буду рад услышать ваши советы.
Я пробовал просчитывать движения в FixedUpdate а двигать в Update но видимого результата это не дало - все равно движение камеры с помощью cam.localEulerAngles менее плавное чем с помощью transform.Rotate.


Автор - freedomize
Дата добавления - 09 Апр 2016 в 15:04
ЛевшаДата: Вс, 10 Апр 2016, 13:39 | Сообщение # 9
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Код

Vector3 targetRotation = new Vector3(-rotationY, cam.localEulerAngles.y, cam.localEulerAngles.z);
cam.localEulerAngles = Vector3.Lerp(cam.localEulerAngles, targetRotation, Time.deltaTime);


X.cor.R (Prologue)
 
Сообщение
Код

Vector3 targetRotation = new Vector3(-rotationY, cam.localEulerAngles.y, cam.localEulerAngles.z);
cam.localEulerAngles = Vector3.Lerp(cam.localEulerAngles, targetRotation, Time.deltaTime);

Автор - Левша
Дата добавления - 10 Апр 2016 в 13:39
freedomizeДата: Вс, 10 Апр 2016, 20:13 | Сообщение # 10
Нет аватара
 
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
Спасибо. Попробую сделать так.
 
СообщениеСпасибо. Попробую сделать так.

Автор - freedomize
Дата добавления - 10 Апр 2016 в 20:13
Форум Игроделов » UNITY3D » ОБЩИЕ ВОПРОСЫ » Реализация FPS контроллера для игры с поддержкой геймпада.
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024