Загрузка...

Хелпаните кто в Unity шарит

Тема в разделе C# создана пользователем Dezo 27 окт 2022. 186 просмотров

  1. Dezo
    Dezo Автор темы 27 окт 2022 210 30 июн 2021
    Хочу сделать разворот в сторону движения на определённое количество градусов. Принцип такой - если игрок движется, например, вправо, то его разворачивает на 15 градусов и идёт движение вправо. Если нет, то игра проверяет значение поворота по z и возвращает к исходному. Разворот вроде работает, но только один раз. И застывает в этом же положении. ХЗ че не так
    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);
    }
    }
     
  2. karmanwork
    karmanwork 1 ноя 2022 Заблокирован(а) 101 7 окт 2020
    попробуй создать для этого отдельную функцию и вызывать ее в fixed update
     
  3. Dezo
    Dezo Автор темы 2 ноя 2022 210 30 июн 2021
    Решил проблему. Для тех, кто загуглил такую же ошибку, объясняю: В первый раз поворот работает нормально потому, что условие if(transform.rotation.z == 0f) оказывается истинно. А не возвращает обратно потому, что условие if(transform.rotation.z == 15f/-15f) не срабатывает (не знаю почему, просто не хочет, хотя в инспекторе именно такие значения и показаны). Просто уберите проверку на позицию при возвращении в исходное положение. Ну а пока я искал решение проблемы, то изучил ещё и кватернионы. С ними поворот получается плавнее, да и работать удобнее.
    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);
    }
    }
    }
     
    2 ноя 2022 Изменено
Загрузка...
Top