void Awake() { AIMask = LayerMask.GetMask("AI"); sm = new StateMachine <Movable>(this, OnAirState.Instance()); myAI = GetComponent <AIMoveController>(); }
public static OnAirState Instance() { if (instance == null) { instance = new OnAirState(); } return(instance); }
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; } }
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(); } }
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; } }