예제 #1
0
    void Awake()
    {
        AIMask = LayerMask.GetMask("AI");
        sm     = new StateMachine <Movable>(this, OnAirState.Instance());

        myAI = GetComponent <AIMoveController>();
    }
예제 #2
0
 public static OnAirState Instance()
 {
     if (instance == null)
     {
         instance = new OnAirState();
     }
     return(instance);
 }
예제 #3
0
        public override void onMessage(Movable obj, StateMsg <Movable> msg)
        {
            MovableMsg type = (MovableMsg)msg.type;

            switch (type)
            {
            case MovableMsg.jumpFromRope:
                obj.getSM().changeState(OnAirState.Instance());
                break;

            case MovableMsg.fallToAlignRopeFinish:
                obj.getSM().changeState(OnRopeState.Instance());
                break;
            }
        }
예제 #4
0
        public override void enter(Movable obj)
        {
            if (Movable.Debug_enter_state)
            {
                obj.printDebugMsg("On Rope");
            }

            //failToTarget才可以停住
            obj.doStopMove();

            bool fromLadder = obj.getSM().getPreviousState() == OnLabberState.Instance();
            bool fromAir    = obj.getSM().getPreviousState() == OnAirState.Instance();

            if (fromLadder)
            {
                obj.adjustWhenFromLadderToRope();
            }
            else if (fromAir)
            {
                obj.adjustY();
            }
        }
예제 #5
0
        public override void onMessage(Movable obj, StateMsg <Movable> msg)
        {
            MovableMsg type = (MovableMsg)msg.type;

            switch (type)
            {
            case MovableMsg.onLabber:
                obj.getSM().changeState(OnLabberState.Instance());
                break;

            case MovableMsg.onRope:
                obj.getSM().changeState(OnRopeState.Instance());
                break;

            case MovableMsg.onAir:
                obj.getSM().changeState(OnAirState.Instance());
                break;

            case MovableMsg.fallToAlignRope:    //站在rope上時
                obj.setFallTargetY(false);
                obj.getSM().changeState(FallToTargetState.Instance());
                break;

            case MovableMsg.moveLeft:
                obj.doMoveLeft();
                break;

            case MovableMsg.moveRight:
                obj.doMoveRight();
                break;

            case MovableMsg.stopMove:
                obj.doStopMove();
                break;

            case MovableMsg.wait:
                obj.doWait();
                break;

            case MovableMsg.moveDown:
                if (!obj.downTileIsBlock())
                {
                    obj.doMoveDown();
                }
                break;

            case MovableMsg.toKinematic:
                obj.getSM().changeState(KinematicState.Instance());
                break;

            case MovableMsg.moveUp:
                //通知發訊者此動作無效
                if (msg.sender != null)
                {
                    //解決[在梯子卡點]的問題
                    //從H往下走,但因為有其他AI檔在下面,所以進入stop;之後reFindPath,y就會低於pathNode
                    //  O
                    //口H口口
                    obj.adjustY();

                    //這是為了解決從高處落下,MoveTargetPoint還在上面的問題(在normal狀態如果執行moveUp就觸發reFindPath)
                    //   .
                    //    口口
                    //   .
                    //口口口口

                    //降落在Brick、Stone、ladder時觸發
                    if (Movable.Debug_do_moveUp)
                    {
                        obj.printDebugMsg("[注意!]do MoveUp on Normal");
                    }
                    AIMoveController ai = msg.sender.myAI;
                    ai.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.reFindPath, null));
                }
                break;
            }
        }