Как сделать чтобы объект не вращался при изменении родителя?

Общие вопросы о Unity3D

Как сделать чтобы объект не вращался при изменении родителя?

Сообщение Alexey7777 13 май 2022, 11:51

Здравствуйте, есть персонаж сфера (с чарактер контроллером) и платформа с пустым родителем, который вращается по оси Y, когда персонаж запрыгивает на платформу его родителем становится родитель платформы, а сам персонаж поворачивается по оси У нa Y родителя. Как сделать, чтобы персонаж не поворачивался, а смотрел только в ту сторону, куда прыгает? Вычитание и добавление углов поворота на угол поворота родителя не помогает.
Код
Скрытый текст:
public class PlayerController : MonoBehaviour
{
[Header("----------- Контроллеры UI -----------")]
[SerializeField] private Camera cam;
[SerializeField] private MobileController mobContrlRot;
[SerializeField] private MobileController mobContrlMove;
[SerializeField] private Button jump;

[Space(20)]
[Header("----------- Дополнительные механики -----------")]
[SerializeField] private bool defining_platforms = false;

private CharacterController player;

public static float Rotate_player { set { rotationY += value; } }


private float playerSpeed = 8f;
private float jumpSpeed = 12f;
private float rotationSpeed = 5f;

private float minimumVert = -30f;
private float maximumVert = 40f;
private float rotationX = 0;
private static float rotationY = 0;

private float horInput = 0;
private float vertInput = 0;

private float gravity = Physics.gravity.y;
private float terminalVelocity = -10f;
private float minimumFall = -1.5f;
private float verticalSpeed;



private void Awake()
{
___ player = GetComponent<CharacterController>();
___ rotationY = transform.localEulerAngles.y;
}

// Update is called once per frame
void Update()
{
___ if (!GameManager.gameManager.gamePause)
___ {
____ PlayerMove();
____ PlayerRotation();
____ PlayerJump();
___}
}

private void OnControllerColliderHit(ControllerColliderHit hit)
{
___ if (defining_platforms) DefiningPlatforms(hit);
___ if (hit.gameObject.CompareTag("Obstacle")) hit.gameObject.GetComponent<Obstacle>().Hit();
}

public void PlayerMove()
{
#if (UNITY_EDITOR)
___ horInput = Input.GetAxis("Horizontal");
___ vertInput = Input.GetAxis("Vertical");
#else
___ horInput = mobContrlMove.inputHorizontal();
___ vertInput = mobContrlMove.inputVertical();
#endif



___ Vector3 move = new Vector3(horInput, 0, vertInput);
___ move *= playerSpeed;
___ move.y = verticalSpeed;
___ move *= Time.deltaTime;
___ move = Vector3.ClampMagnitude(move, playerSpeed);
___ move = transform.TransformDirection(move);

___ player.Move(move);
}

private void PlayerRotation()
{
#if (UNITY_EDITOR)
___ rotationY += Input.GetAxis("Mouse X");
___ rotationX -= Input.GetAxis("Mouse Y");
#else
___ rotationY += mobContrlRot.inputHorizontal();
___ rotationX -= mobContrlRot.inputVertical();
#endif


___ rotationX = Mathf.Clamp(rotationX, minimumVert, maximumVert);
___ transform.localEulerAngles = Vector3.up * rotationY * rotationSpeed;
___ cam.transform.localEulerAngles = Vector3.right * rotationX;
}


public void PlayerJump(bool button = false)
{
___ if (player.isGrounded)
___ {
___ ___ if (Input.GetKeyDown(KeyCode.Space) || button)
___ ___ {
___ ___ ___ verticalSpeed = jumpSpeed;
___ ___ ___ if (this.transform.parent != null)
___ ___ ___ {
___ ___ ___ ___ this.transform.parent = null;
___ ___ ___ }
___ ___ }
___ ___ else
___ ___ {
___ ___ ___ verticalSpeed = minimumFall;
___ ___ }
___ }
___ else
___ {

___ verticalSpeed += gravity * 5 * Time.deltaTime;
___ if (verticalSpeed < terminalVelocity) verticalSpeed = terminalVelocity;
___ if (this.transform.parent != null) this.transform.parent = null;
___ }
}

private void DefiningPlatforms(ControllerColliderHit hit)
{
___ if (!player.isGrounded && hit.gameObject.CompareTag("Platform") && player.bounds.min.y >= hit.collider.bounds.max.y && this.transform.parent == null)
___ {
___ ___ this.transform.parent = hit.transform.parent;
___ }
}
}
Последний раз редактировалось Alexey7777 13 май 2022, 12:08, всего редактировалось 1 раз.
Alexey7777
UNец
 
