有没有什么方法可以创建一个事件,只要Rigidbody成为Kinematic True就会启动一个函数?

时间:2018-02-21 07:52:34

标签: c# unity3d

基本上,我的问题是,有没有什么方法可以创建一个事件,当连接到Gameobject的Rigidbody被设为Kinematic True时会做什么?

我有一个问题,即当某个物体的运动状态为真时,我必须在1或2秒后使相同的物体运动失真

2 个答案:

答案 0 :(得分:2)

重要提示:此方法要求您更改从所有代码中引用刚体的isKinematic变量的方式。

首先创建一个属性来设置isKinematic,而不是直接通过刚体访问。

private Rigidbody rb;

public bool IsKinematic
{
    get
    {
        return rb.isKinematic;
    }
    set
    {
        rb.isKinematic = value;
    }
}

现在声明一个在isKinematic发生变化时触发的事件。

public event EventHandler OnKinematicValueChange;

并将您的isKinematic属性修改为:

public bool IsKinematic
{
    get
    {
        return rb.isKinematic;
    }
    set
    {
        // Similar to if (OnKinematicValueChange != null) OnKinematicValueChange(this, EventArgs.Empty)
        OnKinematicValueChange?.Invoke(this, EventArgs.Empty);
        rb.isKinematic = value;
    }
}

这样可以确保每次通过属性更改isKinematic时都会触发OnKinematicValueChange事件。

最后,请确保在Awake / Start方法中订阅该事件,以便每次更改isKinematic时都会触发该事件。

private void Awake()
{
    OnKinematicValueChange += OnKinematicValueChangeHandler;

    // or

    OnKinematicValueChange += (sender, args) => 
    {
        // Event handling stuff
        // Disable isKinematic after 2 seconds with Coroutine etc.
    };
{

private void OnKinematicValueChangeHandler(object sender, EventArgs args);
{
    // Event handling stuff
    // Disable isKinematic after 2 seconds with Coroutine etc.
{

从这一点开始,您需要使用IsKinematic属性更改对RigidBody的isKinematic变量的所有引用。

确保还检查属性中的Rigidbody null并提供处理代码。

答案 1 :(得分:1)

您可以在更新功能中查看它。

if (yourGameObject.GetComponent<Rigidbody>().isKinematic == true)    
{
    yourGameObject.GetComponent<Rigidbody>().isKinematic = false; 
}

如果您想在1或2秒后设置它,您可以将设置功能放在IEnumerator 中,或者在等待时间从Invoke拨打