Мой игрок все еще вращается даже с ограничениями - PullRequest
1 голос
/ 23 мая 2019

Я хочу, чтобы мой игрок больше не вращался после начала игры.Я замораживаю вращение в сценарии и в ограничениях тоже, но игрок все равно вращается, когда движется вперед.Что я могу сделать ?(У меня есть fps и контроллер персонажей).У меня также есть холст с кнопками для управления влево, верно?Должен ли я поместить скрипт рибибоди или игрока в объект персонажа (я создал игровой объект игрока, который содержит персонажа и камеру)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Player : MonoBehaviour
{
    public float playerSpeed = 1500;
    public float directionalSpeed = 20;

    private Rigidbody rb;

    // Start is called before the first frame update
    void Start()
    {
        GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation;
    }

    // Update is called once per frame
    void Update()
    {
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_WEBPLAYER

        float moveHorizontal = Input.GetAxis("Horizontal");
        transform.position = Vector3.Lerp(gameObject.transform.position, new Vector3(Mathf.Clamp(gameObject.transform.position.x + moveHorizontal, -2.5f, 2.5f), gameObject.transform.position.y, gameObject.transform.position.z), directionalSpeed * Time.deltaTime);
#endif
        GetComponent<Rigidbody>().velocity = Vector3.forward * playerSpeed * Time.deltaTime;
        transform.Rotate(Vector3.right * GetComponent<Rigidbody>().velocity.z / 3);
        //MOBILE CONTROLS
        Vector2 touch = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 10f));
        if (Input.touchCount > 0)
        {
            transform.position = new Vector3(touch.x, transform.position.y, transform.position.z);
        }
    }
    public void MoveLeft()
    {
        rb.velocity = new Vector2(-playerSpeed, rb.velocity.y);
    }
    public void MoveRight ()
    {
        rb.velocity = new Vector2(playerSpeed, rb.velocity.y);
    }
    public void StopMoving()
    {
        rb.velocity = new Vector2(0f, rb.velocity.y);
    }
    void DetectInput()
    {
        float x = Input.GetAxisRaw("Horizontal");
        if (x > 0 )
        {
            MoveRight();
        }
        else if ( x < 0)
        {
            MoveLeft();
        }
        else
        {
            StopMoving();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Если вы добавили твердое тело, вы можете заморозить положение или вращение (независимо от того, твердое тело 2d или нет) enter image description here

Для начала вы должны объявить твердое тело

rb = GetComponent<Rigidbody>();

И тогда вы можете заморозить вращение RigidbodyConstraints (выбранный ярлык на скриншоте)

rigidbody.constraints = RigidbodyConstraints.FreezeRotationX;
//freeze only one rotation

rigidbody.constraints = RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezePositionY;
//freeze all rotations

чтобы снять отметку, просто наберите

rigidbody.constraints = RigidbodyConstraints.None; 

Если ваша игра 2d, просто добавьте 2d ко всем текстам Ригидела

0 голосов
/ 24 мая 2019

Поворот с использованием MoveRotation

Использование ограничений компонента Rigidbody будет ограничивать игровой объект только через физический движок. В настоящее время вы вращаете преобразование вручную.

Из документации:

void FixedUpdate()
{
    Quaternion deltaRotation = Quaternion.Euler(m_EulerAngleVelocity * Time.deltaTime);
    m_Rigidbody.MoveRotation(m_Rigidbody.rotation * deltaRotation);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...