SlideShare uma empresa Scribd logo
1 de 11
FSM in Unity3d

skyseer00@hotmail.com
FSM?
• Finite State Marchine(유한상태머신)
  – 유한개의 상태와 이런 상태들 간의 변환으로 구성된
    계산 모형.
  – 게임에서는 주로 몬스터AI 구현에 사용

• 유니티에서의 FSM
  – 코루틴(Coroutine) 을 사용
     • 스레드와 비슷한 결과를 만들지만 스레드와 달리 동시에
       하나만 수행하는 프로그래밍 기법(단일 스레드)
     • 부하가 걸리는 작업을 나눠서 시행하기 위해서도 사용
     • 코루틴은 루아(Lua)등 에서도 사용
     • StartCoroutine(시작), IEnumerator(리턴), yield return(양보)
       키워드 사용
Coroutine VS
• Coroutine VS 스레드
  – 둘다, 독립적인 동작 구현을 위해 사용
  – 코루틴은 자원공유 문제를 고민할 필요가 없다

• Coroutine VS Update
  – 둘다, 일정 주기마다 특정 작업을 반복하도록
    프로그램을 구성할 때 사용(콜백 함수)
  – 코루틴은 필요에 따라 호출을 제어(호출 시간, 호출
    중지)할 수 있으므로 CPU의 자원을 덜 소비
  – 코루틴은 가상화 함수가 아니기 때문에 오버헤드가
    없어서 Call부하는 없음… 실제 FPS에 영향은 없음.
Unity3d Coroutine 의 기본 구조
<ex_Coroutine.cs>
• StartCoRoutine(시작) StartCoroutine("FSM");
    void Start () {
         print ("A");
• IEnumerator(리턴)
         StartCoroutine("Example"); //StartCoroutine(Example(2.0f));
         print ("C");
• yield return(양보) 키워드 사용
    }

    IEnumerator Example(){             //IEnumerator Example(float waitTime){
        while(true){
             print ("B");
             yield return null;        //yield return new WaitForSeconds(waitTime);
        }
    }

  void Update () {
        print ("D");
  }
결과 : A B C D B D B D…..
결과 : A B C D D D…..D B D….. D B D…..
몬스터 AI 설계
• Init – 초기 몬스터 세팅            Spawn
                                                    StartCoroutine(“BattleFSM”)
                    StartCoroutine(IdleFSM(5.0f))
• Idle - 유휴                                                      Retreat
• Move – 이동                    Init
• Search – 플레이어 감지
                                                                  Chase
                                               Update ()
•   Chase – 추격 이동              Idle

•   Attack – 공격                                 Search
                                                                 Attack
•   Retreat - 후퇴              Move
•   Flee – 도망
                                                                  Flee
몬스터 AI 구현


<Monster.cs>

     private enum State {
           Init,             //make sure that everything we need is here
           Idle,             //do nothing
           Move,             //random moving
           //Setup,                 //assign the values to the things we need
           //Search,                //find the player
           Chase,            //move to player
           Attack,                  //attack the player
           Retreat,          //retreat to spawn point
           Flee              //run to the nearest spawn point with another mob
     }
몬스터 AI 구현
     void Start() {
            _state = MonsterObject.State.Init;
            StartCoroutine(IdleFSM(5.0f));

     }

     private IEnumerator IdleFSM(float waitTime) {
           while(_alive) {
//               Debug.Log("Alive: " + _alive);
                 switch(_state) {
                 case State.Init:
                        Init();
                        break;
                 case State.Idle:
                        Idle();
                        break;
                 case State.Move:
                        Move();
                        break;
                 }

                 yield return new WaitForSeconds(waitTime);
           }
     }
몬스터 AI 구현
     private IEnumerator BattleFSM() {
           while(_alive) {
//               Debug.Log("Alive: " + _alive);
                 switch(_state) {
                 case State.Chase:
                        Chase();
                        break;
                 case State.Attack:
                        Attack();
                        break;
                 case State.Retreat:
                        Retreat();
                        break;
                 case State.Flee:
                        Flee();
                        break;
                 }

                 yield return null;
           }
     }