Сообщения: 4
Зарегистрирован: 13 май 2022, 11:40

Re: Как сделать чтобы объект не вращался при изменении родителя?

Сообщение Alkos26Rus 13 май 2022, 12:00

Синтаксис:
Используется csharp
transform.localEulerAngles = Vector3.up * rotationY * rotationSpeed;

Ну вот тут ты крутишь по локальной оси, крути глобально transform.eulerAngles
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как сделать чтобы объект не вращался при изменении родителя?

Сообщение Alexey7777 13 май 2022, 12:14

Невероятно, вы что бог какой-то? Все работает, с первого ответа! Спасибо Вам огромное, я так долго мучился с этим, глобально пробовал только углы поворота вычитать и прибавлять )))
Alexey7777
UNец
 
Сообщения: 4
Зарегистрирован: 13 май 2022, 11:40

Re: Как сделать чтобы объект не вращался при изменении родителя?

Сообщение Alexey7777 13 май 2022, 13:41

Alkos26Rus писал(а):
Синтаксис:
Используется csharp
transform.localEulerAngles = Vector3.up * rotationY * rotationSpeed;

Ну вот тут ты крутишь по локальной оси, крути глобально transform.eulerAngles


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

Методом тыка высчитал, что если вращать персонажа вот с такой скоростью: 1 * Time.deltaTime / 5 на платформе(скорость вращения платформы 1 * Time.deltaTime через transform.Rotate(0,1 * Time.deltaTime ,0)). То относительно платформы персонаж вращается почти с 0 скоростью, может где-то 0.0001 или и того меньше. Получается тот эффект, который мне нужен, но по моему это какой-то костыль.
Alexey7777
UNец
 
Сообщения: 4
Зарегистрирован: 13 май 2022, 11:40

Re: Как сделать чтобы объект не вращался при изменении родителя?

Сообщение Alkos26Rus 13 май 2022, 21:04

Я бы вобще не назначал угол, а прибавлял
Синтаксис:
Используется csharp
#if (UNITY_EDITOR)
___ rotationY = Input.GetAxis("Mouse X");
___ rotationX = Input.GetAxis("Mouse Y");
#else
___ rotationY = mobContrlRot.inputHorizontal();
___ rotationX = mobContrlRot.inputVertical();
#endif
transform.eulerAngles += Vector3.up * rotationY * rotationSpeed;

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

Alexey7777 писал(а):Методом тыка высчитал, что если вращать персонажа вот с такой скоростью: 1 * Time.deltaTime / 5 на платформе(скорость вращения платформы 1 * Time.deltaTime через transform.Rotate(0,1 * Time.deltaTime ,0)). То относительно платформы персонаж вращается почти с 0 скоростью, может где-то 0.0001 или и того меньше. Получается тот эффект, который мне нужен, но по моему это какой-то костыль.

Без понятия, лучшей такой фигней не заниматься как сведением скорости вращения до нуля, должно все работать корректно на любой скорости
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как сделать чтобы объект не вращался при изменении родителя?

Сообщение Alexey7777 16 май 2022, 09:12

Ваш совет очень сильно помог мне, теперь вообще все идеально работает, прям так, как я и хотел, спасибо вам большое! =)
Alexey7777
UNец
 
Сообщения: 4
Зарегистрирован: 13 май 2022, 11:40


Вернуться в Общие вопросы

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

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