Как вращать объект вокруг своей оси?/Unity3d

149
10 октября 2021, 23:40

Есть шар который я хочу вращать вокруг своей оси вперед .

Сам вопрос был бы очень легкий ,если бы не одно но.

Движение объекта:

rb.MovePosition(transform.position + (transform.forward * Time.deltaTime *speed));

Для того чтобы изменять направления персонажа я его поворачиваю т.е. мне нужно использовать forward для того , что персонаж мог не просто идти вперед по оси X,а и изменять направления и двигаться по нему вперед.Но как вы понимаете если я просто начну вращать его например вот так transform.Rotate(Vector3.right *3),то и forward не будет работать корректно.

Поворот объекта :

     private Touch touch1;
    
        private Vector2 TouchPosition;
    
        private Quaternion rotationY;
    
        private float rotateSpeedModifier = 0.7f;
        void Update()
{
            if (Input.touchCount > 0)
                    {
                        touch1 = Input.GetTouch(0);
                        if (touch1.phase == TouchPhase.Moved)
                        {
                            rotationY = Quaternion.Euler(
                                0f,
                                touch1.deltaPosition.x * rotateSpeedModifier,
                                0f);
                            transform.rotation = rotationY * transform.rotation;
                        }
                    }
    }

Единственным выходом я вижу как то поменять механику движения,но как?

//Поворот анимацией ,наверное,плохая идея.

Answer 1

Оптимальным путем будет использовать физическое движение, а не вращать + двигать вперед.

using UnityEngine;
//эта строчка гарантирует что наш скрипт не завалится 
//ести на плеере будет отсутствовать компонент Rigidbody
[RequireComponent(typeof(Rigidbody))]
public class Movement : MonoBehaviour
{
    public float Speed = 10f;
    public float JumpForce = 300f;
    //что бы эта переменная работала добавьте тэг "Ground" на вашу поверхность земли
    private bool _isGrounded;
    private Rigidbody _rb;
    void Start()
    {
        _rb = GetComponent<Rigidbody>();
    }
    // обратите внимание что все действия с физикой 
    // необходимо обрабатывать в FixedUpdate, а не в Update
    void FixedUpdate()
    {
        MovementLogic();
        JumpLogic();
    }
    private void MovementLogic()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        _rb.AddForce(movement * Speed);
    }
    private void JumpLogic()
    {
        if (Input.GetAxis("Jump") > 0)
        {
            if (_isGrounded)
            {
                _rb.AddForce(Vector3.up * JumpForce);
                // Обратите внимание что я делаю на основе Vector3.up 
                // а не на основе transform.up. Если персонаж упал или 
                // если персонаж -- шар, то его личный "верх" может 
                // любое направление. Влево, вправо, вниз...
                // Но нам нужен скачек только в абсолютный вверх, 
                // потому и Vector3.up
            }
        }
    }
    void OnCollisionEnter(Collision collision)
    {
        IsGroundedUpate(collision, true);
    }
    void OnCollisionExit(Collision collision)
    {
        IsGroundedUpate(collision, false);
    }
    private void IsGroundedUpate(Collision collision, bool value)
    {
        if (collision.gameObject.tag == ("Ground"))
        {
            _isGrounded = value;
        }
    }
}

код взят с темы: Правильная реализация передвижения персонажа

а там взят с документации юнити и доработан.

В твоем случае тебе нужно вырезать логику прыжка, а так же залочить обьект по высоте (y) при касании "земли", на сколько я понимаю.

Но если уж отвечать на сам поставленный вопрос: как вращать шар вокруг своей оси...

для этого нужно использовать просто Rotate. Но самое главное что нужно учесть, что бы pivot point был в центре обьекта. Т.к. вращаться обьект будет именно вокруг него.

READ ALSO
Пул временных портов

Пул временных портов

Возникла задача по реализации OAuth fat клиента при уже существующем серверном приложенииПроблема в том, что клиент может быть подключен к серверу...

260
Как лучше реализовать класс оружия?

Как лучше реализовать класс оружия?

Допустим, есть класс Player, который внутри себя хранит экземпляр интерфейса IWeapon

177
Daemon на MonoDevelop (C#)

Daemon на MonoDevelop (C#)

Мне нужно написать аналог Windows Service под Linux на MonoDevelop, который будет запускаться/завершаться из-под другой программы (как дочерний процесс)Реально...

95
Как поставить иконку в MenuItem C#?

Как поставить иконку в MenuItem C#?

Вроде бы простой вопрос, только я не нашел соответствующего свойства в спискеВозможно ли это вообще? Прошу не предлагать ToolStripMenuItem

126