Я делаю ховерборд с 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);
}
}
}
}
Любая помощь будет оценена.