状態遷移のサンプル

状態遷移と初期化を担当するswitchと実行フェイズを担当するswitchのふたつを組み合わせて管理する手法


初歩的な状態管理の手法で非常に重要なのでよく理解する事
update()のような毎フレーム呼び出される処理でも能率よく動くように設計される必要があり、このような形になりやすい
デザインパターンの一種だと思われる


using UnityEngine;
using System.Collections;

public class designPattern_seni : MonoBehaviour {
  
   GameObject go;
   
   enum STEP
   {
       NONE=-1,
       START,
       MOVE,
       GOAL,
       CONTINUE
   }
   
   STEP step = STEP.NONE;
   float stepTimer = 0.0f;
   bool isReachGoal = false;
   bool isMove = false;
   string goalStr;
   
   // Use this for initialization
   void Start () {
       go = GameObject.FindGameObjectWithTag("Player");
       step = STEP.START;
   }
   
   // Update is called once per frame
   void Update () {
       
       stepTimer += Time.deltaTime;
       
       //遷移&初期化フェイズ 
       switch (step) {
           
           case STEP.START:
           {
               if(isMove)
               {
                   step = STEP.MOVE;
                   go.transform.position = new Vector3(0.0f,0.5f,0.0f);
               }
           }
           break;
           
           case STEP.MOVE:
           {
               if(isReachGoal)
               {
                   step = STEP.GOAL;
                   goalStr="GOAL!!";    
               }
           }
           break;
           
           case STEP.GOAL:
           {
               print("GOAL!");
               step = STEP.CONTINUE; 
           }
           break;
       }
       
       
       //実行フェイズ 
       switch (step) {
           
           case STEP.START:
           {
               if(stepTimer >= 3)    //3秒待ってMOVE開始 
               {
                   isMove =  true;
                   stepTimer = 0;
               }
           }
           break;
           
           case STEP.MOVE:
           {
               go.transform.Translate(Vector3.right*Time.deltaTime);
               if(go.transform.position.x >= 5)
               {
                   isReachGoal = true;
               }
           }
           break;
           
           case STEP.CONTINUE:
           {
               if(Input.GetMouseButtonDown(0))
               {
                   isMove=false;
                   isReachGoal=false;
                   step = STEP.START;
                   stepTimer = 0;
               }
           }
           break;
       
       }
       
   }
}

メニュー



  • 最終更新:2014-06-13 12:12:39

このWIKIを編集するにはパスワード入力が必要です

認証パスワード