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
    {
        // ...

または関数senderと同じオブジェクトになるかどうかはわかりませんが、タイプが異なるためです。同じオブジェクトへの参照を取得するための何らかの方法を理解する必要があるかもしれません。OnBlockedOnClearedsender : Demo3D.Visuals.PhysicsObject

于 2011-12-09T13:37:14.207 に答える