基本上,我的问题是,有没有什么方法可以创建一个事件,当连接到Gameobject的Rigidbody被设为Kinematic True时会做什么?
我有一个问题,即当某个物体的运动状态为真时,我必须在1或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拨打