그래프(Graphs), 상태(States) 그리고 머신(Machines)

그래프는 로직(logic)을 시각적으로 표현한 것이다. 이 그래프가 비주얼 스크립팅의 핵심에 있다.

그래프에는 두 가지 종류가 있다.

  • 스크립트 그래프(Script Graphs)는 개별적인 동작들과 값을 특정 순서로 연결하는 것이다. 실행 순서는 스크립트(Script)의 흐름(Flow)이다. 스크립트 그래프는 언리얼 엔진의 블루프린트(Blueprint) 비주얼 스크립팅 언어와 유사하다. (역자 주 - Script Graphs는 Script Machine에서 작성)
  • 상태 그래프(State Graphs)는 서로 다른 상태를 만들고 그 상태들 간에 전환을 생성한다. 각 상태(State)는 작은 프로그램 역할을 한다. 상태 그래프는 플레이 메이커(PlayMaker) 또는 유한 상태 머신(FSM; Finite State Machine) 시스템과 유사하다. (역자 주 - State Graphs는 State Machine에서 작성, 각 State Graphs의 내부는 Script Graph로 작성된다. 여기 있는 Script Graph의 집합이 시스템 설계의 목적상 어떤 상태를 의미(정의)하기 때문에 State Graph가 되는 것이다)
Script Graph



Script Graph

이 두 종류의 그래프로 어떤 종류의 게임도 만들 수 있다. 이 글에서는 그래프(Graph)와 그 그래프들의 유사점을 설명하고자 한다. 각 그래프에대한 설명은 본 메뉴얼에 별도의 전용 섹션이 마련되어 있다. 스크립트 그래프와 상태 그래프의 순서로 읽어 보기 바란다.  더욱이 두 종류의 그래프는 결합할 수 있다. 예를 들어, 상태 그래프의 각 상태 노드(State Node)는 실제로 스크립트 그래프(Script Graphs)로 이루어져 있다.



어떤 경우에 스크립트 그래프와 상태 그래프를 사용하는가?
  • 스크립트 그래프(Script Graph)는 매 프레임마다 또는 충돌과 같은 이벤트가 발생할 때 동작이 실행된다. 스크립트 그래프는 분기(branching, 역자 주-if, swith 같은), 루프(loop), 수학(math) 등과 같은 소위 "낮은 수준(low-level)"이라 일컬어지는 로직(logic)에 이용된다. 스크립트 그래프는 "언제 작동할 것인가?, 어떤 동작을 할 것인가? 그리고 어떤 순서로 동작할 것인가?"라는 질문에 가장 잘 대답한다(역자주-보통 프로그래밍을 처음 공부할 때 접하는 대부분의 것들이 스크립트 그래프에 속한다).
  • 상태 그래프(State Graph)는 AI 행동, 씬(Scene) 또는 레벨 구조(level structure), 그리고 상태 개념이 요구되는 "고 수준(high-levle)" 로직(logic)을 만드는 데 사용된다. 예를 들어, 몬스터 NPC가 "패트롤(patrol)", "추적(chase)" 및 "공격(attack)" 상태를 가져야 하는 경우, 혹은 어떤 문이 "잠금(locked)", "잠금 해제(unlocked)", "열림(open)" 상태를 가져야 하는 경우이다. 상태 그래프(state graphs)는 "현재 나의 행동은 무엇인가? 그리고 언제 그 행동이 바뀌어야 하는가?"라는 질문에 가장 잘 답한다(역자주-일련의 프로그래밍 집합이 의미있는 행동을 하도록 하는 것이 상태 그래피이다. 즉, 왔다 갔다 경계를 하고 있던 몬스터가 플레이어 캐릭터가 나타나면 공격을 시작한다고 할 때 경계 상태에서 공격 상태로 전환되는 것을 구현하는 것이다).


다음은 두 종류의 그래프 모두 가지고 있는 공통의 기본 개념에 관한 것이다.


머신(Machines)


머신(앞쪽 글에서 이해를 위해 시스템으로 번역하였으나 이후 부터는 혼돈을 막기 위해 머신으로 번역함)은 게임 오브젝트에 추가되어 플레이 모드 중 그래프의 로직을 실행하는 구성요소다. 각 그래프는 스크립트 머신(Script Machine)과 상태 머신(State Machine)이 있다. 이들은 모두 비주얼 스크립팅 컴포넌트 분류에 있다.

