Четверг, 28 Марта 2024, 12:45

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Ограничение вращения двухмерного объекта (решено)
Ограничение вращения двухмерного объекта (решено)
CUbeBДата: Пятница, 20 Мая 2022, 19:13 | Сообщение # 1
частый гость
Сейчас нет на сайте
Привет! Пытаюсь решить следующую задачу - У меня есть объект игрока, а у игрока есть голова, которая вращается в сторону мыши. Мне нужно как-то ограничить вращение головы, чтобы она могла вращаться только в диапазоне от -30 градусов до 30. Я попытался ограничить вращение с помощью следующего кода:

Код

float headLook = Mathf.Rad2Deg * Mathf.Atan2(mousePosition.y - head.transform.position.y, mousePosition.x - head.transform.position.x);
head.transform.eulerAngles = new Vector3(0, 0, Mathf.Clamp(headLook, -30, 30));


В принципе это работает, но только до тех пор, пока голова смотрит вправо. Если повернуть ее влево, то есть завести мышку за спину игроку, то все ломается и голова по непонятной причине застревает, то на -30, то на 30 градусах.

Помогите, буду очень признателен :)


Да да, на аватарке моя старая игра...

Сообщение отредактировал CUbeB - Суббота, 21 Мая 2022, 14:00
drcrackДата: Пятница, 20 Мая 2022, 20:17 | Сообщение # 2
старожил
Сейчас нет на сайте
Попробуй вместо Clamp сделать так: Mathf.MoveTowardsAngle(0, headLook, 30)
CUbeBДата: Пятница, 20 Мая 2022, 21:39 | Сообщение # 3
частый гость
Сейчас нет на сайте
Результат точно такой же(

Да да, на аватарке моя старая игра...
SpringДата: Суббота, 21 Мая 2022, 02:06 | Сообщение # 4
частый гость
Сейчас нет на сайте
Может так?
Код

if (mousePosition.x - head.transform.position.x > 0)
float headLook = Mathf.Rad2Deg * Mathf.Atan2(mousePosition.y - head.transform.position.y, mousePosition.x - head.transform.position.x);
else float headLook = Mathf.Rad2Deg * Mathf.Atan2(head.transform.position.y - mousePosition.y, head.transform.position.x - mousePosition.x);
head.transform.eulerAngles = new Vector3(0, 0, Mathf.Clamp(headLook, -30, 30));


Сообщение отредактировал Spring - Суббота, 21 Мая 2022, 02:06
IlyaKosДата: Суббота, 21 Мая 2022, 08:06 | Сообщение # 5
участник
Сейчас нет на сайте
Приводи к локальному ротейшну.
CUbeBДата: Суббота, 21 Мая 2022, 13:59 | Сообщение # 6
частый гость
Сейчас нет на сайте
В результате я пришел к тому, что нужно ограничивать не угол вращения головы, а вектор, в сторону которого она смотрит.
Все на костылях, но суть ясна:
Код

lookDirection = new Vector3(mousePosition.x - head.transform.position.x, mousePosition.y - head.transform.position.y, 0).normalized;
lookDirectionClamped = new Vector3(lookDirection.x, Mathf.Clamp(lookDirection.y, -clampValue, clampValue), 0);

if (mousePosition.x - head.transform.position.x < 0)
{
      head.transform.eulerAngles = new Vector3(0, 0, -lookDirectionClamped.y * 40);
}else
{
      head.transform.eulerAngles = new Vector3(0, 0, lookDirectionClamped.y * 40);
}


Да да, на аватарке моя старая игра...

Сообщение отредактировал CUbeB - Суббота, 21 Мая 2022, 14:00
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Ограничение вращения двухмерного объекта (решено)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг