데이터 중심 애니메이션 상태


14

편집 : 내 질문이 정확히 무엇인지 명확히하기 위해 : 이것은 콘텐츠 생성 / 관리를 주시하면서 게임 엔진에서 애니메이션 / 애니메이션 상태를 처리하는 좋은 방법입니까? 이 방법으로 수행하는 결함은 무엇이며 다른 방법은 무엇입니까? -내 대답은 의견에 부분적으로 답변되었지만, 갈 길입니다.

2D 게임 엔진 취미 프로젝트 에서 애니메이션을 하드 코딩하지 않고 애니메이션 을 처리하려고 합니다. 하드 코딩 애니메이션 상태는 일반적이지만 매우 이상한 현상 인 것 같습니다.

약간의 배경 : 구성 요소가 많은 데이터와 하위 시스템이 작동하는 엔티티 시스템을 사용하고 있습니다. 폴링 시스템을 사용하여 애니메이션 상태를 업데이트하기로했습니다.

함께 애니메이션 상태 내 말은 "walking_left", "running_left", "walking_right을", "촬영"...

애니메이션을 처리 할 생각은 애니메이션을 데이터 기반 모델 로 디자인하는 것이 었습니다 . 데이터는 xml 파일, rdbms에 저장 될 수 있고 ... 게임 / 레벨 / 시작시로드 될 수 있습니다.이 방법을 사용하면 어디서나 코드를 변경하지 않고도 애니메이션 및 전환을 쉽게 편집 할 수 있습니다. 경기.

예를 들어, 내가 생각한 데이터 정의 의 XML 초안을 만들었습니다 .

매우 중요한 데이터 중 하나는 단순히 애니메이션에 대한 설명 일뿐 입니다. 애니메이션은 고유 한 ID (설명 적 이름)를 갖습니다. 이미지에 대한 참조 ID를 보유합니다 (다른 애니메이션은 다른 스프라이트 시트를 사용할 수 있기 때문에 사용하는 스프라이트 시트). 애니메이션을 실행할 초당 프레임입니다. 여기서 "재생"은 애니메이션을 한 번 또는 무한대로 실행해야하는지 여부를 정의합니다. 그런 다음 사각형 목록을 프레임으로 정의했습니다.

<animation id='WIZARD_WALK_LEFT'>
    <image id='WIZARD_WALKING' />
    <fps>50</fps>
    <replay>true</replay>
    <frames>
        <rectangle>
            <x>0</x>
            <y>0</y>
            <width>45</width>
            <height>45</height>
        </rectangle>
        <rectangle>
            <x>45</x>
            <y>0</y>
            <width>45</width>
            <height>45</height>
        </rectangle>
    </frames>
</animation>

애니메이션 데이터는 애니메이션 리소스 풀 에로드되어 유지되며 이를 사용하는 게임 엔터티가 참조합니다. 이미지, 사운드, 텍스처 등의 리소스로 취급됩니다.

정의 할 두 번째 데이터 는 애니메이션 상태 및 전환 을 처리 하는 상태 머신입니다 . 이것은 게임 엔티티가있을 수있는 각 상태를 정의합니다.이 상태는 전환 할 수있는 상태와 그 상태 변경을 유발하는 요소입니다.

이 상태 머신은 엔티티마다 다릅니다. 새는 "걷는"상태와 "비행하는"상태를 가질 수 있지만 인간은 "걷는"상태 만 가질 수 있기 때문입니다. 그러나 여러 사람이 같은 상태를 가질 것이기 때문에 (특히 몬스터와 같은 일반적인 NPC를 정의 할 때) 다른 엔티티와 공유 할 수 있습니다. 또한 오크는 인간과 같은 상태를 가질 수 있습니다. 이 상태 정의는 선택된 게임 엔터티 그룹 만 공유 할 수 있음 을 보여주기 위해 .

<state id='IDLE'>
  <event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
  <event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
  <event trigger='LEFT_UP' goto='IDLE' />
  <event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
  <event trigger='RIGHT_UP' goto='IDLE' />
  <event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>

이러한 상태는 폴링 시스템 으로 처리 할 수 ​​있습니다 . 각 게임 틱은 게임 엔티티의 현재 상태를 파악하고 모든 트리거를 확인합니다. 조건이 충족되면 엔터티의 상태가 "goto"상태로 변경됩니다.

