ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 통로 통신 시스템
    프로그래밍/기록, 개념, 용어 2015. 10. 6. 18:00
    반응형

    함수 형태의 이벤트 시스템을 데이터 주도 시스템으로 바꿀 생기는 문제 하나는 서로 다른 이벤트끼리 호환되지 않을 있다는 점이다.

    예를 들어, EMP 총이 있다고 하자. 총을 사용하면 전자 장비 꺼지게 되고, 작은 동물들은 겁에 질려 도망가며, 주변에 있던 식물들은 휘청거린다.

    동물들은 Scare 이벤트에 반응해 도망간다. 전자 장비들은 TurnOff 이벤트에 반응해 꺼진다.

    식물들은 Wind 이벤트 핸들러를 가진다.

    여기서 문제는, EMP 총이 이런 이벤트 핸들러와 호환되지 않는다는 점이다. 따라서 결국엔 이벤트 타입(ex: EMP Fire) 만들고 모든 게임 객체가 이것에 반응하도록 짜야 하는 상황이 된다.

     

    생각의 반전

     

    문제는, 이벤트 타입이란 것을 아예 생각하지 말고, 게임 객체에서 다른 객체로 데이터 스트림을 보내는 개념으로 접근하면 해결할 있다.

    시스템에서는 모든 게임 객체들이 데이터 스트림을 연결할 있는 입력 포트 데이터를 보낼 출력 포트 하나 이상 갖는다.

    포트끼리 선으로 연결시켜주는 그래픽 유저 인터페이스만 있다면 어떤 복잡한 행동이라도 구현 가능하다.

    앞에 나온 예를 이용해 계속 설명해보자면 EMP총은 출력에 Fire 이름이 붙은 포트가 있어서 boolean 신호를 보낼 것이다.

    대부분의 시간 동안 포트는 false(0)값을 보내고 있겠지만, 총이 발사되면 아주 짧은 기간(ex: 프레임) 동안 값이 true(1) 바뀐다.

    다른 게임 객체들은 다양한 반응을 촉발하는 이진 입력 포트를 갖고 있다.

    동물들은 Scare 입력, 전자 장비들은 TurnOn 입력, 식물들은 Sway 입력을 갖는다.

    EMP 총의 Fire 출력 포트를 게임 객체들의 입력 포트에 연결하기만 하면, 총이 발사될 원하는 반응이 일어나게 있다.




     

    프로그래머는 타입의 게임 객체들이 어떤 포트를 가질지 결정한다. 그러면 디자이너가 원하는 행동을 구현하기 위해 GUI 이용해 포트들을 이리저리 연결한다. 외에 프로그래머는 그래프에서 사용할 여러 종류의 노드들을 만들어야 하는데, 입력을 뒤집는 노드, 사인 (wave) 출력하는 노드, 현재 게임 시간을 출력하는 노드 등이 예다.

     

    데이터 통로를 통해 다양한 데이터 타입을 보낼 있다. 불리언 데이터를 보내거나 받는 포트도 있고, 단위 부동 소수 데이터를 보내거나 받는 포트도 있을 있다. 외에 3D 벡터나 컬러 정수 등을 보내게 만들 수도 있다.

    이런 시스템에서 서로 호환되는 데이터 타입의 포트끼리 연결되게 하는 것이 중요한데, 그렇지 않으면 연관 없는 포트끼리 연결됐을 자동으로 데이터 타입을 변경해주는 기능을 구현해야 한다.

    예를 들어, 단위 부동 소수 출력을 불리언 입력에 연결한 경우, 0.5보다 작은 값은 false, 0.5 이상인 값은 true 바꾸는 식이다.

    언리얼 엔진3 키즈멧과 같은 GUI 기반 이벤트 시스템은 이와 같은 원리로 동작한다.


    다음은 c++로 작성한 예제..

    (문제가 있다면 지적 부탁해요)



    출력 결과



    반응형
Designed by Tistory.