몬스터 AI 구현

      void Update ()
      {

            Debug.DrawLine(_target.transform.position, _myTransform.position, Color.yellow);

            if(_balttle == false){
                   if(Vector3.Distance(_target.position, _myTransform.position) > maxCloseDistance &&
Vector3.Distance(_target.position, _myTransform.position) < findPlayerDistance){
                          Debug.Log("***Battle Start***");
                          _balttle = true;
                          StopCoroutine("IdleFSM");
                          StartCoroutine("BattleFSM");
                          _state = MonsterObject.State.Chase;
                   }
            }

      }
FSM의 활용
• 스스로 여러개의 상태를 갖고 스스로
  상태를 변화시키는 모든 객체에 활용 가능
 – Ex. MonsterGenerator, AnimateSprite컴포넌트
참고 사이트
•

Mais conteúdo relacionado

Mais procurados

Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Tiago Sousa
 
3GPP TS 38.300-100まとめ
3GPP TS 38.300-100まとめ3GPP TS 38.300-100まとめ
3GPP TS 38.300-100まとめTetsuya Hasegawa
 
TCAMのしくみ
TCAMのしくみTCAMのしくみ
TCAMのしくみogatay
 
Teclas atalho do Blender
Teclas atalho do BlenderTeclas atalho do Blender
Teclas atalho do Blendermarleigrolli
 
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기Sangik Bae
 
제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현민웅 이
 
本当は楽しいインターネット
本当は楽しいインターネット本当は楽しいインターネット
本当は楽しいインターネットYuya Rin
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~モノビット エンジン
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会
新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会
新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会モノビット エンジン
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返りSotaro Kimura
 
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)Johan Andersson
 
행동 기반 게임오브젝트
행동 기반 게임오브젝트행동 기반 게임오브젝트
행동 기반 게임오브젝트kgun86
 
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰승민 백
 
Fps 모드의 분석(FPS MODE ANALYSIS)
Fps 모드의 분석(FPS MODE ANALYSIS)Fps 모드의 분석(FPS MODE ANALYSIS)
Fps 모드의 분석(FPS MODE ANALYSIS)준태 김
 
IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向Yuya Rin
 

Mais procurados (20)

Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)
 
3GPP TS 38.300-100まとめ
3GPP TS 38.300-100まとめ3GPP TS 38.300-100まとめ
3GPP TS 38.300-100まとめ
 
TCAMのしくみ
TCAMのしくみTCAMのしくみ
TCAMのしくみ
 
Teclas atalho do Blender
Teclas atalho do BlenderTeclas atalho do Blender
Teclas atalho do Blender
 
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
 
IIJmio meeting 5 MVNOとGPSについて
IIJmio meeting 5 MVNOとGPSについてIIJmio meeting 5 MVNOとGPSについて
IIJmio meeting 5 MVNOとGPSについて
 
제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현
 
本当は楽しいインターネット
本当は楽しいインターネット本当は楽しいインターネット
本当は楽しいインターネット
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会
新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会
新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!2017年10月27日モノビットエンジン勉強会
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り
 
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
 
행동 트리
행동 트리행동 트리
행동 트리
 
행동 기반 게임오브젝트
행동 기반 게임오브젝트행동 기반 게임오브젝트
행동 기반 게임오브젝트
 
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
 
Fps 모드의 분석(FPS MODE ANALYSIS)
Fps 모드의 분석(FPS MODE ANALYSIS)Fps 모드의 분석(FPS MODE ANALYSIS)
Fps 모드의 분석(FPS MODE ANALYSIS)
 
IIJmio meeting 17 DSDSと着信シーケンスについて
IIJmio meeting 17 DSDSと着信シーケンスについてIIJmio meeting 17 DSDSと着信シーケンスについて
IIJmio meeting 17 DSDSと着信シーケンスについて
 
IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向
 
ネットワーク構築訓練 入門
ネットワーク構築訓練 入門ネットワーク構築訓練 入門
ネットワーク構築訓練 入門
 

Destaque

유전 알고리즘으로 테트리스 AI 최적화하기
유전 알고리즘으로 테트리스 AI 최적화하기유전 알고리즘으로 테트리스 AI 최적화하기
유전 알고리즘으로 테트리스 AI 최적화하기상현 김
 
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발MinGeun Park
 
