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

        myAI = GetComponent <AIMoveController>();
    }
コード例 #2
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.toNormal:
                obj.getSM().changeState(NormalState.Instance());
                break;

            case MovableMsg.moveDown:    //降落

                if (!obj.downTileIsBlock())
                {
                    obj.setFallTargetY(true);
                    obj.getSM().changeState(FallToTargetState.Instance());
                }

                break;

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

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

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

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

            case MovableMsg.moveUp:
                //通知發訊者此動作無效
                if (msg.sender != null)
                {
                    //從繩子移到JumpPoint會發動fall to rope,這時目標就停留在JumpPoint
                    //
                    //--J
                    //  --
                    if (Movable.Debug_do_moveUp)
                    {
                        obj.printDebugMsg("[注意!]do MoveUp on rope");
                    }
                    AIMoveController ai = msg.sender.myAI;
                    ai.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.reFindPath, null));
                }
                break;
            }
        }
コード例 #3
0
    void setAIContext(UserMoveController player)
    {
        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                GameObject obj = tileCreator.getObj(x, y);
                if (obj != null)
                {
                    Movable movable = obj.GetComponentInChildren <Movable>();
                    if (movable != null)
                    {
                        movable.graphBuilder = this;
                    }

                    AIMoveController ai = obj.GetComponentInChildren <AIMoveController>();
                    if (ai != null)
                    {
                        ai.player   = player;
                        ai.graphMap = graphMap;
                    }
                }
            }
        }
    }
コード例 #4
0
    void OnTriggerExit2D(Collider2D other)
    {
        Debug.Log("exit trap");

        if (catchAI != null)
        {
            catchAI = null;
        }

        catchPlayer = null;
    }
コード例 #5
0
    void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("enter trap");
        catchPlayer = other.gameObject.GetComponent <UserMoveController>();
        catchAI     = other.gameObject.GetComponent <AIMoveController>();

        if (catchAI != null)
        {
            catchAI.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.catchByTrap, null));
        }
    }
コード例 #6
0
ファイル: Trap.cs プロジェクト: xiangwei71/LodeRunner
    void OnTriggerExit2D(Collider2D other)
    {
        Debug.Log("exit trap");

        if (catchAI != null)
        {
            catchAI = null;
        }

        catchPlayer = null;
    }
コード例 #7
0
ファイル: Trap.cs プロジェクト: xiangwei71/LodeRunner
    void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("enter trap");
        catchPlayer = other.gameObject.GetComponent<UserMoveController>();
        catchAI = other.gameObject.GetComponent<AIMoveController>();

        if (catchAI != null)
        {
            catchAI.getSM().handleMessage(new StateMsg((int)AIMsg.catchByTrap));
        }
    }
コード例 #8
0
    private void Awake()
    {
        if (!p_cController)
        {
            p_cController = GetComponent <CharacterController>();
        }
        if (!p_fpController)
        {
            p_fpController = GetComponent <FirstPersonController>();
        }
        if (!ai_navMeshAgent)
        {
            ai_navMeshAgent = GetComponent <NavMeshAgent>();
        }
        if (!ai_AIMoveController)
        {
            ai_AIMoveController = GetComponent <AIMoveController>();
        }
        if (!p_playerController)
        {
            p_playerController = GetComponent <PlayerController>();
        }
        if (!healthManager)
        {
            healthManager = GetComponent <HealthManager>();
        }

        healthManager.onDeath += () => GameOver();

        if (!p_camera)
        {
            p_camera = GetComponentInChildren <Camera>();
        }

        if (startAsPlayer)
        {
            ChangeState(ControlState.Player);
        }
        else
        {
            ChangeState(ControlState.AI);
        }
    }
