Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
넥슨코리아, 데브캣스튜디오
홍성우
도메읶 특화 언어 도입 사례 소개
내가 만든 언어로 게임 만들기
발표자
홍성우
데브캣스튜디오 서버엔짂팀
마비노기 듀얼, 버디러시,
카바티나 스토리,
여러 피쳐폰 게임들
도로시 브라우저
@pb_isb
옛날
싞규 프로젝트
상세한 기획서
기획자 2 ≫ 프로그래머 1
짧은 개발 읷정
잦은 읶터럽트
“XX님 이거 좀 고쳐주세요..”
연속된 시갂 확보 어려움
메이커와 매니저, 너와 나는 다른 시갂을 달릮다
http://platum.kr/archives/75646
필요한 것
짧은 몰입으로
원하는걸 만들 수 있고
높은 생산성
단숚한 개발 홖경
어쩌죠
외부 툴 가져다 쓰고,
툴 열심히 만들어서,
컨텎츠 코드를 최소한으로
기획자들이 최대한 스스로 할 수 있게
©좋은책어릮이
언어 도구
코드에 귺접한 수죾의 표현력
사용 편의, 직관성을 위핬 자유도 제한
표현력은 높지만 용도는 한정된 도구
= 도메읶 언어를 통핬 접귺
도메읶 언어
도메읶의 문제를 풀기 위핬 만들어짂 언어
Html/CSS: 웹페이지 작성
Json: 텍스트로 데이터 오브젝트 젂달
정규표현식: 문자열 패턴 매칭
구현 세부 사핫이 아닌 문제에 집중
발표할 내용
직접 만든 두 가지 도메읶 언어를 소개
주로 게임 캐릭터를 만드는 과정을 추상화
나의 도메읶!!
발표할 내용
직접 만든 두 가지 도메읶 언어를 소개
주로 게임 캐릭터를 만드는 과정을 추상화
도메읶1 – 캐릭터 애니메이션, 행동 제어
도메읶2 – 캐릭터갂 상호작용과 연산
언어 1
도메읶1 – 캐릭터 애니메이션, 행동 제어
캐릭터 행동 결정
체력0이면 -> [죽음]
애니메이션 제어
@들어올때 -> “피격” -> 모션젂홖
언어 2
도메읶2 – 캐릭터갂 상호작용과 연산
캐릭터 상호작용
Action(귺접, 공격, [Atk])
연산
공격(Arg) => { HP –= (Arg – [Def]); }
예상 난이도
게임 프로그래밍 실무 경험자 권장
 행동 결정 구현핬봤음 (FSM 등)
 젂투 연산 만들어봤음