마이크로소프트의 동작인식 센서 키넥트 v2
마이크로소프트의 동작인식 센서 키넥트 v2마이크로소프트의 동작인식 센서 키넥트 v2
마이크로소프트의 동작인식 센서 키넥트 v2상현 김
 
[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리
[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리
[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리MinGeun Park
 
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드MinGeun Park
 
스터디 초안 발표 - 알고리즘 (한양대 오픈소스동아리)
스터디 초안 발표 - 알고리즘  (한양대 오픈소스동아리)스터디 초안 발표 - 알고리즘  (한양대 오픈소스동아리)
스터디 초안 발표 - 알고리즘 (한양대 오픈소스동아리)Osori Hanyang
 
스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발Insub Lee
 
Gamification (spicy marketing)
Gamification (spicy marketing)Gamification (spicy marketing)
Gamification (spicy marketing)Kwan Hang Cho
 
기획학과 A 11학번 김의환
기획학과 A 11학번 김의환기획학과 A 11학번 김의환
기획학과 A 11학번 김의환kyhss1805
 
게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까 게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까 상준 이
 
2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인홍준 김
 
광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsmNAVER D2
 
Kgc2012강연 이석준
Kgc2012강연  이석준Kgc2012강연  이석준
Kgc2012강연 이석준석준 이
 
Game Design patterns, Visitor, State, FSM pattern
Game Design patterns, Visitor, State, FSM patternGame Design patterns, Visitor, State, FSM pattern
Game Design patterns, Visitor, State, FSM patternYoung Ha Kim
 
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010devCAT Studio, NEXON
 
디자인 패턴
디자인 패턴디자인 패턴
디자인 패턴수빈 박
 
인공지능(Ai)
인공지능(Ai)인공지능(Ai)
인공지능(Ai)민호 송
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)hyun soomyung
 

Destaque (20)

유전 알고리즘으로 테트리스 AI 최적화하기
유전 알고리즘으로 테트리스 AI 최적화하기유전 알고리즘으로 테트리스 AI 최적화하기
유전 알고리즘으로 테트리스 AI 최적화하기
 
Fsm
FsmFsm
Fsm
 
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
 
마이크로소프트의 동작인식 센서 키넥트 v2
마이크로소프트의 동작인식 센서 키넥트 v2마이크로소프트의 동작인식 센서 키넥트 v2
마이크로소프트의 동작인식 센서 키넥트 v2
 
[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리
[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리
[Gpg2권 박민근] 3.3 마이크로 스레드를 통한 ai 관리
 
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
 
스터디 초안 발표 - 알고리즘 (한양대 오픈소스동아리)
스터디 초안 발표 - 알고리즘  (한양대 오픈소스동아리)스터디 초안 발표 - 알고리즘  (한양대 오픈소스동아리)
스터디 초안 발표 - 알고리즘 (한양대 오픈소스동아리)
 
스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발스크럼을 이용한 게임 개발
스크럼을 이용한 게임 개발
 
Gamification (spicy marketing)
Gamification (spicy marketing)Gamification (spicy marketing)
Gamification (spicy marketing)
 
기획학과 A 11학번 김의환
기획학과 A 11학번 김의환기획학과 A 11학번 김의환
기획학과 A 11학번 김의환
 
게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까 게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까
 
Game ai.fsm.01
Game ai.fsm.01Game ai.fsm.01
Game ai.fsm.01
 
2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인
 
광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm
 
Kgc2012강연 이석준
Kgc2012강연  이석준Kgc2012강연  이석준
Kgc2012강연 이석준
 
Game Design patterns, Visitor, State, FSM pattern
Game Design patterns, Visitor, State, FSM patternGame Design patterns, Visitor, State, FSM pattern
Game Design patterns, Visitor, State, FSM pattern
 
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
한상원, 친아티스트 3D 캐릭터 리깅, NDC2010
 
디자인 패턴
디자인 패턴디자인 패턴
디자인 패턴
 
인공지능(Ai)
인공지능(Ai)인공지능(Ai)
인공지능(Ai)
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)
 

120629 fsm in unity3d skyseer

  • 2. FSM? • Finite State Marchine(유한상태머신) – 유한개의 상태와 이런 상태들 간의 변환으로 구성된 계산 모형. – 게임에서는 주로 몬스터AI 구현에 사용 • 유니티에서의 FSM – 코루틴(Coroutine) 을 사용 • 스레드와 비슷한 결과를 만들지만 스레드와 달리 동시에 하나만 수행하는 프로그래밍 기법(단일 스레드) • 부하가 걸리는 작업을 나눠서 시행하기 위해서도 사용 • 코루틴은 루아(Lua)등 에서도 사용 • StartCoroutine(시작), IEnumerator(리턴), yield return(양보) 키워드 사용
  • 3. Coroutine VS • Coroutine VS 스레드 – 둘다, 독립적인 동작 구현을 위해 사용 – 코루틴은 자원공유 문제를 고민할 필요가 없다 • Coroutine VS Update – 둘다, 일정 주기마다 특정 작업을 반복하도록 프로그램을 구성할 때 사용(콜백 함수) – 코루틴은 필요에 따라 호출을 제어(호출 시간, 호출 중지)할 수 있으므로 CPU의 자원을 덜 소비 – 코루틴은 가상화 함수가 아니기 때문에 오버헤드가 없어서 Call부하는 없음… 실제 FPS에 영향은 없음.
  • 4. Unity3d Coroutine 의 기본 구조 <ex_Coroutine.cs> • StartCoRoutine(시작) StartCoroutine("FSM"); void Start () { print ("A"); • IEnumerator(리턴) StartCoroutine("Example"); //StartCoroutine(Example(2.0f)); print ("C"); • yield return(양보) 키워드 사용 } IEnumerator Example(){ //IEnumerator Example(float waitTime){ while(true){ print ("B"); yield return null; //yield return new WaitForSeconds(waitTime); } } void Update () { print ("D"); } 결과 : A B C D B D B D….. 결과 : A B C D D D…..D B D….. D B D…..
  • 5. 몬스터 AI 설계 • Init – 초기 몬스터 세팅 Spawn StartCoroutine(“BattleFSM”) StartCoroutine(IdleFSM(5.0f)) • Idle - 유휴 Retreat • Move – 이동 Init • Search – 플레이어 감지 Chase Update () • Chase – 추격 이동 Idle • Attack – 공격 Search Attack • Retreat - 후퇴 Move • Flee – 도망 Flee
  • 6. 몬스터 AI 구현 <Monster.cs> private enum State { Init, //make sure that everything we need is here Idle, //do nothing Move, //random moving //Setup, //assign the values to the things we need //Search, //find the player Chase, //move to player Attack, //attack the player Retreat, //retreat to spawn point Flee //run to the nearest spawn point with another mob }
  • 7. 몬스터 AI 구현 void Start() { _state = MonsterObject.State.Init; StartCoroutine(IdleFSM(5.0f)); } private IEnumerator IdleFSM(float waitTime) { while(_alive) { // Debug.Log("Alive: " + _alive); switch(_state) { case State.Init: Init(); break; case State.Idle: Idle(); break; case State.Move: Move(); break; } yield return new WaitForSeconds(waitTime); } }
  • 8. 몬스터 AI 구현 private IEnumerator BattleFSM() { while(_alive) { // Debug.Log("Alive: " + _alive); switch(_state) { case State.Chase: Chase(); break; case State.Attack: Attack(); break; case State.Retreat: Retreat(); break; case State.Flee: Flee(); break; } yield return null; } }
  • 9. 몬스터 AI 구현 void Update () { Debug.DrawLine(_target.transform.position, _myTransform.position, Color.yellow); if(_balttle == false){ if(Vector3.Distance(_target.position, _myTransform.position) > maxCloseDistance && Vector3.Distance(_target.position, _myTransform.position) < findPlayerDistance){ Debug.Log("***Battle Start***"); _balttle = true; StopCoroutine("IdleFSM"); StartCoroutine("BattleFSM"); _state = MonsterObject.State.Chase; } } }
  • 10. FSM의 활용 • 스스로 여러개의 상태를 갖고 스스로 상태를 변화시키는 모든 객체에 활용 가능 – Ex. MonsterGenerator, AnimateSprite컴포넌트