Как заблокировать горизонтальное вращение камеры, если скорость равна 0 или меньше? - PullRequest
0 голосов
/ 29 марта 2020

Я работаю над игрой для автомобилей и пытаюсь предотвратить горизонтальное перемещение камеры, если скорость модели равна нулю, я перепробовал много вещей, однако мне кажется, что я не могу этого сделать, потому что когда я получаю камеру чтобы быть заблокированным, он остается заблокированным, даже если объект движется, и если нет, то он просто продолжает двигаться даже при остановленном объекте, поэтому я хочу знать, как я могу это сделать.

Код для кулачка Класс

public class Cam : MonoBehaviour
{
    public float sensitivityHor = 9.0f;
    public float sensitivityVert = 9.0f;
    public float minimumVert = -45.0f;
    public float maximumVert = 45.0f;

    public enum rotationAxes
    {
        //Given aliases to X and Y cordinates
        keyX = 1,
    }
    public rotationAxes axes = rotationAxes.keyX;
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        Movement mov = GetComponent<Movement>();
        if (mov.speed > mov.speed && mov.speed > 0 && axes == rotationAxes.keyX)
        {
                //Movimiento en el eje X de la camara
                transform.Rotate(0, Input.GetAxis("Horizontal") * sensitivityHor, 0);
        }

    }

}

код для класса движения

public class Movement : MonoBehaviour
{
    private CharacterController _charController;
    public float speed = 3.0f;
    // Start is called before the first frame update
    void Start()
    {
        _charController = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {

            float deltaZ = Input.GetAxis("Vertical") * speed;
            Vector3 movement = new Vector3(0, 0, deltaZ);
            movement = Vector3.ClampMagnitude(movement, speed);
            movement *= Time.deltaTime;
            movement = transform.TransformDirection(movement);
            _charController.Move(movement);

    }

}

1 Ответ

0 голосов
/ 30 марта 2020

Вы никогда не меняете значение speed, так какой смысл проверять его?

Вместо этого сохраните фактическую скорость, которую вы собираетесь применить к объекту в этом кадре

public class Movement : MonoBehaviour
{
    [Header("References")]
    [SerializeField] private CharacterController _charController;

    [Header("Settings")]
    [SerializeField] private float speed = 3.0f;

    [Header("Debug")]
    [SerializeField] private float actualSpeed;

    // public Read-only property
    public float ActualSpeed => actualSpeed;

    // Start is called before the first frame update
    private void Awake()
    {
        if(!_charController) _charController = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    private void Update()
    {
        actualSpeed = Input.GetAxis("Vertical") * speed;
        // It is cheaper to clamp a single float value then a vector
        // since "GetAxis" retusn a value between -1 and 1
        // it will anyway never be greater then "speed" so enough
        // to clamp it downwards
        actualSpeed = Mathf.Max(deltaZ, 0);
        actualSpeed *= Time.deltaTime;

        // This already uses the world space forward vector
        _charController.Move(transfor.forward * actualSpeed);
    }
}

И теперь вы можете проверить это actualSpeed значение

[RequireComponent(typeof(Movement))]
public class Cam : MonoBehaviour
{
    [Header("References")]
    // Better reference this already via the Inspector
    [SerializeField] private Movement mov;

    [Header("Settings")]
    [SerializeField] private float sensitivityHor = 9.0f;
    [SerializeField] private float sensitivityVert = 9.0f;
    [SerializeField] private float minimumVert = -45.0f;
    [SerializeField] private float maximumVert = 45.0f;
    [Space]
    [SerializeField] private rotationAxes axes = rotationAxes.keyX;

    public enum rotationAxes
    {
        //Given aliases to X and Y cordinates
        keyX = 1,
    }

    private void Awake()
    {
        // as fallback get it ONCE
        if(!mov) mov = GetComponent<Movement>();
    }

    // Update is called once per frame
    private  void Update()
    {
        if (mov.ActualSpeed > 0 && axes == rotationAxes.keyX)
        {
            transform.Rotate(0, Input.GetAxis("Horizontal") * sensitivityHor, 0);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...