закон сохранения импульса контроллеру
Я совсем не разбираюсь в физике. Подскажите, как сделать так, чтобы контроллер соблюдал закон сохранения импульса когда прыгает? а то во время прыжка можно резко менять траекторию полёта...
using System.Collections.Generic;
using UnityEngine;
public class FirstPersonMovement : MonoBehaviour
{
public Camera DefaultCam;
public Camera WeaponCam;
public float smoothTime = 0.3f; // Время, за которое FOV должен измениться
public float camvelocity = 0.0f; // Скорость изменения FOV
public float defaultFOV = 80;
public float speed = 5;
private bool isInGround;
[Header("Running")]
public bool canRun = true;
public bool IsRunning { get; private set; }
public float runSpeed = 9;
public KeyCode runningKey = KeyCode.LeftShift;
public float tms;
private Rigidbody rigidbody;
/// <summary> Functions to override movement speed. Will use the last added override. </summary>
public List<System.Func<float>> speedOverrides = new List<System.Func<float>>();
private bool canControl = true;
void Awake()
{
// Get the rigidbody on this.
rigidbody = GetComponent<Rigidbody>();
}
void Update()
{
isInGround = GameObject.Find("Ground Check").GetComponent<GroundCheck>().isGrounded;
}
void OnTriggerStay()
{
if (isInGround == false)
{
// Если луч столкнулся с чем-то во время полёта, обнуляем скорость.
//rigidbody.velocity = new Vector3(rigidbody.velocity.x, -1f, rigidbody.velocity.z);
canControl = false;
}
else if (isInGround == true)
{
canControl = true;
}
}
void OnTriggerExit()
{
canControl = true;
}
void FixedUpdate()
{
// Update IsRunning from input.
IsRunning = canRun && Input.GetKey(runningKey);
if (IsRunning && Input.GetKey(runningKey))
{
// Плавно увеличиваем FOV
float newFOV = Mathf.SmoothDamp(Camera.main.fieldOfView, defaultFOV + 10, ref camvelocity, smoothTime);
DefaultCam.fieldOfView = newFOV;
WeaponCam.fieldOfView = newFOV;
}
else
{
// Плавно возвращаем FOV к исходному значению
float newFOV = Mathf.SmoothDamp(Camera.main.fieldOfView, defaultFOV, ref camvelocity, smoothTime);
DefaultCam.fieldOfView = newFOV;
WeaponCam.fieldOfView = newFOV;
}
// Get targetMovingSpeed.
float targetMovingSpeed = IsRunning ? runSpeed : speed;
tms = targetMovingSpeed;
if (speedOverrides.Count > 0)
{
targetMovingSpeed = speedOverrides[speedOverrides.Count - 1]();
}
// Get targetVelocity from input.
Vector2 targetVelocity =new Vector2( Input.GetAxis("Horizontal") * tms, Input.GetAxis("Vertical") * tms);
if (canControl)
{
// Apply movement.
rigidbody.linearVelocity = transform.rotation * new Vector3(targetVelocity.x, rigidbody.linearVelocity.y, targetVelocity.y);
}
}
}