unity3d 如何访问OnVelocityChange事件?

7eumitmz  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(141)

我有一些参数(* 刚体.速度 *)
我需要跟踪这一点,如果参数被更改,则必须执行某些操作。
怎么做?

2j4z5cfb

2j4z5cfb1#

你的问题有一个非常简单的答案。每当你在代码中改变这个变量时,你可以调用change事件。事实上,一个类似于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
}
3htmauhk

3htmauhk2#

由于这是第三个库的属性(在本例中为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);
            }
        }
    }

相关问题