SlideShare una empresa de 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컴포넌트
참고 사이트
•

Más contenido relacionado

La actualidad más candente

Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 
Security in PHP - 那些在滲透測試的小技巧
Security in PHP - 那些在滲透測試的小技巧Security in PHP - 那些在滲透測試的小技巧
Security in PHP - 那些在滲透測試的小技巧Orange Tsai
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Mutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosMutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosThiago Poiani
 
1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...
1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...
1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...Оксана Миколаївна Хоровець
 
PWNの超入門 大和セキュリティ神戸 2018-03-25
PWNの超入門 大和セキュリティ神戸 2018-03-25PWNの超入門 大和セキュリティ神戸 2018-03-25
PWNの超入門 大和セキュリティ神戸 2018-03-25Isaac Mathis
 
Social Engineering the Windows Kernel by James Forshaw
Social Engineering the Windows Kernel by James ForshawSocial Engineering the Windows Kernel by James Forshaw
Social Engineering the Windows Kernel by James ForshawShakacon
 
Userfaultfd: Current Features, Limitations and Future Development
Userfaultfd: Current Features, Limitations and Future DevelopmentUserfaultfd: Current Features, Limitations and Future Development
Userfaultfd: Current Features, Limitations and Future DevelopmentKernel TLV
 
Experience with jemalloc
Experience with jemallocExperience with jemalloc
Experience with jemallocKit Chan
 
Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».
Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».
Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».VsimPPT
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018devCAT Studio, NEXON
 
Android Application Development of NFC Reader-Writer Mode
Android Application Development of NFC Reader-Writer ModeAndroid Application Development of NFC Reader-Writer Mode
Android Application Development of NFC Reader-Writer ModeChun-Kai Wang
 

La actualidad más candente (20)

Sql injection
Sql injectionSql injection
Sql injection
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Security in PHP - 那些在滲透測試的小技巧
Security in PHP - 那些在滲透測試的小技巧Security in PHP - 那些在滲透測試的小技巧
Security in PHP - 那些在滲透測試的小技巧
 
Log4j in 8 slides
Log4j in 8 slidesLog4j in 8 slides
Log4j in 8 slides
 
Java - Primeiros passos
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passos
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Mutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosMutexes, Monitores e Semáforos
Mutexes, Monitores e Semáforos
 
1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...
1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...
1.1 Поштова служба Інтернету. Електронна скринька та електронне листування. Е...
 
PWNの超入門 大和セキュリティ神戸 2018-03-25
PWNの超入門 大和セキュリティ神戸 2018-03-25PWNの超入門 大和セキュリティ神戸 2018-03-25
PWNの超入門 大和セキュリティ神戸 2018-03-25
 
Secure Session Management
Secure Session ManagementSecure Session Management
Secure Session Management
 
Social Engineering the Windows Kernel by James Forshaw
Social Engineering the Windows Kernel by James ForshawSocial Engineering the Windows Kernel by James Forshaw
Social Engineering the Windows Kernel by James Forshaw
 
Mobile Hacking
Mobile HackingMobile Hacking
Mobile Hacking
 
Лекція №6
Лекція №6Лекція №6
Лекція №6
 
Userfaultfd: Current Features, Limitations and Future Development
Userfaultfd: Current Features, Limitations and Future DevelopmentUserfaultfd: Current Features, Limitations and Future Development
Userfaultfd: Current Features, Limitations and Future Development
 
Experience with jemalloc
Experience with jemallocExperience with jemalloc
Experience with jemalloc
 
JAVA - Matrizes
JAVA - MatrizesJAVA - Matrizes
JAVA - Matrizes
 
Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».
Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».
Урок 22 для 3 класу - . Використання логічних висловлювань з «не», «і», «або».
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
Android Application Development of NFC Reader-Writer Mode
Android Application Development of NFC Reader-Writer ModeAndroid Application Development of NFC Reader-Writer Mode
Android Application Development of NFC Reader-Writer Mode
 

Destacado

유전 알고리즘으로 테트리스 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
 

Destacado (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컴포넌트