Используйте Rigidbody.AddForce
вместо:
Вы явно используете Transform.Translate
для перемещения камеры.Если вы хотите, чтобы ваша камера двигалась с полными столкновениями, вы не можете использовать перевод (так как перевод может полностью перемещать вашу камеру через объект до обнаружения следующего столкновения).
Если вы хотите иметьполная коллизия, тогда вы должны использовать Rigidbody.AddForce
.
https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html
Вам придется уделять особое внимание гравитации, кинематическим свойствам и т. д. на вашем объекте.Однако вы должны быть в состоянии контролировать объект так же, как вы делаете это с переводом.Например:
rb.AddForce(transform.forward * thrust);
rb.AddForce(transform.forward * -thrust);
rb.AddForce(transform.right* thrust);
rb.AddForce(transform.right* -thrust);
Преобразовать вперед, чтобы двигаться вперед.Отрицательная тяга для движения назад.Вы также можете применить тягу в правильном направлении и отрицательном правильном направлении.Я бы по-прежнему использовал перевод для вращения только потому, что вам, вероятно, будет легче.
Возможно, вы захотите установить высокое трение на объекте, чтобы он быстро останавливался, как при использовании перевода.
Расширенный пример:
public float thrust = 5f;
public Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Movement code.
if (Input.GetKey(KeyCode.UpArrow))
{
rb.AddForce(transform.forward * thrust);
}
if (Input.GetKey(KeyCode.DownArrow))
{
rb.AddForce(transform.forward * -thrust);
}
if (Input.GetKey(KeyCode.RightArrow))
{
rb.AddForce(transform.right* thrust);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rb.AddForce(transform.right* -thrust);
}
// Your rotation code
if (Input.GetMouseButton(1))
{
_rotationX += Input.GetAxis("Mouse X") * CameraSensitivity * Time.deltaTime;
_rotationY += Input.GetAxis("Mouse Y") * CameraSensitivity * Time.deltaTime;
_rotationY = Mathf.Clamp(_rotationY, -90, 90);
}
Quaternion targetRotation = Quaternion.AngleAxis(_rotationX, Vector3.up);
targetRotation *= Quaternion.AngleAxis(_rotationY, Vector3.left);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 4f);
}