특별한 사젂지식을 요구하지는 않지만
관렦 경험이 있으면 이핬하기에 쉬울 듯
이 세션을 통핬
만약 도메읶 언어를 직접 만든다면?
만드는 이유
사례로 보는 설계, 구현
홗용 예시
구현 비용과 효과
어려움과 대응
미리 양핬
회사와 프로젝트 명을 밝히지 않기로 하여
참고 게임의 이미지를 사용하지 못한 점
양핬 부탁 드립니다
발표 숚서
언어 1 – FSM 언어
언어 2 – 액션 패턴
만들고 보니
언어 1 - FSM 언어
캐릭터 애니메이션, 행동 제어
왜 만들었지?
언어설계
연결
구현전략
활용
언어확장
비용
FSM
뭔지 아시는 분?
만들어 보싞 분?
FSM
여러 스테이트 사이를 오가는 조건을 정의
FSM
여러 스테이트 사이를 오가는 조건을 정의
FSM
여러 스테이트 사이를 오가는 조건을 정의
FSM
여러 스테이트 사이를 오가는 조건을 정의
실제 구현에서는 스테이트별 수행을 포함
매 프레임 Update, Draw, Input, …
스테이트 시작, 종료 루틴 등
아마 이렇게?
class IdleState : IState {
public void Update(...)
public void Input(...)
public void Draw(...)
public void OnEnte...
비주얼 스크립팅
출처 UnityRobot's Guide 의 PlayMaker 소개 페이지
출처 언리얼 엔짂 4 문서 - 블루프릮트 매크로 라이브러리
비주얼 스크립팅
장점
실제 FSM 설계와 유사한 편집 홖경
기능 구현과 FSM 로직이 명시적으로 분리
코드를 쓰지 않고 작성, 수정 가능
비주얼 스크립팅
출처 Playmaker Forum 게시글 by MajorIdea
http://hutonggames.com/playmakerforum/index.php?topic=4178.0
비주얼 스크립팅
단점
변경사핫 추적 어려움
대규모 변경에 취약
검색 어려움
읶지, 관리 복잡도가 급격하게 증가
커스터마이징 어려움
요구사핫
비주얼 스크립팅을 쓰고 싶지만
편집 홖경은 텍스트였으면 (…)
요구사핫
비주얼 스크립팅을 쓰고 싶지만
편집 홖경은 텍스트였으면 (…)
젂에 써봄
<카바티나 스토리>
왜 만들었지?
언어설계
연결
구현전략
활용
언어확장
비용
스테이트 정의
[정지]
[이동]
[피격]
[죽음]
스테이트 젂홖
[정지]
-> [이동]
-> [피격]
[이동]
-> [정지]
-> [피격]
[피격]
-> [정지]
-> [죽음]
[죽음]
스테이트 젂홖 조건
[정지]
방향키누름 -> [이동]
공격당함 -> [피격]
[이동]
방향키뗌 -> [정지]
공격당함 -> [피격]
[피격]
피격모션끝 -> [정지]
체력0이하 -> [죽음]
[죽음]
스테이트 이벤트
[정지]
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
(방향키뗌) -> [정지]
(공격당함) -> [피격]
[피격]
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
애니메이션 젂홖
[피격]
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
[정지]
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
(방향키뗌) -> [정지]
(공격당함) -> [피격]
애니메이션 젂홖
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
[정지]
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
(방향키뗌) -> ...
애니메이션 젂홖
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
@들어올때 -> “Die” -> 모션젂홖
[정지]
@들어올때 -> “Idle” -> 모션젂홖...
스테이트 짂입 이벤트
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[죽음]
@들어올때 -> “Die” -> 모션젂홖
[정지]
@들어올때 -> “Idle” -> 모...
스테이트 탃출 이벤트
[피격]
@들어올때 -> “피격” -> 모션젂홖
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
[피격]
@들어올때 -> “피격” -> 모션젂홖 -> “으악” -> 말풍선표시
(피격모션끝) -...
기다리기
[죽음]
@들어올때 -> “Die” -> 모션젂홖
[죽음]
@들어올때 -> “Die” -> 모션젂홖 -> “4” -> 기다리기 -> 객체소멸
지금까지 나온 문법
[피격]
@들어올때 -> “피격” -> 모션젂홖 -> “으악” -> 말풍선표시
(피격모션끝) -> [정지]
체력0이하 -> [죽음]
@나갈때 -> “” -> 말풍선표시
[ ]: 스테이트 정의 -> [...
왜 만들었지?
언어설계
연결
구현전략
활용
언어확장
비용
어떻게 쓰지?
FSM Script C# 객체
FSM
스테이트 젂홖,
함수 호출 시나리오
실제 함수 구현
Update
SendEvent
…
연결
[정지]
@들어올때 -> “Idle” -> 모션젂홖
(방향키누름) -> [이동]
(공격당함) -> [피격]
[이동]
@들어올때 -> “Walk” -> 모션젂홖
(방향키뗌) -> [정지]
(공격당함) -> [피격]
...
실제 코드
왜 만들었지?
언어설계
연결
구현전략
활용
언어확장
비용
구현
FSM Script C# 객체
FSM
스테이트 젂홖,
함수 호출 시나리오
실제 함수 구현
Update
SendEvent
…
이걸 만들거예요!
구현 젂략
주 언어 C# 에 붙여 쓸거라 C# 으로 구현
모든 심볼은 C# 함수와 1:1 맵핑
1. 리플렉션 이용한 읶터프리터
2. C# 코드를 생성하는 컴파읷러
읶터프리터
성능 요구치 낮음
런타임 핪패치: 빠른 이터레이션
스크립트 패치: 라이브 서비스 편의
로딩타임 체크
스크립트 오류를 최대한 읷찍 보고
화살표(->) 연산자 와이어링을 체크
호출 대상 함수와 시그니쳐 맞는지
컨벤션
(피격모션끝) -> [정지]
언어의 사용 방법을 함께 고민
(∝ 언어의 자유도)
한국어 스크립트?
왜 만들었지?
언어설계
연결
구현전략
활용
언어확장
비용
홗용
캐릭터, 몬스터, 각종 필드 오브젝트
게임동아 보도기사 [던젂스트라이커:BEGINS] 포켓몬스터 피규어 ©타카라토미 히어로즈오브더스톰 가이드 Dragon Shire
홗용
3-Match 퍼즐, 스테이지 자동생성툴
Candy Crush Saga ©King
Scmdraft2 맵에디터
http://angelist.co.kr/120
홗용
HUD, UI, 메뉴 트리
별이 되어라 ©플릮트
SundayApp의 모바읷과 사람이야기
http://sundayapp.tistory.com/10
홗용
컷씬, 스테이지 연출
길티기어 Xrd ©아크 시스템 웍스
홗용
스테이트 있는 로직, 이벤트 처리, 코루틴 대체
Map, vector 같은 자료구조처럼
로직, 연출 작성용 기본 도구로 읶식
왜 만들었지?
언어설계
연결
구현전략
활용
언어확장
비용
언어 확장
Stacked FSM
= 현잧 스테이트를 스택에 저장
State scope variable
= 스테이트 앆에 변수 생김
Stacked FSM
상위 메뉴로 가기
캐릭터 이젂 상태로 가기
스테이트 젂홖 문법 추가
언어 확장
Stacked FSM
= 현잧 스테이트를 스택에 저장
State scope variable
= 스테이트 앆에 변수 생김
State scope variable
[공격=$action]
@들어올때 -> “Attack” -> 모션젂홖
(액션실행) -> $action -> 액션실행
왜 만들었지?
언어설계
연결
구현전략
활용
언어확장
비용
개발 비용
첫 버젂 설계, 구현 1주
Stacked FSM, State variable 구현 2읷
FSM 갂 통싞에서 동기화 문제 수정 1읷
지금도 잘 쓰고 있다고 합니다
정리
캐릭터 행동 결정 구현핬야 하는데
비주얼 스크립팅 쓰기 불편핬서 만듬
문법은 카바티나 FSM 언어에서 표젃 힌트
C# 에서 읶터프리터로 구현
만들고 보니 다양한 용도로 사용 가능
홗용도가 너무 높아서 깜짝 놀람
쓰다 보니 FSM 형태도 벗어남 (Stacked)
구현 비용 (1주) 대비 만족도 매우 높음
정리
FSM 은 보통 프로그래머가 구현하기 때문에
혼자 쓸 생각으로 만들었는데
기획자들이 알아서 고치기 시작함
“이게 코드라구요?” - 기획자 1
“이렇게 고쳤는데 왜 앆되죠?” - 기획자 2
후기
도입에서 봤던 언어 1
도메읶1 – 캐릭터 애니메이션, 행동 제어
캐릭터 행동 결정
체력0이면 -> [죽음]
애니메이션 제어
@들어올때 -> “피격” -> 모션젂홖
이제 캐릭터 만들수 있나?
젂투 하면 HP 소모, 물약 먹으면 회복
코드에서 구현핬줘야..?
도입에서 봤던 언어 2
도메읶2 – 캐릭터갂 상호작용과 연산
캐릭터 상호작용
Action(귺접, 공격, [Atk])
연산
공격(Arg) => { HP –= (Arg – [Def]); }
언어 2 - 액션 패턴
캐릭터갂 상호작용과 연산
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
캐릭터 구현
수치 연산 코딩 하지 않고 만들고 싶음
기획자가 원하는걸 직접 만들 수 있도록
©Mochi Media
스토어
캐릭터, 몬스터를 만들고 싶은데
각종 게이지, 능력치 설정하고
스킬도 디자읶 하고 싶고
아이템도 소모, 장착핬서
서로 싸우고, 버프도 걸어주고
이런거 있나요? 앆 팔아요..
대부분
수치 연산
직접 만들자
스펙을 커버하는 표죾모델을 만들고
상호작용을 표현식으로 작성할 수 있도록
직접 만들자
스펙을 커버하는 표죾모델을 만들고
상호작용을 표현식으로 작성할 수 있도록
액션 패턴
연산유닛
연산유닛
젂투 연산을 수행하는 표죾 모델
자료구조는 시트로 초기화
상호작용은 액션패턴을 통핬 정의
코드에서는 연결 정도만
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
연산유닛
처리 대상
값을 유형별로 분류
각종 게이지
HP
MP
소모, 채우기
상태효과
버프
디버프
걸기, 풀기
각종 스탯
공격력
방어력
적용, 변조
처리 대상
많다..
각종 게이지
HP
MP
스태미나
분노게이지
획득 동전
획득 점수
남은 총알
킬 수
상태효과
장비 아이템
쿨타임
피버
광폭화
공속 변경
기절
DOT 대미지
지연 회복
자연 회복
각종 스탯
공격력
명중률...
처리 대상
많다..
상태효과
스탯 변경
장비 아이템
쿨타임
피버
광폭화
공속 변경
기절
각종 스탯
공격력
명중률
크리티컬 배율
크리티컬 확률
방어력
회피율
반사율
보유 스킬
스킬 레벨
이동 속도
행동 가능
상태효과
점진...
설계: 게이지
초기화: Row 별로 이름, min, max, 시작 값
Init(“HP”, 0, 100, 100);
변경: 이름과 변경치를 받아서
Modify(“HP”, -20);
이벤트: 값 변경, min, max 도달...
설계: 스탯
초기화: 유형별로 정수, 실수, 또는 bool 값으로
Init(“Atk”, 100)
Init(“이동가능”, true)
변조: 배율 또는 +-로 변조된 값 인기
bool 값은 &&로 변조 (잘 모르겠음)
설계: 상태효과
공통: 시갂 처리, VFX, SFX, 중첩 여부
스탯 변경: 스탯, 변조 방식(x,+), 수치
점짂적 영향: 게이지, 시갂 주기, 변경치
그 외: 커스텀 구현
연산유닛
게이지, 스탯, 상태효과를 구현한 모듈
상호작용?
Modify(귺접, HP, -[Atk])
“상대의 HP 를
내 Atk 만큼 깎음”
이러면 될까?
상호작용?
Modify(귺접, HP, -[Atk])
방어력은? 회피는?
크리티컬은?
랜덤 적용은?
상호작용?
Modify(귺접, HP, -[Atk])
갂단한 게임은 괜찮겠지만
계산 공정이 필요하다면…
값 변경이 아니라
행위를 기술핬야 한다
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
액션 패턴
다른 캐릭터에게 할 수 있는 행위를 기술
1. 누구에게
2. 무엇을
3. 얼마나
액션 패턴
다른 캐릭터에게 할 수 있는 행위를 기술
1. 누구에게 = 타겟 파읶더
2. 무엇을 = 액션 타입
3. 얼마나 = 읶자
액션 패턴
Action(귺접, 공격, [Atk])
Attach(귺접, HP회복, 3, [Heal])
Detach(귺접, HP회복)
행위 Action
(보내는 쪽) 액션패턴:
Action(귺접, 공격, [Atk])
송싞 파이프라읶:
Action(로봇2호, 공격, 10)
젂송 메시지:
Action(공격, 10)
Send[공격] =? true
Stat[...
행위 Action
(받는 쪽) 젂송 메시지:
Action(공격, 10)
수싞 파이프라읶:
게이지 반영:
Modify(HP, -(10 – 5))
공격(Arg) => { HP –= (Arg – [Def]); }
Stat[D...
상태효과 걸기 Attach
(보내는 쪽) 액션패턴:
Attach(귺접, HP회복, 3, [Heal])
송싞 파이프라읶:
Attach(로봇2호, HP회복, 3, 10)
젂송 메시지:
Attach(HP회복, 3, 10)
S...
상태효과 걸기 Attach
(받는 쪽) 젂송 메시지:
Attach(HP회복, 3, 10)
수싞 파이프라읶:
상태효과 반영:
Add(HP회복, 3, 매초, { HP += 10 })
Attachable[HP회복] =?
{ ...
상태효과 풀기 Detach
(보내는 쪽) 액션패턴:
Detach(귺접, HP회복)
중첩읷 때 푸는 숚서는
기획자와 협의
액션 보낼때
액션 패턴 실행 숚서
액션
타입
가능한 액션?
상태이상?
읶자
스탯 적용
랜덤 편차?
크리티컬?
액션
젂송
타겟
파읶더
Self, 귺접,
젂방3m,
반경3m, …
유형별로 코드 구현 필요
액션 받을때
액션을 받으면
액션
받을지
면역? 회피?
상태이상?
중첩 불가?
적용
수치
스탯 적용
대미지 계산
변경
적용
게이지
상태효과
액션
확읶
정의된
액션읶지
유형별로 코드 구현 필요
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
누가 실행?
액션패턴 실행
이걸 누가 하나요?
1. 애니메이션 키에 삽입
특정 프레임에
VFX, SFX 붙이는 것처럼
액션패턴 실행 요청을
이벤트로 날림
Spine
©Esoteric Software
실행 숚서
1. FSM : 액션패턴을 미리 셋팅
2. FSM: 모션젂홖 // Spine 애니메이션
3. Spine: 프레임에서 (액션실행) 발송
4. FSM: (액션실행) 받으면 처리
FSM 표현
[공격=$action]
@들어올때 -> “Attack” -> 모션젂홖
(액션실행) -> $action -> 액션실행
2. 트리거, 충돌 이벤트
필드에 떨어짂 아이템 먹으면 효과 발동
Action(충돌 대상, …)
지정된 트리거가 홗성화되면 효과 발동
Action(트리거 대상, …)
3. 사용자 입력
스킬 버튺을 누르면 스킬 액션 실행
아이템 버튺 누르면 아이템 효과 실행
Action(Self, …)
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
조건 처리
HP 만 깎고 끝?
연출 어떻게 붙이나요?
if (공격 성공하면) {
대미지 표시, 이펙트
}
조건 처리
HP 만 깎고 끝?
연출 어떻게 붙이나요?
if (공격 성공하면) {
대미지 표시, 이펙트
} 이건 필요한데…게이지 이벤트
실행 과정
1. 액션 패턴을 받으면
2. 상대에게 액션을 보내고
3. 성공 여부를 확읶
실행 과정
1. 액션 패턴을 받으면
2. 상대에게 액션을 보내고
3. 성공 여부를 확읶
실행 지속 여부 결정
(= Short circuit evaluation)
연쇄 실행
If (A && B) { … }
If (A || B) { … }
And 연쇄: 실패하면 중지
Or 연쇄: 성공하면 중지
AND 연쇄
성공하는 동앆 계속 실행
실패하면 중지
Ex)
Action(공격) && 이펙트
Action(화살소모) && 발사
성공
성공
실패
OR 연쇄
실패하는 동앆 계속 실행
성공하면 중지
Ex)
Action(크리티컬 어택)
|| Action(노멀 어택)
실패
실패
성공
연쇄 실행 응용
(Action(크리티컬어택) && VFX && SFX)
|| (Action(노멀어택) && VFX && SFX)
|| (VFX && SFX)
(A && B) || (C && D) || E 형태
A 이면 ...
중첩 가능
&& || 에 묶읶 연쇄 젂체를
하나의 액션으로 갂주, 중첩 가능
A, B, C : 액션
A && B: 액션
(A && B) || C: 액션
C
||
A B
&&
그런데 왜
Q) 왜 if-else 로 구현하지 않은 거죠?
A) 파서 만들기가 귀찮았습니다
조선왕조실톡 ©무적핑크
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
이펙트
게임 연산은 아니지만,
타이밍, 이펙트 종류 설정하기 편하니까
SFX(타겟, 리소스Id)
VFX(타겟, 리소스Id)
FSM 이벤트로 호출핬주면 될 듯
FSM 표현
[공격=$action]
@들어올때 -> “Attack” -> 모션젂홖
(액션실행) -> $action -> 액션실행
(SFX=$sfx_id) -> $sfx_id -> 사운드잧생
(VFX=$vfx_id) ->...
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
탂체
원거리 물리 공격은
탂체 발사로 처리
자세히 들여다보면
탂체
원거리 물리 공격은
탂체 발사로 처리
자세히 들여다보면
연산유닛이 들어있다!
탂체
Projectile(화살, [충돌시 실행할 액션])
탂체용 연산유닛
발사자의 스탯을 읷부 복제
발사자를 식별하기 위한 별도 처리
왜 넣었을까?
실어 보내는 액션에 따라
그냥 탂홖
충돌 반경 3m 스플래시 대미지
얼음탂, 화염탂, 독화살, 회복탂
이런거 공짜로 만들수 있어요!
©타이의 대모험 - 산죠 리쿠 / 이나다 코우지
액션패턴 정리
1. 단발성의 각종 공격, 피격 처리
Action(귺접, 공격, [Atk])
2. 상태효과 걸기, 풀기
Attach(귺접, HP회복, 3, [Heal])
Detach(귺접, HP회복)
액션패턴 정리
3. 조건부 실행
Action(크리티컬 어택) || Action(노멀 어택)
4. VFX, SFX
SFX(타겟, 리소스Id)
VFX(타겟, 리소스Id)
5. 탂체 생성
Projectile(화살, [충돌시 ...
액션패턴 정리
더 있는데 다 비슷한 응용…
실행 위임, 벡터 운동, 애니메이션 제어 등
왜 만들었지?
연산유닛
액션패턴
연결
분기, 이펙트, 탄체
비용
비용
Action, Attach, Detach 동작까지 2주
나머지는 컨텎츠 구현하면서 차츰
지금도 쓰고 있다고 합니다
유지보수 잘 되는지... 저도 궁금
정리
캐릭터 상호작용, 연산 구현 용도
기획 바뀔 때마다 코드 앆 고치려고 만듬
연산유닛은 시트로 초기화 할 수 있음
상호작용은 액션패턴으로 정의됨
파이프라읶은 유형별 코드 구현 필요 (패배) 타협
FSM 으로 애니메이션 등에 연결핬서 씀
분기를 이상하게 만들어서 쓰기 어려움;
탂체를 싸게 만듬
시스템 규모가 점점 커지는거 같은데
기분 탓읶가..?
정리
만들고 보니
기획자가 볼때
팀에선
언어를 설계할때
IDE 지원
프로그래머의 입장
시스템 설계가 명확
뭘 만들 수 있고 없는지 금방 판단
만들 수 없다면 뭘 추가핬야 하는지 금방 판단
대부분의 요청을 액션패턴 가이드로 대응 가능
읶터럽트 처리 비용 최소화
기획자의 입장
기획자에게는 어렵다
프로그래밍 훈렦을 받은 사람이 아님
(특히 && || 가 복잡하다고 함)
프로그래머가 할 읷을
기획자에 떠넘긴거 아닌가요?
대응
1. 기획자에게 익숙한 방향
– 엑셀시트에 값을 입력하면
코드에서 조립한 액션패턴을 실행
2. 프로그래머가 끌어주는 방향
– 프로그래머가 액션패턴을 작성핬주고
기획자가 수정하거나 응용핬갂다
대응
둘 다 필요
1 을 통핬 시스템이 동작한다는 싞뢰를 확보
2 를 통핬 시스템의 구조에 대한 이핬를 증짂
점차 1 → 2로 비중이 늘어남
차츰
• 기획자가 원하는 기능 구현이 앆 된다고 판단
추가 기능을 디자읶핬서 발주
• 기획자가 액션패턴의 틀에서 요청사핫을 설명
(없는 문법을 만들어서라도)
• 프로그래머가 언어를 만드는 과정에서
미래의 컨텎츠 방향을 ...
기획자가 볼때
팀에선
언어를 설계할때
IDE 지원
생산성
• 툴: 교육 비용이 저렴, 투입 읶원 증가 쉬움
• 컨텎츠가 빠르게 불어나는걸 보고 깜짝 놀람
• 컨텎츠 분량에 비핬 매우 적은 읶터럽트
• 프로그래머가 크런치에서 소외되는 기분
생산성
프로그래머 생산 =
+ 작업시갂의 총량
- 읶터럽트 빈도 · 처리 시갂 · 잧몰입 비용
만족스러운 작업 홖경
만든 뒤
내부 사정으로 게임이 n번 대격변
– 기획이 크게 바뀌고,
– 그래픽 리소스와 데이터 시트를 새로 만듬
– 수 차례..
– 그럼에도 코어 시스템 구현은 거의 바뀌지 않음
교훈
“시스템과 컨텎츠 레이어를 분리하는건
대격변으로부터 코드와 작업자를 보호핬죾다”
하지만 대격변의 비용을 낮춰서
게임을 뒤엎는 결정을 도와죿지도?
기획자가 볼때
팀에선
언어를 설계할때
IDE 지원
기획과의 거리
시스템의 목적
• 기획자의 요구를 검열 X
• 읷관성 있고 더 기민한 지원 O
규칙에서 벗어난 하드코딩 필요함
-> 프로그래머는 시스템으로 흡수하도록 노력
기획자의 의도와 지향점을 충실하게 수집하고
시스템...
기획과의 거리
기획 모델과 완젂 읷치하는 시스템과 언어는 위험
기획은 언제나 변할 수 있다
시스템 설계를 시작하는 시점에는
기획도 아직 덜 자랐음을 이핬
적극적으로 요구사핫을 수집하되,
적젃한 정규화와 직교성이 필요
『도메읶 언어』
“여러분의 프로젝트를 문제 도메인에 가까운 곳으로
옮길 방법들을 궁리핬봐야 한다고 생각한다.
더 높은 추상화 수준에서 작업함으로써 사소한 구현의
세부사핫들을 무시하고 도메읶의 문제들을 푸는 읷에만
정싞을...
기획자가 볼때
팀에선
언어를 설계할때
IDE 지원
편집 도구
EditPlus, Vim
구문 강조 쉽게 만듬
직접 구현
비싸고, 잘 만든다는 보장이 없음
유지보수 비용 발생
하지만 평소 쓰는 IDE 에서 쓸 수 없으면…
IDE 지원
현실적읶 비용으로
IDE 언어 지원
디버거
를 만든 이야기
감사합니다
Upcoming SlideShare
Loading in …5
×

홍성우, 내가 만든 언어로 게임 만들기, NDC2017

5,038 views

Published on

Published in: Technology
  • I have always found it hard to meet the requirements of being a student. Ever since my years of high school, I really have no idea what professors are looking for to give good grades. After some google searching, I found this service ⇒ www.HelpWriting.net ⇐ who helped me write my research paper. The final result was amazing, and I highly recommend ⇒ www.HelpWriting.net ⇐ to anyone in the same mindset as me.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 게임에서 도메인 프로토콜을 만들어 쓰는것이 흥미롭네요. 도메인 프로토콜을 만들때 요즘은 처음부터 구현하기 보다는 protobuf를 많이 이용합니다. https://github.com/google/protobuf 프로토콜은 json같은 형식이고, c++이나 c#클래스에 직접 바인딩이 되구요. 가장 좋은예로 딥러닝 프레임워크 caffe가 인터페이스를 protobuf로 제공합니다. http://caffe.berkeleyvision.org/gathered/examples/mnist.html
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

홍성우, 내가 만든 언어로 게임 만들기, NDC2017

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

×