コード例 #9
0
    void handleTooClose(AIMoveController ai, funPtr doFunction)
    {
        //迎面而來的情況 => <=
        //比較距離,近者勝出;距離一樣,先搶先贏
        var     myAInowTarget = myAI.getNowTarget();
        Vector2 v1            = transform.position - myAInowTarget.GetPosition();
        Vector2 v2            = ai.transform.position - myAInowTarget.GetPosition();
        float   myD           = v1.sqrMagnitude;
        float   d             = v2.sqrMagnitude;

        if (myD < d)
        {
            if (Debug_Oncoming)
            {
                printDebugMsg("我比" + ai.name + "近");
            }

            doFunction(this);
        }
        else if (myD > d)
        {
            if (Debug_Oncoming)
            {
                printDebugMsg("我比[" + ai.name + "]遠他的行動(" + ai.movable.getMoveCommand().ToString() + ")");
            }

            myAI.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.waitForSomebody, ai));
        }
        else //看來是平手了
        {
            if (Debug_Oncoming)
            {
                printDebugMsg(ai.name + "等我 (" + myD + "," + d + ")");
            }
            ai.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.waitForSomebody, myAI));
            doFunction(this);
        }
    }
コード例 #10
0
 void clearWaitAI( )
 {
     waitThisAI = null;
 }
コード例 #11
0
 void setWaitThisAI(AIMoveController ai)
 {
     waitThisAI = ai;
 }
コード例 #12
0
 private void Awake()
 {
     aiMoveController = GetComponentInParent <AIMoveController>();
 }
