Хочу сделать разворот в сторону движения на определённое количество градусов. Принцип такой - если игрок движется, например, вправо, то его разворачивает на 15 градусов и идёт движение вправо. Если нет, то игра проверяет значение поворота по z и возвращает к исходному. Разворот вроде работает, но только один раз. И застывает в этом же положении. ХЗ че не так using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { Rigidbody2D _rigidbody2D; public float playerSpeed; float _isRotate; float _sideSpeed = 3.5f; private void Awake() { _rigidbody2D = GetComponent<Rigidbody2D>(); } void Update() { _isRotate = Input.GetAxisRaw("Horizontal"); if (_isRotate == 0f) { if (_rigidbody2D.transform.rotation.z == 15f) { _rigidbody2D.transform.Rotate(0f, 0f, -15f); } else if (_rigidbody2D.transform.rotation.z == -15f) { _rigidbody2D.transform.Rotate(0f, 0f, 15f); } } //left else if (_isRotate == -1f) { if(_rigidbody2D.transform.rotation.z == 0f) { _rigidbody2D.transform.Rotate(0f, 0f, 15f); } } //right else if (_isRotate == 1f) { if (_rigidbody2D.transform.rotation.z == 0f) { _rigidbody2D.transform.Rotate(0f, 0f, -15f); } } _rigidbody2D.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * _sideSpeed, Input.GetAxisRaw("Vertical") * playerSpeed); } } C# using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { Rigidbody2D _rigidbody2D; public float playerSpeed; float _isRotate; float _sideSpeed = 3.5f; private void Awake() { _rigidbody2D = GetComponent<Rigidbody2D>(); } void Update() { _isRotate = Input.GetAxisRaw("Horizontal"); if (_isRotate == 0f) { if (_rigidbody2D.transform.rotation.z == 15f) { _rigidbody2D.transform.Rotate(0f, 0f, -15f); } else if (_rigidbody2D.transform.rotation.z == -15f) { _rigidbody2D.transform.Rotate(0f, 0f, 15f); } } //left else if (_isRotate == -1f) { if(_rigidbody2D.transform.rotation.z == 0f) { _rigidbody2D.transform.Rotate(0f, 0f, 15f); } } //right else if (_isRotate == 1f) { if (_rigidbody2D.transform.rotation.z == 0f) { _rigidbody2D.transform.Rotate(0f, 0f, -15f); } } _rigidbody2D.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * _sideSpeed, Input.GetAxisRaw("Vertical") * playerSpeed); } }
Решил проблему. Для тех, кто загуглил такую же ошибку, объясняю: В первый раз поворот работает нормально потому, что условие if(transform.rotation.z == 0f) оказывается истинно. А не возвращает обратно потому, что условие if(transform.rotation.z == 15f/-15f) не срабатывает (не знаю почему, просто не хочет, хотя в инспекторе именно такие значения и показаны). Просто уберите проверку на позицию при возвращении в исходное положение. Ну а пока я искал решение проблемы, то изучил ещё и кватернионы. С ними поворот получается плавнее, да и работать удобнее. void Update() { Rotate(); _rigidbody2D.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * sideSpeed, Input.GetAxisRaw("Vertical") * playerSpeed); } void Rotate() { _isRotate = Input.GetAxisRaw("Horizontal"); if (_isRotate == 0f) { Quaternion target = Quaternion.Euler(0, 0, 0); transform.rotation = Quaternion.RotateTowards(transform.rotation, target, Time.deltaTime * 1500); } //left else if (_isRotate == -1f) { if (transform.rotation.z == 0f) { Quaternion target = Quaternion.Euler(0, 0, 15); transform.rotation = Quaternion.RotateTowards(transform.rotation, target, Time.deltaTime * 1500); } } //right else if (_isRotate == 1f) { if (transform.rotation.z == 0f) { Quaternion target = Quaternion.Euler(0, 0, -15); transform.rotation = Quaternion.RotateTowards(transform.rotation, target, Time.deltaTime * 1500); } } } C# void Update() { Rotate(); _rigidbody2D.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * sideSpeed, Input.GetAxisRaw("Vertical") * playerSpeed); } void Rotate() { _isRotate = Input.GetAxisRaw("Horizontal"); if (_isRotate == 0f) { Quaternion target = Quaternion.Euler(0, 0, 0); transform.rotation = Quaternion.RotateTowards(transform.rotation, target, Time.deltaTime * 1500); } //left else if (_isRotate == -1f) { if (transform.rotation.z == 0f) { Quaternion target = Quaternion.Euler(0, 0, 15); transform.rotation = Quaternion.RotateTowards(transform.rotation, target, Time.deltaTime * 1500); } } //right else if (_isRotate == 1f) { if (transform.rotation.z == 0f) { Quaternion target = Quaternion.Euler(0, 0, -15); transform.rotation = Quaternion.RotateTowards(transform.rotation, target, Time.deltaTime * 1500); } } }