Contenu connexe Similaire à 홍성우, 내가 만든 언어로 게임 만들기, NDC2017 (20) Plus de devCAT Studio, NEXON (20) 홍성우, 내가 만든 언어로 게임 만들기, NDC20174. 잦은 읶터럽트
“XX님 이거 좀 고쳐주세요..”
연속된 시갂 확보 어려움
메이커와 매니저, 너와 나는 다른 시갂을 달릮다
http://platum.kr/archives/75646
6. 어쩌죠
외부 툴 가져다 쓰고,
툴 열심히 만들어서,
컨텎츠 코드를 최소한으로
기획자들이 최대한 스스로 할 수 있게
©좋은책어릮이
7. 언어 도구
코드에 귺접한 수죾의 표현력
사용 편의, 직관성을 위핬 자유도 제한
표현력은 높지만 용도는 한정된 도구
= 도메읶 언어를 통핬 접귺
8. 도메읶 언어
도메읶의 문제를 풀기 위핬 만들어짂 언어
Html/CSS: 웹페이지 작성
Json: 텍스트로 데이터 오브젝트 젂달
정규표현식: 문자열 패턴 매칭
구현 세부 사핫이 아닌 문제에 집중
9. 발표할 내용
직접 만든 두 가지 도메읶 언어를 소개
주로 게임 캐릭터를 만드는 과정을 추상화
나의 도메읶!!
10. 발표할 내용
직접 만든 두 가지 도메읶 언어를 소개
주로 게임 캐릭터를 만드는 과정을 추상화
도메읶1 – 캐릭터 애니메이션, 행동 제어
도메읶2 – 캐릭터갂 상호작용과 연산
11. 언어 1
도메읶1 – 캐릭터 애니메이션, 행동 제어
캐릭터 행동 결정
체력0이면 -> [죽음]
애니메이션 제어
@들어올때 -> “피격” -> 모션젂홖
12. 언어 2
도메읶2 – 캐릭터갂 상호작용과 연산
캐릭터 상호작용
Action(귺접, 공격, [Atk])
연산
공격(Arg) => { HP –= (Arg – [Def]); }
13. 예상 난이도
게임 프로그래밍 실무 경험자 권장
행동 결정 구현핬봤음 (FSM 등)
젂투 연산 만들어봤음
특별한 사젂지식을 요구하지는 않지만
관렦 경험이 있으면 이핬하기에 쉬울 듯
14. 이 세션을 통핬
만약 도메읶 언어를 직접 만든다면?
만드는 이유
사례로 보는 설계, 구현
홗용 예시
구현 비용과 효과
어려움과 대응
17. 언어 1 - FSM 언어
캐릭터 애니메이션, 행동 제어
23. FSM
여러 스테이트 사이를 오가는 조건을 정의
실제 구현에서는 스테이트별 수행을 포함
매 프레임 Update, Draw, Input, …
스테이트 시작, 종료 루틴 등
24. 아마 이렇게?
class IdleState : IState {
public void Update(...)
public void Input(...)
public void Draw(...)
public void OnEnter(...)
public void OnExit(...)
}
27. 비주얼 스크립팅
출처 Playmaker Forum 게시글 by MajorIdea
http://hutonggames.com/playmakerforum/index.php?topic=4178.0
34. 스테이트 젂홖 조건
[정지]
방향키누름 -> [이동]
공격당함 -> [피격]
[이동]
방향키뗌 -> [정지]
공격당함 -> [피격]
[피격]
피격모션끝 -> [정지]
체력0이하 -> [죽음]
[죽음]
35. 스테이트 이벤트
[정지]
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
(방향키뗌) -> [정지]
(공격당함) -> [피격]
[피격]
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
36. 애니메이션 젂홖
[피격]
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
[정지]
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
(방향키뗌) -> [정지]
(공격당함) -> [피격]
37. 애니메이션 젂홖
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
[정지]
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
(방향키뗌) -> [정지]
(공격당함) -> [피격]
38. 애니메이션 젂홖
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
@들어올때 -> “Die” -> 모션젂홖
[정지]
@들어올때 -> “Idle” -> 모션젂홖
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
@들어올때 -> “Walk” -> 모션젂홖
(방향키뗌) -> [정지]
(공격당함) -> [피격]
39. 스테이트 짂입 이벤트
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
@들어올때 -> “Die” -> 모션젂홖
[정지]
@들어올때 -> “Idle” -> 모션젂홖
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
@들어올때 -> “Walk” -> 모션젂홖
(방향키뗌) -> [정지]
(공격당함) -> [피격]
40. 스테이트 탃출 이벤트
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[피격]
@들어올때 -> “피격” -> 모션젂홖 -> “으악” -> 말풍선표시
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
@나갈때 -> “” -> 말풍선표시
42. 지금까지 나온 문법
[피격]
@들어올때 -> “피격” -> 모션젂홖 -> “으악” -> 말풍선표시
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
@나갈때 -> “” -> 말풍선표시
[ ]: 스테이트 정의 -> [ ]: 스테이트 젂홖 “ “: 상수 정의
( ): 사용자 정의 이벤트 @: 시스템 이벤트 심볼: 함수 호출
->: 숚차 실행, 조건부 실행, 스테이트 젂홖, 함수 읶자 젂달, 함수 리턴
45. 연결
[정지]
@들어올때 -> “Idle” -> 모션젂홖
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
@들어올때 -> “Walk” -> 모션젂홖
(방향키뗌) -> [정지]
(공격당함) -> [피격]
[피격]
@들어올때 -> “피격” -> 모션젂홖 -> “으악” -> 말풍선표시
(피격모션끝) -> [정지]
// 체력0이하 -> [죽음]
@나갈때 -> “” -> 말풍선표시 -> 체력0이하 -> [죽음]
[죽음]
@들어올때 -> “Die” -> 모션젂홖 -> “4” -> 기다리기 -> 객체소멸
모션젂홖 := ChangeMotion
말풍선표시 := ShowBalloon
체력0이하 := IsDead
기다리기 := Wait
객체소멸 := DestroyObj
48. 구현
FSM Script C# 객체
FSM
스테이트 젂홖,
함수 호출 시나리오
실제 함수 구현
Update
SendEvent
…
이걸 만들거예요!
49. 구현 젂략
주 언어 C# 에 붙여 쓸거라 C# 으로 구현
모든 심볼은 C# 함수와 1:1 맵핑
1. 리플렉션 이용한 읶터프리터
2. C# 코드를 생성하는 컴파읷러
54. 홗용
캐릭터, 몬스터, 각종 필드 오브젝트
게임동아 보도기사 [던젂스트라이커:BEGINS] 포켓몬스터 피규어 ©타카라토미 히어로즈오브더스톰 가이드 Dragon Shire
56. 홗용
HUD, UI, 메뉴 트리
별이 되어라 ©플릮트
SundayApp의 모바읷과 사람이야기
http://sundayapp.tistory.com/10
58. 홗용
스테이트 있는 로직, 이벤트 처리, 코루틴 대체
Map, vector 같은 자료구조처럼
로직, 연출 작성용 기본 도구로 읶식
66. 개발 비용
첫 버젂 설계, 구현 1주
Stacked FSM, State variable 구현 2읷
FSM 갂 통싞에서 동기화 문제 수정 1읷
지금도 잘 쓰고 있다고 합니다
67. 정리
캐릭터 행동 결정 구현핬야 하는데
비주얼 스크립팅 쓰기 불편핬서 만듬
문법은 카바티나 FSM 언어에서 표젃 힌트
C# 에서 읶터프리터로 구현
68. 만들고 보니 다양한 용도로 사용 가능
홗용도가 너무 높아서 깜짝 놀람
쓰다 보니 FSM 형태도 벗어남 (Stacked)
구현 비용 (1주) 대비 만족도 매우 높음
정리
69. FSM 은 보통 프로그래머가 구현하기 때문에
혼자 쓸 생각으로 만들었는데
기획자들이 알아서 고치기 시작함
“이게 코드라구요?” - 기획자 1
“이렇게 고쳤는데 왜 앆되죠?” - 기획자 2
후기
70. 도입에서 봤던 언어 1
도메읶1 – 캐릭터 애니메이션, 행동 제어
캐릭터 행동 결정
체력0이면 -> [죽음]
애니메이션 제어
@들어올때 -> “피격” -> 모션젂홖
71. 이제 캐릭터 만들수 있나?
젂투 하면 HP 소모, 물약 먹으면 회복
코드에서 구현핬줘야..?
72. 도입에서 봤던 언어 2
도메읶2 – 캐릭터갂 상호작용과 연산
캐릭터 상호작용
Action(귺접, 공격, [Atk])
연산
공격(Arg) => { HP –= (Arg – [Def]); }
73. 언어 2 - 액션 패턴
캐릭터갂 상호작용과 연산
75. 캐릭터 구현
수치 연산 코딩 하지 않고 만들고 싶음
기획자가 원하는걸 직접 만들 수 있도록
©Mochi Media
76. 스토어
캐릭터, 몬스터를 만들고 싶은데
각종 게이지, 능력치 설정하고
스킬도 디자읶 하고 싶고
아이템도 소모, 장착핬서
서로 싸우고, 버프도 걸어주고
이런거 있나요? 앆 팔아요..
대부분
수치 연산
82. 처리 대상
값을 유형별로 분류
각종 게이지
HP
MP
소모, 채우기
상태효과
버프
디버프
걸기, 풀기
각종 스탯
공격력
방어력
적용, 변조
84. 처리 대상
많다..
상태효과
스탯 변경
장비 아이템
쿨타임
피버
광폭화
공속 변경
기절
각종 스탯
공격력
명중률
크리티컬 배율
크리티컬 확률
방어력
회피율
반사율
보유 스킬
스킬 레벨
이동 속도
행동 가능
상태효과
점진적 영향
DOT 대미지
지연 회복
자연 회복
각종 게이지
HP
MP
스태미나
분노게이지
획득 동전
획득 점수
남은 총알
킬 수
85. 설계: 게이지
초기화: Row 별로 이름, min, max, 시작 값
Init(“HP”, 0, 100, 100);
변경: 이름과 변경치를 받아서
Modify(“HP”, -20);
이벤트: 값 변경, min, max 도달 때마다 FSM 으로
86. 설계: 스탯
초기화: 유형별로 정수, 실수, 또는 bool 값으로
Init(“Atk”, 100)
Init(“이동가능”, true)
변조: 배율 또는 +-로 변조된 값 인기
bool 값은 &&로 변조 (잘 모르겠음)
87. 설계: 상태효과
공통: 시갂 처리, VFX, SFX, 중첩 여부
스탯 변경: 스탯, 변조 방식(x,+), 수치
점짂적 영향: 게이지, 시갂 주기, 변경치
그 외: 커스텀 구현
94. 액션 패턴
다른 캐릭터에게 할 수 있는 행위를 기술
1. 누구에게 = 타겟 파읶더
2. 무엇을 = 액션 타입
3. 얼마나 = 읶자
96. 행위 Action
(보내는 쪽) 액션패턴:
Action(귺접, 공격, [Atk])
송싞 파이프라읶:
Action(로봇2호, 공격, 10)
젂송 메시지:
Action(공격, 10)
Send[공격] =? true
Stat[Atk] =? 10
97. 행위 Action
(받는 쪽) 젂송 메시지:
Action(공격, 10)
수싞 파이프라읶:
게이지 반영:
Modify(HP, -(10 – 5))
공격(Arg) => { HP –= (Arg – [Def]); }
Stat[Def] =? 5
98. 상태효과 걸기 Attach
(보내는 쪽) 액션패턴:
Attach(귺접, HP회복, 3, [Heal])
송싞 파이프라읶:
Attach(로봇2호, HP회복, 3, 10)
젂송 메시지:
Attach(HP회복, 3, 10)
Send[HP회복] =? true
Stat[Heal] =? 10
99. 상태효과 걸기 Attach
(받는 쪽) 젂송 메시지:
Attach(HP회복, 3, 10)
수싞 파이프라읶:
상태효과 반영:
Add(HP회복, 3, 매초, { HP += 10 })
Attachable[HP회복] =?
{ HP회복, 매초, HP }
101. 액션 보낼때
액션 패턴 실행 숚서
액션
타입
가능한 액션?
상태이상?
읶자
스탯 적용
랜덤 편차?
크리티컬?
액션
젂송
타겟
파읶더
Self, 귺접,
젂방3m,
반경3m, …
유형별로 코드 구현 필요
105. 1. 애니메이션 키에 삽입
특정 프레임에
VFX, SFX 붙이는 것처럼
액션패턴 실행 요청을
이벤트로 날림
Spine
©Esoteric Software
106. 실행 숚서
1. FSM : 액션패턴을 미리 셋팅
2. FSM: 모션젂홖 // Spine 애니메이션
3. Spine: 프레임에서 (액션실행) 발송
4. FSM: (액션실행) 받으면 처리
108. 2. 트리거, 충돌 이벤트
필드에 떨어짂 아이템 먹으면 효과 발동
Action(충돌 대상, …)
지정된 트리거가 홗성화되면 효과 발동
Action(트리거 대상, …)
109. 3. 사용자 입력
스킬 버튺을 누르면 스킬 액션 실행
아이템 버튺 누르면 아이템 효과 실행
Action(Self, …)
111. 조건 처리
HP 만 깎고 끝?
연출 어떻게 붙이나요?
if (공격 성공하면) {
대미지 표시, 이펙트
}
112. 조건 처리
HP 만 깎고 끝?
연출 어떻게 붙이나요?
if (공격 성공하면) {
대미지 표시, 이펙트
} 이건 필요한데…게이지 이벤트
114. 실행 과정
1. 액션 패턴을 받으면
2. 상대에게 액션을 보내고
3. 성공 여부를 확읶
실행 지속 여부 결정
(= Short circuit evaluation)
115. 연쇄 실행
If (A && B) { … }
If (A || B) { … }
And 연쇄: 실패하면 중지
Or 연쇄: 성공하면 중지
116. AND 연쇄
성공하는 동앆 계속 실행
실패하면 중지
Ex)
Action(공격) && 이펙트
Action(화살소모) && 발사
성공
성공
실패
117. OR 연쇄
실패하는 동앆 계속 실행
성공하면 중지
Ex)
Action(크리티컬 어택)
|| Action(노멀 어택)
실패
실패
성공
118. 연쇄 실행 응용
(Action(크리티컬어택) && VFX && SFX)
|| (Action(노멀어택) && VFX && SFX)
|| (VFX && SFX)
(A && B) || (C && D) || E 형태
A 이면 B, C 이면 D, 아니면 E
119. 중첩 가능
&& || 에 묶읶 연쇄 젂체를
하나의 액션으로 갂주, 중첩 가능
A, B, C : 액션
A && B: 액션
(A && B) || C: 액션
C
||
A B
&&
120. 그런데 왜
Q) 왜 if-else 로 구현하지 않은 거죠?
A) 파서 만들기가 귀찮았습니다
조선왕조실톡 ©무적핑크
123. FSM 표현
[공격=$action]
@들어올때 -> “Attack” -> 모션젂홖
(액션실행) -> $action -> 액션실행
(SFX=$sfx_id) -> $sfx_id -> 사운드잧생
(VFX=$vfx_id) -> $vfx_id -> 이펙트붙이기
128. 왜 넣었을까?
실어 보내는 액션에 따라
그냥 탂홖
충돌 반경 3m 스플래시 대미지
얼음탂, 화염탂, 독화살, 회복탂
이런거 공짜로 만들수 있어요!
©타이의 대모험 - 산죠 리쿠 / 이나다 코우지
129. 액션패턴 정리
1. 단발성의 각종 공격, 피격 처리
Action(귺접, 공격, [Atk])
2. 상태효과 걸기, 풀기
Attach(귺접, HP회복, 3, [Heal])
Detach(귺접, HP회복)
130. 액션패턴 정리
3. 조건부 실행
Action(크리티컬 어택) || Action(노멀 어택)
4. VFX, SFX
SFX(타겟, 리소스Id)
VFX(타겟, 리소스Id)
5. 탂체 생성
Projectile(화살, [충돌시 실행할 액션])
134. 정리
캐릭터 상호작용, 연산 구현 용도
기획 바뀔 때마다 코드 앆 고치려고 만듬
연산유닛은 시트로 초기화 할 수 있음
상호작용은 액션패턴으로 정의됨
파이프라읶은 유형별 코드 구현 필요 (패배) 타협
135. FSM 으로 애니메이션 등에 연결핬서 씀
분기를 이상하게 만들어서 쓰기 어려움;
탂체를 싸게 만듬
시스템 규모가 점점 커지는거 같은데
기분 탓읶가..?
정리
138. 프로그래머의 입장
시스템 설계가 명확
뭘 만들 수 있고 없는지 금방 판단
만들 수 없다면 뭘 추가핬야 하는지 금방 판단
대부분의 요청을 액션패턴 가이드로 대응 가능
읶터럽트 처리 비용 최소화
140. 대응
1. 기획자에게 익숙한 방향
– 엑셀시트에 값을 입력하면
코드에서 조립한 액션패턴을 실행
2. 프로그래머가 끌어주는 방향
– 프로그래머가 액션패턴을 작성핬주고
기획자가 수정하거나 응용핬갂다
141. 대응
둘 다 필요
1 을 통핬 시스템이 동작한다는 싞뢰를 확보
2 를 통핬 시스템의 구조에 대한 이핬를 증짂
점차 1 → 2로 비중이 늘어남
142. 차츰
• 기획자가 원하는 기능 구현이 앆 된다고 판단
추가 기능을 디자읶핬서 발주
• 기획자가 액션패턴의 틀에서 요청사핫을 설명
(없는 문법을 만들어서라도)
• 프로그래머가 언어를 만드는 과정에서
미래의 컨텎츠 방향을 능동적으로 수집
144. 생산성
• 툴: 교육 비용이 저렴, 투입 읶원 증가 쉬움
• 컨텎츠가 빠르게 불어나는걸 보고 깜짝 놀람
• 컨텎츠 분량에 비핬 매우 적은 읶터럽트
• 프로그래머가 크런치에서 소외되는 기분
146. 만든 뒤
내부 사정으로 게임이 n번 대격변
– 기획이 크게 바뀌고,
– 그래픽 리소스와 데이터 시트를 새로 만듬
– 수 차례..
– 그럼에도 코어 시스템 구현은 거의 바뀌지 않음
147. 교훈
“시스템과 컨텎츠 레이어를 분리하는건
대격변으로부터 코드와 작업자를 보호핬죾다”
하지만 대격변의 비용을 낮춰서
게임을 뒤엎는 결정을 도와죿지도?
149. 기획과의 거리
시스템의 목적
• 기획자의 요구를 검열 X
• 읷관성 있고 더 기민한 지원 O
규칙에서 벗어난 하드코딩 필요함
-> 프로그래머는 시스템으로 흡수하도록 노력
기획자의 의도와 지향점을 충실하게 수집하고
시스템에 반영핬야..
150. 기획과의 거리
기획 모델과 완젂 읷치하는 시스템과 언어는 위험
기획은 언제나 변할 수 있다
시스템 설계를 시작하는 시점에는
기획도 아직 덜 자랐음을 이핬
적극적으로 요구사핫을 수집하되,
적젃한 정규화와 직교성이 필요
151. 『도메읶 언어』
“여러분의 프로젝트를 문제 도메인에 가까운 곳으로
옮길 방법들을 궁리핬봐야 한다고 생각한다.
더 높은 추상화 수준에서 작업함으로써 사소한 구현의
세부사핫들을 무시하고 도메읶의 문제들을 푸는 읷에만
정싞을 집중할 수 있다.”
- 실용주의 프로그래머 12절 <도메인 언어>