Единство вращения зажима - PullRequest
0 голосов
/ 14 апреля 2020

Я делаю ховерборд с Unity и хочу, чтобы он не переворачивался на осях x и z при помощи зажима. Я пытался использовать Mathf.Clamp (), чтобы ограничить вращение по оси x между -40 и 40 и вращение по оси z от -30 до 30. Я искал решение в течение нескольких часов, но все ответы по StackOverflow и Unity предназначены для случаев, когда вы увеличиваете вращение с помощью кода, и когда я использую зажимные решения, данные плата либо не будет вращаться вообще, либо будет портиться и все быстрее переворачиваться. Я использую Rigidbody на своем ховерборде и обрабатываю физику таким образом, чтобы я на самом деле не менял вращение на этих осях вручную, доска просто будет вращаться как I go над объектом (потому что я использую AddForceAtPosition). У меня есть 2 сценария: один обрабатывает зависание, назначенное 4 точкам на доске, а другой - перемещение и вращение по оси Y. Я удалил код зажима, который использовал ранее, потому что он не работает.

Вот сценарии:

Сценарий движения:

using UnityEngine;

public class BoardMovement : MonoBehaviour
{
    [SerializeField]
    float moveForce = 10f;

    [SerializeField]
    float rotateSpeed = 360f;

    [SerializeField]
    float gravity = 4f;

    float forward;

    float turn;

    void Update()
    {

        forward = Input.GetAxis("Vertical");
        turn = Input.GetAxis("Horizontal");
    }

    private void FixedUpdate()
    {
        rb.AddForce(transform.forward * moveForce * forward * Time.fixedDeltaTime);
        rb.AddRelativeTorque(transform.up * turn * rotateSpeed * Time.fixedDeltaTime);

        rb.AddForce(-Vector3.up * gravity * Time.fixedDeltaTime);
    }

}

Сценарий наведения:

using UnityEngine;

public class CheckDistance : MonoBehaviour
{
    [SerializeField]
    float hoverHeight = 2.0f;

    [SerializeField]
    float hoverForce = 5.0f;

    [SerializeField]
    float hoverDamp = 0.5f;

    Rigidbody rb;

    void Start()
    {
        rb = GetComponentInParent<Rigidbody>();
    }

    void Update()
    {
        RaycastHit hit;
        Ray downRay = new Ray(transform.position, -Vector3.up);
        if (Physics.Raycast(downRay, out hit)&& hit.collider.tag == "Terrain")
        {
            Debug.Log(hit.collider.name + " " + hit.distance);
            float hoverError = hoverHeight - hit.distance;

            if (hoverError > 0)
            {
                float upwardSpeed = rb.velocity.y;
                float lift = hoverError * hoverForce - upwardSpeed * hoverDamp;
                rb.AddForceAtPosition(lift * Vector3.up, transform.position);
            }
        }
    }

}

Любая помощь будет оценена.

...