내가 고투했던 마지막 부분은 애니메이션 데이터와 애니메이션 상태를 엔티티바인딩 하는 방법이었다 . 가장 논리적 인 접근법은 엔티티가 사용하는 상태 머신 데이터에 대한 포인터를 추가하고 해당 머신의 각 상태에 대해 사용하는 애니메이션을 정의하는 것 같습니다.

다음은 애니메이션 상태 및 애니메이션 데이터 ID를 지정하여 게임에서 일부 공통 엔터티의 애니메이션 동작 및 그래픽 표현을 정의하는 방법에 대한 xml 예제입니다. "마법사"와 "orc"는 모두 애니메이션 상태는 같지만 애니메이션은 다릅니다. 또한 다른 애니메이션은 다른 스프라이트 시트 또는 다른 애니메이션 시퀀스를 의미 할 수 있습니다 (애니메이션이 길거나 짧을 수 있음).

<entity name="wizard">
    <state id="IDLE" animation="WIZARD_IDLE" />
    <state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>

<entity name="orc">
    <state id="IDLE" animation="ORC_IDLE" />
    <state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>

엔티티가 생성 될 때 상태 머신 데이터 및 애니메이션 데이터 참조가있는 상태 목록을 추가합니다.

앞으로 엔티티 시스템을 사용하여 유사한 XML 형식으로 컴포넌트를 정의하여 전체 엔티티를 빌드 할 것입니다.

-

이것은 약간의 연구 후에 내가 생각해 낸 것입니다. 그러나 나는 그 주위에 머리를 두는 데 어려움을 겪었으므로 피드백을 원했습니다. 여기에 의미가없는 것이 있습니까, 아니면 이러한 것들을 처리하는 더 좋은 방법이 있습니까? 프레임을 반복하는 아이디어를 파악했지만 한 단계 더 나아가는 데 어려움을 겪고 있으며 이것이 저의 시도입니다.


1
트리거를 고려하지는 않았지만 애니메이션 데이터 저장에 대한 비슷한 아이디어를 생각해 냈습니다. 여기에 내가 쓴 짧은 기사 와 XML을 소비하고 사물의 애니메이션 측면을 처리하는 내가 쓴 XNA 프로젝트에 대한 링크가 있습니다. 세트와 시퀀스의 개념과 같은 몇 가지 차이점이 있지만 그 외에는 당신이 궤도에 있다고 생각합니다.
John McDonald

2
귀하의 디자인이 나쁘지는 않지만 (아니, 과거에 비슷한 시스템의 라인을 따라가는 것은 아닙니다), 귀하의 질문은 정확히 무엇입니까? 나는 그것이 더 명확하게 설 수 있다고 생각합니다.
MrCranky

@ John-고맙습니다, 오늘 저녁에 나중에 살펴 볼게요. @ MrCranky-글쎄, 주로 당신이 말한 것입니다. 그것이 더 좋고 아마도 더 확립 된 방법에 대한 팁 / 링크 인 경우. 나는 실제로 여기 현명한 어둠에 있습니다.
user8363

1
제공되는 정보의 깊이에 대해 의견을 제시하고 싶지만 MrCranky를 반향하기 위해 실제로 질문이 무엇인지 따르지 않습니다. 내 자신의 조언 (2 주 전에 이런 종류의 시스템을 구축하여 생성 됨)을 위해 나는 당신이 주목하고 있다고 말하고 싶습니다.
Mike Cluck

@MikeC 그게 내가 필요한 대답입니다. 내 질문에 대해 더 명확하게 알 수 없었던 점에 대해 사과드립니다. 어쩌면 내가 발견하지 못하면 질문처럼 보일 것입니다 :). 사실 애니메이션 상태를 처리하는 많은 리소스를 찾을 수 없었으며 콘텐츠를 작성 / 변경하는 하드 코딩 된 리소스는 악몽이 될 것입니다. 그래서 내 질문은 :이 접근법이 옳은가 아닌가? 그리고 너희들이 말하면 괜찮습니다 :).
user8363

답변:


4