스크립트 머신은 오브젝트(Object)가 어떻게 동작해야 하는지를 설명하고, 상태 기계는 오브젝트(Object)가 언제 그 동작을 변경해야 하는지를 결정한다.


Script Machine & State Machine
Script Machine & State Machine


두 머신 모두 인스펙터(Inspector)에 동일한 옵션을 가지고 있다. 다음 예는 스크립트 머신 컴포넌트가 생성된 경우다.


Machine Options
Machine Options


각 그래프 마다 제목(title)과 간단한 설명(summary)을 작성할 수 있도록 되어져 있고 이는 비주얼 스크립팅 기능에 전혀 영향을 미치지 않는다. (역자 주-C#에 주석을 다는 것과 같음)



편집할 그래프 열기


그래프 편집 버튼(Edit Graph Button)은 그래프 윈도우(Graph Window)와 그래프 인스펙터(Graph Inspector)에 있으며 머신 그래프(Machine Graph) 창을 활성화 시킨다. 하나의 오브젝트에 하나의 머신이 있는 경우 비주얼 스크립팅은 그 그래프를 자동으로 선택한다. (역자 주-여러 개의 머신이 하나의 오브젝트에 있다면 제일 위에 것이 자동 선택되는 듯함)



스크립트 소스(Sources): 임배드(Embeds)와 그래프(Graphs)


스크립트 소스는는 두 가지 유형이 있다. 임배드(embed) 방식(삽입되어져 있음의 뜻)과 그래프(graph) 방식(별도 파일로 만들어짐)이다..


 임배드(Embed)그래프(Graph)
관계작업한 그래프가 머신(Machine) 자체에 내장되어 진다.작업한 그래프가 머신이 참조하는 에셋이다.
(역자 주-에셋 파일로 저장되고 이를 참조한다는 의미)
재이용가능성다른 머신의 임베드 그래프는 재사용할 수 없지만, 프리팹 인스턴스 간에 공유된다.
(역자 주-오브젝트를 프리팹으로 만들어 인스턴스로 생성하면 내장되어 있는 스크립트를 사용할 수 있다는 의미)
동일한 그래프를 여러 개의 머신에 재사용할 수 있다. 같은 프리팹에 있지 않더라도 말이다.
(역자 주-에셋 파일임으로 여러 오브젝트 파일 혹은 여러 스크립트 파일에서 재사용할 수 있다는 의미)
영속성머신 컴포넌트를 제거하면 내장 그래프가 삭제된다. 또한 스크립트 소스를 그래프(Graph)로 전환하면 내장(Embed) 그래프도 삭제된다.
(역자 주-여기서 전환이란 Embed 소소를 Graph 소스로 바꾼다는 의미이며 에셋파일로 저장한다는 것이다.)
머신 컴포넌트를 제거해도 그래프 에셋은 여전히 존재한다. 소스를 임베드로 전환해도 그래프는 삭제되지 않는다.
씬 참조임베드 그래프는 프리팹으로 저장되지 않는 그 그래프가 속한 현재 씬의 게임 오브젝트를 가르킨다.그래프는 어떤 씬에도 귀속되지 않기 때문에 현재 씬의 게임 오브젝트만을 가르킨다고 말할 수 없다.
프리팹(Prefabs)임배드 스크립트 머신(embed script를 가지고 있는 Machine)이 에디터에 존재한다면 프리팹을 인스턴스화하해서 사용해서는 안 된다.그래프 스크립트 머신(graph script를 가지고 있는 machine)은 모든 프리팹상에서 안전하게 사용할 수 있다.

역자 주) 위에서 설명한 임배드(Embed) 와 그래프(Graph)는 막상 알면 쉬운데 그래프(Graph)라는 단어를 중복적으로 사용해서 헷갈리게 만든다. "비주얼 스크립트는 그래프(Graph)를 작성한다"는 것은 프로그래밍을 한다는 의미인데 위의 표에서 설명하는 그래프(Graph)는 에셋 파일로 그래프 스크립트를 저장해서 사용한다는 의미이다. 임배드(Embed)는 머신 컴포넌트(Machine Componet)에 내장시켜서 사용한다는 의미이다. 즉, 형식적으로는 파일로 저장하느냐 마느냐의 차이이다. 따라서 그래프(Graph)라는 단어의 의미를 잘 구분해서 이해해야 한다.



