2

所以我的“场景”中有一个小传感器,当它被阻塞时,我希望我的程序等待 4 秒,如果传感器仍然被阻塞,我希望它提醒用户。

如果传感器仍然被阻塞,该脚本可以正常工作。

但是,如果您阻塞传感器的时间少于 4 秒,然后从传感器中取出部件(这将导致没有警报,因为传感器不再被阻塞),即使条件不再为真,警报仍会运行。

任何朋友都可以看到我在这里做错了什么吗?

OnBlocked()函数在传感器被阻塞时OnCleared()运行,该函数在传感器被清除时运行。

OnisBlockedUpdated()函数在 isBlocked 属性更新时运行。

function OnBlocked( sender : Demo3D.Visuals.PhysicsObject, load : Demo3D.Visuals.Visual )
{
    sender.isBlocked = true;
    sender.PropertiesUpdated();
}

function OnCleared( sender : Demo3D.Visuals.PhysicsObject, load : Demo3D.Visuals.Visual )
{
    sender.isBlocked = false;
    sender.PropertiesUpdated();
}

function OnisBlockedUpdated( sender : Demo3D.Visuals.BoxVisual, value : System.Boolean, oldValue )
{
    var blockingObj : Demo3D.Visuals.BoxVisual = sender.BlockingLoad;

    if (value)
    {   
        print("isBlocked");
        wait(4);
        sender.PropertiesUpdated();
        if(value)
        {
            alert("The object '" + blockingObj + "' is too tall for this bay.");
        }
        else
        {
            return;
        }
    }
    if(!value)
    {
        print("cleared");
        return;
    }   
}
4

1 回答 1

2

如果您阻塞传感器的时间少于 4 秒,然后从传感器中取出部件(这应该不会导致警报,因为传感器不再被阻塞)警报仍然运行,即使条件不再为真

当您执行 时,该函数仍在运行wait(),并且value参数将按值传递,而不是按引用传递,因此它不会在函数体的中间发生变化。

如果要在等待完成后评估该值,则必须获取当前值,而不是传递给函数的值。

尝试:

if (value)
{   
    print("isBlocked");
    wait(4);
    sender.PropertiesUpdated();
    if(sender.isBlocked) // *** This is the line I changed
    {
        // ...

虽然我不确定它是否与or函数sender中的对象相同,因为它是不同的类型。您可能需要想办法获取对同一对象的引用。OnBlockedOnClearedsender : Demo3D.Visuals.PhysicsObject

于 2011-12-09T13:37:14.207 回答