закон сохранения импульса контроллеру

Я совсем не разбираюсь в физике. Подскажите, как сделать так, чтобы контроллер соблюдал закон сохранения импульса когда прыгает? а то во время прыжка можно резко менять траекторию полёта...

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);
    }
    }
}

Ответы (0 шт):