그래프(Graphs)


그래프(graph)는 여러 다른 머신에서 참조하는 연결된 유닛들의 재사용 가능한 집합이다. 그래프(graph)는 일반적으로 임베드(embed)보다 재사용가능하다는 측면, 특정 오브젝트에 억매이지 않는다는 측면 그리고  프리팹으로 사용해도 안전하다는 측면에서 우수하다. 그런데 어떤 소스를 사용할지(즉, embed를 사용할지, graph를 사용할지) 결정하는 아주 간단한 가이드 라인이 있다.

 

그래프로 머신의 원본 옵션을 전환하고자한다면 머신에서 그래프를 선택하면 된다(역자 주-머신 컴포넌트를 추가하면 임배드와 그래프중 선택하는 메뉴가 자동으로 나타난다. 기본은 그래프 설정이다). 스크립트 머신(Script Machine)은 스크립트 그래프(Script Graph)가 필요하고 상태 머신(Script Machine)은 상태 그래프(State Graph)가 필요하다.

  • 대부분의 경우 그래프(graph)를 사용하게 될 것이다. 그래프(graph)를 하나 이상의 오브젝트 또는 씬(scene)에 걸쳐 재사용하고자 할 때 그래프(graph)를 로드하는 것이 빠르고 유지관리가 쉽기 때문이다.
  • 현재 씬(scene)에서 한 번만 사용되는 그래프(graph - 여기서 그래프는 스크림트로 작성한 그래프)라면 임베드(embed)를 사용할 수 있다. 이는 GUI에서 유용한데 특정 씬에서만 사용되도록 할 수 있다.


참조한 모든 오브젝트에 실시간으로 반영


그래프(graph)를 변경하면 해당 그래프가 연결된 모든 오브젝트에 변경 사항이 모두 적용된다. 오브젝트의 모든 인스턴스에 대해 고유한 그래프를 사용하거나 변경사항을 복사하여 붙여넣을 필요는 없다.



소스 변환


한 종류의 소스에서 다른 종류의 소스로 변환할 수 있다.

(역자 주-임배드를 그래프로, 그래프롤 임배드로 전환할 수 있다)



그래프(Graph)에서 임배드(Embed)로 전환하는 경우


그래프에서 임베드로 전환하려면 변환(Convert) 버튼을 클릭하면 된다.

예를 들어, AI 동작에 대해 여러개의 에너미 개체에서 공유되고 있는 공통의 상태 그래프를 사용 중인데 특정 에너미 하나에 대해 특수한 동작을 추가 혹은 삭제하는 경우 그래프(graph)를 임베드(embed) 그래프로 변환하여 다른 개체와는 독립적으로 작동하게 할 수 있다.



임배드(Embed)에서 그래프(Graph)로 전환하는 경우


임배드(Embed)에서 그래프(Graph)로 변환하려면 변환(Convert) 버튼을 클릭하고 새 그래프의 경로를 지정한 후와 파일 이름을 입력하면된다. 비주얼 스크립팅은 임배드 그래프(embed graph)의 모든 내용을 그래프(graph)로 복사한다(그래프에서 지원되지 않는 씬 참조는 제외됨). 그러면 머신 컴포넌트가 자동적으로 그래프 모드로 전환되고 새로운 그래프를 참조한다.


예를 들어, 적 게임 오브젝트의 이동을 구현하는 임베드 그래프를 만들었지만, 유사한 다른 NPC에 동일한 로직이 필요하다면 임베드 그래프(embed graph)를 다시 사용할 수 있도록 그래프(graph)로 변환하면 된다.

 


<원본>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-graphs-machines-macros.html

댓글

이 블로그의 인기 게시물

EMACS - 파일 열기, 저장, 도움말

EMACS - 검색 및 바꾸기

EMACS, CLISP, SLIME 설치