コード例 #13
0
    void preMove(Vector2 dir)
    {
        if (Mathf.Abs(dir.x) > Mathf.Abs(dir.y))
        {
            //左右移動
            if (dir.x > 0)
            {
                AIMoveController ai = tooCloseDetect(
                    new Vector2(Movable.tooCloseOffset, Movable.tooCloseHalfLongSide),
                    new Vector2(Movable.tooCloseOffset + Movable.tooCloseShortSide, Movable.tooCloseHalfLongSide),
                    new Vector2(Movable.tooCloseOffset, -Movable.tooCloseHalfLongSide),
                    new Vector2(Movable.tooCloseOffset + Movable.tooCloseShortSide, -Movable.tooCloseHalfLongSide)
                    );
                if (ai != null)
                {
                    bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI;
                    bool aiOnAir           = ai.movable.getSM().getCurrentState() == Movable.OnAirState.Instance();
                    bool isBothHorizontal  = Mathf.Abs(ai.transform.position.y - this.transform.position.y) < 0.5f;
                    bool fitCommand        = ai.getMoveCommand() == MoveCommand.right ||
                                             ai.getMoveCommand() == MoveCommand.up ||
                                             ai.getMoveCommand() == MoveCommand.down ||
                                             (ai.getMoveCommand() == MoveCommand.stop && isBothHorizontal);

                    bool stopSituation = fitCommand || aiOnAir || aiWaitButNotForMe;
                    if (stopSituation)
                    {
                        this.sendMsgStopMove();
                    }
                    else
                    {
                        handleTooClose(ai, this.sendMsgMoveRight);
                    }
                }
                else
                {
                    this.sendMsgMoveRight();
                }
            }
            else if (dir.x < 0)
            {
                AIMoveController ai = tooCloseDetect(
                    new Vector2(-Movable.tooCloseOffset, Movable.tooCloseHalfLongSide),
                    new Vector2(-Movable.tooCloseOffset - Movable.tooCloseShortSide, Movable.tooCloseHalfLongSide),
                    new Vector2(-Movable.tooCloseOffset, -Movable.tooCloseHalfLongSide),
                    new Vector2(-Movable.tooCloseOffset - Movable.tooCloseShortSide, -Movable.tooCloseHalfLongSide)
                    );
                if (ai != null)
                {
                    bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI;
                    bool aiOnAir           = ai.movable.getSM().getCurrentState() == Movable.OnAirState.Instance();
                    bool isBothHorizontal  = Mathf.Abs(ai.transform.position.y - this.transform.position.y) < 0.5f;
                    bool fitCommand        = ai.getMoveCommand() == MoveCommand.left ||
                                             ai.getMoveCommand() == MoveCommand.up ||
                                             ai.getMoveCommand() == MoveCommand.down ||
                                             (ai.getMoveCommand() == MoveCommand.stop && isBothHorizontal);
                    bool stopSituation = fitCommand || aiOnAir || aiWaitButNotForMe;
                    if (stopSituation)
                    {
                        this.sendMsgStopMove();
                    }
                    else
                    {
                        handleTooClose(ai, this.sendMsgMoveLeft);
                    }
                }
                else
                {
                    this.sendMsgMoveLeft();
                }
            }
        }
        else
        {
            //上下移動
            if (dir.y > 0)
            {
                AIMoveController ai = tooCloseDetect(new Vector2(-Movable.tooCloseHalfLongSide, Movable.tooCloseOffset + Movable.tooCloseShortSide),
                                                     new Vector2(Movable.tooCloseHalfLongSide, Movable.tooCloseOffset + Movable.tooCloseShortSide),
                                                     new Vector2(-Movable.tooCloseHalfLongSide, Movable.tooCloseOffset),
                                                     new Vector2(Movable.tooCloseHalfLongSide, Movable.tooCloseOffset)
                                                     );
                if (ai != null)
                {
                    bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI;

                    bool fitCommand = ai.getMoveCommand() == MoveCommand.up ||
                                      ai.getMoveCommand() == MoveCommand.left ||
                                      ai.getMoveCommand() == MoveCommand.right;

                    //LodeRunnerScreenshot\fixed\互等的情況.jpg
                    //爬梯子往上,碰到上面的AI是stop時,自己才要stop
                    bool aiStopAndOnLadder = ai.getMoveCommand() == MoveCommand.stop && ai.movable.getSM().getCurrentState() == Movable.OnLabberState.Instance();

                    bool stopSituation = fitCommand || aiWaitButNotForMe || aiStopAndOnLadder;

                    if (Debug_Oncoming)
                    {
                        if (aiStopAndOnLadder)
                        {
                            printDebugMsg("[注意]aiStopAndOnLadder");
                        }
                        else
                        {
                            printDebugMsg("[注意]aiStop but not OnLadder");
                        }
                    }

                    if (stopSituation)
                    {
                        this.sendMsgStopMove();
                    }
                    else
                    {
                        //如果對方正往下落,就還是往上
                        bool aiIsFallToTarget = ai.movable.getSM().getCurrentState() == Movable.FallToTargetState.Instance();
                        if (aiIsFallToTarget)
                        {
                            this.sendMsgMoveUp(this);
                        }
                        else
                        {
                            handleTooClose(ai, this.sendMsgMoveUp);
                        }
                    }
                }
                else
                {
                    this.sendMsgMoveUp(this);
                }
            }
            else if (dir.y < 0)
            {
                AIMoveController ai = tooCloseDetect(new Vector2(-Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset - Movable.tooCloseShortSide),
                                                     new Vector2(Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset - Movable.tooCloseShortSide),
                                                     new Vector2(-Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset),
                                                     new Vector2(Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset)
                                                     );
                if (ai != null)
                {
                    bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI;
                    bool fitCommand        = ai.getMoveCommand() == MoveCommand.down ||
                                             ai.getMoveCommand() == MoveCommand.left ||
                                             ai.getMoveCommand() == MoveCommand.right ||
                                             ai.getMoveCommand() == MoveCommand.stop;
                    bool stopSituation = fitCommand || aiWaitButNotForMe;

                    if (stopSituation)
                    {
                        this.sendMsgStopMove();
                    }
                    else
                    {
                        handleTooClose(ai, this.sendMsgMoveDown);
                    }
                }
                else
                {
                    this.sendMsgMoveDown();
                }
            }
        }
    }
コード例 #14
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;
            }
        }