如何访问 OnVelocityChange 事件?

问题描述 投票:0回答:2

我有一些参数rigidbody.velocity

我需要跟踪这个,并且,如果参数发生变化,则必须执行某些操作。

怎么做?

c# windows unity3d game-physics rigid-bodies
2个回答
0
投票

因为这是第三个库(在本例中为 unity)的属性,您不能简单地添加一些东西来跟踪它,您可以做的是创建一个层,将信息传递给刚体并触发事件你希望在做之前或之后,在这条线上做点什么。然后你需要确保速度的所有变化都通过这个类

    [RequireComponent(typeof(Rigidbody))]
    public class MyClass : MonoBehaviour
    {
        private new Rigidbody rigidbody;
        private Rigidbody Rigidbody => rigidbody == null
            ? rigidbody = GetComponent<Rigidbody>()
            : rigidbody;

        public event Action<(Vector3 oldValue, Vector3 newValue)> OnChangingRigidbodyVelocity;
        public event Action<Vector3> OnChangedRigidbodyVelocity;
        
        public Vector3 Velocity
        {
            get => Rigidbody.velocity;
            set
            {
                var oldValue = Rigidbody.velocity;
                OnChangingRigidbodyVelocity?.Invoke((oldValue, value));
                Rigidbody.velocity = value;
                OnChangedRigidbodyVelocity?.Invoke(value);
            }
        }
    }

0
投票

你的问题有一个非常简单的答案。每当您在代码中更改此变量时,您都可以调用更改事件。其实就是一个类似Property的功能。但是因为你的变量是

rb.velocity
并且你想检查它的变化。如下,记录上一帧的值,并在重置前与当前值进行核对。

注意 2D 中的速度是 Vector2D。

private Vector3 lastVelocity; // cache previous frame rb.velocity
public void Update()
{
    if (rb.velocity != lastVelocity)
    {
        OnVeloictyChange(rb.velocity-lastVelocity);
    }
    
    lastVelocity = rb.velocity;
}

private void OnVeloictyChange(Vector3 delta)
{
     // value is changed This Frame, So Event code is here
}
© www.soinside.com 2019 - 2024. All rights reserved.