애니메이션 클립은 첫 번째 XML 스 니펫에서했던 것처럼 오래된 데이터로 가장 잘 설명됩니다. 직접 만들거나 아트 패키지에서 내보낼 수 있습니다. 어느 쪽이든, XML과 같이 사람이 읽을 수있는 중간 형식에서 파이프 라인을 만들어서로드하기에 좋은 파이프 라인을 만들고 싶을 것입니다.

다음 단계는 물건을 렌더링 할 수있는 것입니다. 일종의 장면 그래프를 사용하고 있다면 아마도 애님 노드를 만드는 것을 의미 할 것입니다. 현재 재생중인 애니메이션과 타임 라인의 현재 위치를 애님 노드에 알릴 수 있어야합니다. 컬링 시스템에 쉽게 정보를 공급할 수 있도록 경계 상자 정보를이 레벨에서 액세스 가능한 상태로 유지하십시오.

이제 애니메이션을 게임 엔터티와 연결하려고합니다. 구성 요소 기반 모델을 사용하는 경향이 있으므로 이는 AnimState 구성 요소를 의미합니다. 게임 플레이와 렌더링 사이의 중간 레이어입니다. 엔터티가 재생중인 애니메이션, 재생 모드 (루핑, 한 번, 탁구 등), 타이밍 등을 추적합니다. "애니메이터"와 같은 이벤트를 엔터티로 다시 보내고 적절한 경우 애니 노드 상태를 업데이트 할 수 있습니다. . 활성 엔터티에 대한 AnimStates는 애니메이션을 재생중인 경우 sim tick 당 한 번 업데이트됩니다.

애님 스테이트 컴포넌트는 단순한 게임 아이템 (기본 배경 소품 등)에는 충분하지만, 더 복잡한 엔티티에는 스테이트 머신을 사용하여 관리 할 수 ​​있습니다. 이것은 Lua 또는 Python과 같은 스크립팅 언어로 가장 잘 표현됩니다. 상태에는 몇 가지 기능 블록 (onEnter, onExit, onUpdate, onEvent)과 특정 시간에 발생해야하는 특정 작업 및 트리거를 지정하는 타임 라인이있을 수 있습니다. 타임 라인 콜백 발생시 트리거 할뿐만 아니라 이러한 상태 머신을 적절히 업데이트하는 일종의 관리자 클래스가있을 것입니다. 작성하는 모든 OnUpdate는 엔터티 수에 따라 선형 비용이되기 때문에 이러한 사항을 가능한 한 이벤트 기반으로 유지해야합니다. 또한 태그를 지정할 수 있습니다 ( '공격', '유휴', '무시 입력'등) 전체 상태 및 특정 시간 영역과 관련이 있습니다. 또한 특정 상태뿐만 아니라 전체 상태 그래프에 적용되는 고급 이벤트 핸들러도 필요할 것입니다.

'센티 언트 (Sentient)'캐릭터는 아마도 어떤 종류의 AI도 가질 것입니다. 나는 걸어 다니는 것을 다루는 특정 '로코 모터'구성 요소를 만드는 경향이 있습니다. 신호 및 이벤트 시스템을 사용하고 상태 태그를 쿼리하여 상태 그래프와 인터페이스하며 "워크 투 포인트"또는 "특정 속도로 특정 방향으로 실행"하도록 지시 할 수 있습니다. 그런 다음 동작 트리 등의 상위 수준 AI 구성 요소는 세부 정보에 대한 걱정없이이 인터페이스를 사용할 수 있습니다.


1

지금까지 본 최고의 데이터 중심 애니메이션 시스템은 Blend Tree 입니다. 실제로, 그것은 좋은 일이며 여기에서 요구하는 모든 것을 할 수 있습니다. AIGameDev.com에 따르면 그것은 현재 업계에서 사실상의 표준이며, 그것이 옳다고 생각합니다.

불행하게도, 난 빠른 인터넷 검색과 좋은 리소스를 찾을 수 없습니다,하지만 당신은 시도 할 수 있습니다 또는 개요를 볼 수 있습니다. 도있다 지불 기사 AIGameDev.com에 그것의 가치는 프리미엄 계정을 받고 있는지 알고하지 않습니다.


이것은 매우 좋은 자료입니다, 감사합니다. 이런 정보를 찾고 있습니다.
user8363

1
불연속 스프라이트 시트로는 애니메이션 블렌딩이 불가능하고 연속적인 골격 애니메이션 만 가능합니다
AlexFoxGill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.