两个光线投射会导致滞后

本文关键字:滞后 光线投射 两个 | 更新日期: 2023-09-27 18:21:06

我需要你的帮助。我制作了一个悬停汽车运动脚本。到地面的距离和悬停移动由Raycast计算,我制作了另一个Raycast,因为有一个问题——如果你按住按钮,悬停飞得太高。但现在有了两个射线投射,它会造成滞后——悬停会突然移动插值没有帮助。

如何使平滑移动而不抖动?请帮帮我。

public class hoverController_v7 : MonoBehaviour
        Rigidbody carBody;
        float deadZone = 0.1f;
        public float hoverForce = 9.0f;     
        public float hoverHeight = 2.0f;    
        public GameObject[] hoverPoints;
        public float forwardAcceleration = 100.0f;  
        public float backwardAcceleration = 25.0f;
        public float currThrust = 0.0f;
        public float turnStrength = 10.0f;      
        public float currTurn = 0.0f;               
        public GameObject leftAirBrake;
        public GameObject rightAirBrake;
        int layerMask;

        void Start()
        {
            carBody = GetComponent<Rigidbody>();
            layerMask = 1 <<     LayerMask.NameToLayer("Characters");
            layerMask = ~layerMask;

        }
        void OnDrawGizmos()
        {
            // сила hoverForce
            RaycastHit hit;
            for(int i = 0; i < hoverPoints.Length; i++)
            {
                var hoverPoint = hoverPoints[i];
                if(Physics.Raycast(hoverPoint.transform.position,
                                   -Vector3.up, out hit,
                                   hoverHeight,
                                   layerMask))
                {
                    Gizmos.color = Color.yellow;
                    //Color if correctly alligned
                    Gizmos.DrawLine(hoverPoint.transform.position, hit.point);
                    Gizmos.DrawSphere(hit.point, 0.5f);
                }
                else
                {
                    Gizmos.color = Color.red;
                    //Color if incorrectly alligned
                    Gizmos.DrawLine (hoverPoint.transform.position, hoverPoint.transform.position - Vector3.up * hoverHeight);
                }
            }
        }
        void Update()
        {
            // main thrust
            currThrust = 0.0f;
            float aclAxis = Input.GetAxis("Vertical");
            if(aclAxis > deadZone)
            {
                currThrust = aclAxis * forwardAcceleration;
            }
            else if(aclAxis < -deadZone)
            {
                currThrust = aclAxis * backwardAcceleration;
            }
            // Turning
            currTurn = 0.0f;
            float turnAxis = Input.GetAxis("Mouse X") * 2;
            if(Mathf.Abs(turnAxis) > deadZone)
                currTurn = turnAxis;
        }
        void FixedUpdate()
        {
            // hover force
            RaycastHit hit;
            for(int i = 0; i < hoverPoints.Length; i++)
            {
                var hoverPoint = hoverPoints[i];
                if(Physics.Raycast(hoverPoint.transform.position, 
                                   -Vector3.up, out hit,
                                   hoverHeight, layerMask))
                    carBody.AddForceAtPosition(Vector3.up * hoverForce * (1.0f -(hit.distance / hoverHeight)), 
                                               hoverPoint.transform.position);
                else
                {
                    if(transform.position.y > hoverPoint.transform.position.y)
                        carBody.AddForceAtPosition(hoverPoint.transform.up * hoverForce, hoverPoint.transform.position);
                    else
                        //add force to car
                        carBody.AddForceAtPosition(hoverPoint.transform.up * -hoverForce, hoverPoint.transform.position);
                }
            }
            // forward
            RaycastHit hit2;
            if(Physics.Raycast(transform.position, -transform.up, out hit2))
            {
                if(hit2.distance < 2)
                {
                    if(Mathf.Abs(currThrust) > 0)
                    {
                        carBody.AddForce(transform.forward * currThrust);
                    }
                }
            }
            // turn
            if(currTurn > 0)
            {
                carBody.AddRelativeTorque(Vector3.up * currTurn * turnStrength);
            }
            else if(currTurn < 0)
            {
                carBody.AddRelativeTorque(Vector3.up * currTurn * turnStrength);
            }
        }
    }

两个光线投射会导致滞后

您需要重新思考游戏的逻辑。光线投射在计算上很昂贵。你在FixedUpdate()上开了两枪。然后在更新中有一个for循环,这通常是个坏主意。

如果您真的需要知道到地面的距离,请在Update()上进行光线投射。