Animations) 분할 - Unity 매뉴얼

마지막 업데이트: 2022년 5월 5일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
하나의 애니메이션화된 캐릭터를 위한 애니메이션 파일 네 개의 예제(.fbx 접미사는 Unity에서 표시되지 않습니다.)

주오이시디 대한민국 대표부

금번 회의는 무형자산(INTANGIBLES), 이전가격문서화(DOCUMENTATION), 위험 및 재구성(RISK AND RECHARACTERZATION), 세원잠식 지불(BASE ERODING PAYMENT), 금융거래(FINANCIAL TRANSACTION) 등 이전가격이슈와 관련된 BEPS문제의 대응과 관련해 주요 이슈들을 확인하고 향후 이전가격작업반의 작업수행방향을 회원국간 논의하는 자리였음

1. 개요

ㅇ 이전가격작업반과 관련된 BEPS 액션플랜은 액션4, 액션8, 액션9, 액션10, 액션13 등 총 5개로 재정위원회 산하 작업반중에서 가장 많은 액션방안을 6작업반에서 담당하고 있음
* 4. 이자 공자 및 기타 금융 지급금을 통한 세원잠식 통제
8. 무형자산 TP결과와 가치증식의 연계
9. 리스크 및 자본의 TP 결과와 가치증식의 연계
10. 기타 고위험 거래의 TP 결과와 가치증식의 연계
13. TP관련 문서화 규정 재검토

ㅇ 금번 회의는 무형자산, 이전가격문서화, 위험 및 재구성, 세원잠식 지불, 금융거래 등 이전가격이슈와 관련된 BEPS문제의 대응과 관련해 정상가격원리를 이용해 세원잠식문제를 해결할 것인지, 아니면 정상가격원리를 벗어난 특별규정을 통해 이전가격관련 BEPS문제를 대응할지, 만약 특별규정을 통해 처리한다면 6작업반의 맨데이트를 벗어나는 것은 아닌지 등 사무국과 회원국간 깊은 고민을 공유한 회의였음

2. 회의 Animations) 분할 - Unity 매뉴얼 주요 내용

(1) 이전가격가이드라인 제 6장(무형자산) 개정관련 논의

□ BEPS 액션플랜과의 관계
ㅇ 이전가격 가이드라인 제 6장(무형자산에 대한 특별 고려)의 개정은 BEPS 액션플랜 8(무형자산 TP결과와 가치증식의 연계)과 직접적으로 관련되는 내용으로, 무형자산의 정의의 구체화 등 무형자산 전반과 관련하여 가이드라인 6장을 개정함으로써 액션플랜 8의 1차 맨데이트(mandate)를 2014년 9월까지 완수할 계획

ㅇ 이에 따라 작업반에서는 14년 5월까지 보고서를 마무리하고 동년 6월 재정위원회에 보고할 계획

ㅇ 무형자산과 관련한 액션플랜 8의 2차 맨데이트(mandate)인 ‘무형자산의 가치를 측정하기 어려운 경우(Hard to value intangilbles)’에 대한 작업은 2015년 9월까지 완수할 계획이나, 동작업을 6장과 별도로 추진할 수 있는지 여부에 대해서는 회원국간 이견 대립

□ 민간공청회(Public Consultation) 개최(12-13일)
ㅇ 주요 내용
- 제 6장 개정안*의 섹션 B(무형자산의 소유권 등)에 대해 동 섹션이 정상가격원리(Arm's Length Principle)를 고수했는지 아니면 벗어났는지에 대해 논란이 있었으며, 무형자산의 이전가격 결정시 정상가격원리를 넘어서 조세회피방지규정(Anti Avoidance Rule)를 적용할 것인지 등에 대해 집중적논의
* (개정안의 구성) 섹션 A(무형자산의 확인), 섹션 B(무형자산의 소유권 및 무형자산의 개발향상보호유지와 관련한 거래), 섹션 C(무형자산의 이전 또는 사용과 관련한 거래), 섹션 D(정상가격결정을 위한 보충적 지침)

- 또한, 공청회에 참석한 민간에서는 무형자산 개정안에 무형자산을 보다 구체적으로 정의해 줄 것을 요구하고, 무형자산의 소유권(Ownership)과 관련해 법적 소유권이 보다 강조되어야 한다는 의견 피력

ㅇ 공청회에 대한 회원국 반응
- (참석대상) NGO의 참석에 대해 반대의견이 있었으나, 영국측에서 NGO의 참석이 필요함을 강하게 주장

- (회의 프로세스) 민간과 분리해서 회의하는 방식, 작업반회의후 공청회개최 방식 등이 거론되었으며, 진정한 토론을 위해 인터넷방송에 대한 반대의견이 있었으나 민간의 개입(input)과 투명성차원에서 민간의 참여가 필요함을 사무국에서 강조


- 전반적으로 무형자산 개정안에 대한 민간의 평가와 관련해 명확성(Clarity)과 확실성(Certainty)측면에서 부족하다는 민간의 우려를 확인

□ 주요 논의 내용
ㅇ 섹션 A(무형자산의 확인) 관련 논의
- 무형자산의 정의*와 관련해 법적 권리(legal right)와 분리이전가능성(separately transferability)이 포함될 것을 프랑스에서 주장**
* (기존 개정안 정의) 소유되거나(owned) 통제되고(controlled) 비특수관계사이의 거래에서 지불할 용의가 있는 물리적 자산이나 금융자산이 아닌 자산
** (프랑스 제안) 분리 이전가능성(separately transferability)이 있거나 계획 또는 법적 권리로부터 나오는 물리적 자산이나 금융자산이 아닌 자산

- 이에 대해, 법적으로 보호되지 않는 경우에도 무형자산이 존재하는 경우와 무형자산을 이전하지 않고 이용하는 경우 등을 들어 대다수 회원국들은 반대하고, 제3자가 지불할 용의가 있으면 무형자산으로 보아야 한다는 입장 표명

- 프랑스가 개정안을 준비해오면 재논의할 것을 사무국에서 제안

- 재논의 결과, 프랑스의 개정안이 기존의 정의안보다 범위를 좁히는 문제*와 여전히 고전적인 문제(영업권, Animations) 분할 - Unity 매뉴얼 재무제표에 나오지 않는 무형자산)를 포섭하지 못하는 문제 등이 지적
* 분리되지 않는 무형자산이 비특수관계사이의 거래에서 지급이 이루어지는 경우가 특수관계자사이의 거래에서는 지급이 되지 않는 문제 발생가능

- 두 개의 정의안(기존 개정안의 정의, 프랑스 제안)을 포함한 개정안을 준비해 14년 3월에 논의할 것을 사무국에서 제안

ㅇ 섹션 B(무형자산의 소유권 등) 관련 논의
- IRR(Intangible related return, 무형자산관련이익)이 잔여이익(residual)인지 전체이익(total)이지 여부가 불분명하고, 사전적(anticipated,ex ante) 이익과 사후적(actual, ex post) 이익의 개념에 대해 명확히 구분해 놓지 못한 점 등에 대한 민간의 지적을 미국측에서 소개

- 이에 대해 민간의 의견을 반영해 섹션 B를 재개정한 뒤 회원국들의 의견을 구하는 방안을 사무국에서 제의

ㅇ 섹션 D(Valuation) 관련 논의
- 현재가치할인법(Discounted Cach Flow)에 편중된 경향, 전제조건과 예제가 부족해서 모호한 점, 보다 포괄적인 지침의 필요성, 국가별 민간의견 청취 필요 등을 영국측에서 주장

- 이에 대해 미국측은 현재안에 대해 개정이 필요치 않음을 강조하고, 사무국에서는 추가적인 민간공청회는 추진시한을 고려했을 때 쉽지 않음을 설명

ㅇ 무형자산이 아닌 비교가능성분석요인으로 보는 요소들 관련 논의
- (local savings & local market features) 저비용 장소로의 사업이전에 따른 혜택 및 지역시장특징과 관련해 중국측에서 지역특성이점(local specific advantages)의 공헌도를 반영하는 지침이 제공되어야 함을 강조하고, 의미의 명확화를 위해 보다 많은 예제를 개정안에 추가하기로 합의

- (assembled workforce) 집약된 노동력과 관련해 개인적인 노하우(personal know-how)가 무형자산인지 여부에 대해 논의가 있었으며 사무국에서 재개정하기로 합의

- (group synergies) 그룹시너지와 관련해서는 미국측에서 관련 예제의 명확화를 요구하고 사무국에서 재개정하기로 합의하였으며, 금융거래와 관련된 예제를 다른 액션플랜(financial transaction)으로 이동시키자는 미국측의 주장에 대해서는 회원국들의 반대가 많았음

(2) hard to value intangibles와 cost contribution arrangement(원가분담약정)관련 논의

□ BEPS 액션플랜과의 관계
ㅇ 액션플랜 8(무형자산 TP결과와 가치증식의 연계)의 2차 맨데이트인 무형자산의 가치를 측정하기 어려운 경우(Hard to value intangilbles)에 대한 이전가격 규정을 개발하는 과제와 원가분담약정(CCA)에 대한 지침을 업데이트하는 과제를 6작업반에서2015년 9월까지 완수할 계획


□ 주요 논의 내용
ㅇ 포괄적 접근방식 vs 특정 접근방식에 대해 논의
- hard to value intangibles를 다른 무형자산의 이슈들과 별도로 논의하는 특정(specific) 접근방식에 대해 토론
- 대다수의 회원국들은 동 이슈를 액션플랜 8의 1차 맨데이트와 관련된 이전가격가이드라인 제6장의 전반적 개정 및 액션플랜 9․10과 관련된위험(risk) 및 재구성(recharacterization)의 문제와 분리해서 논의하는 것은 매우 어렵다는 입장 표명

ㅇ 무형자산에 대한 논의를 어디서부터 시작할지에 대해 논의
- 무형자산과 관련된 모든 이슈들을 동시에 다루는 것은 매우 힘들다는 관점에서 우선 조세회피규정(anti avoidance rule)을 이전가격 맥락(context)에서 논의하는 것부터 시작하는 것으로 합의
- 무형자산과 관련된 조세회피규정으로 정상가격원리에 포섭되는 방법, 비정상가격원리 및 준정상가격원리에 해당하는 방법 등 모든 방법을 고려하기로 하였으나, 정상가격원리와 조세회피규정과의 관계에 대한 명확한 방향제시가 없어 실질적인 논의는 없었음

ㅇ hard to value intangibles와 위험 및 재구성의 관계 논의
- 무형자산과 위험 및 재구성간에 밀접한 관계가 있음을 회원국들이 공감하고, 우선 위험 및 재구성과 관련된 액션플랜방안을 논의하고 양자간의 관계에 대해 재논의하기로 하였으나, 무형자산 전반과 관련해 위험 및 재구성에 대해 개괄적인 논의만 있었고 양자간의 직접적인 관계에 대한 실질적인 논의는 없었음

ㅇ 원가분담약정*의 개정 방식 논의
- 무형자산과 밀접한 관련성을 가진 이전가격가이드라인의 제 8장 원가분담약정의 개정과 관련하여, EU와 같이 무형자산과 비무형자산으로 나누어 개정하되, 보다 복잡한 무형자산관련 원가분담약정에 논의를 집중하는 방식 합의
* (정의) 자산, 용역 혹은 권리의 개발․생산․취득에 있어 비용과 위험을 기업들간 분담키로 하고, 그러한 자산, 용역, 혹은 권리의 개발․생산․취득 활동 결과에 대한 각 참여자의 이익의 성격과 한도를 결정하는 약정

(3) 이전가격 문서화(Documentation) 관련 논의

□ BEPS 액션플랜과의 관계
ㅇ 이전가격 문서화 개정작업은 기존의 이전가격가이드라인 제 8장에 규정되어 있는 이전가격관련 문서화규정을 투명성 개선과 납세협력비용 축소에 초점을 두고 개정하도록 명시한 BEPS 액션플랜 13과 관련된 과제로 6작업반에서 2014년 9월까지 완수할 예정

□ 민간공청회(Public Consultation) 개최(12-13일)
ㅇ 이전가격 문서화와 관련해 보안문제, 민간의 부담(정보제공규모, 제공시기 등)을 줄이기 위한 유연성(flexibility) 필요, 소규모기업에 대해 safe harbor(이전가격조사면제규정)와 같은 threshold 도입, 이중과세 우려 등을 민간에서 제기
- 특히, 이번에 액션 13에서 명시적으로 요구한 국가별 보고(Country by Country Report)에 대해 많은 관심을 표명하며 상세 설명과 함께 점진적 변화를 요구

□ 주요 논의 내용
ㅇ 작업범위
- 이전가격문서화 규정인 이전가격가이드라인 제 5장의 개정과 액션플랜과의 관계에 대해, 상대적으로 짧은 액션플랜의 추진시한을 고려해 제 5장 개정작업을 중지하고 액션플랜에 집중하자는 견해와 제 5장의 큰 틀 내에서 Country by Country Report* 등 액션플랜 관련 이슈를 다루자는 의견이 대립
* 2단계 접근방법(two-tiered approach) : 이전가격 문서를 다국적기업 전체에 대한 Master file과 국내 계열기업에 대한 Local file로 나누어 작성하도록 하고 있는 방식 추진
․ Master File은 다국적기업 전반에 관한 정보를 담아, 다국적기업 본부차원에서 작성하여 국내법이나 조약 등을 통해 국가간 공유를 목적으로 하는 화일
․ Country by Country report는 다국적기업의 국가별 소득, 납부세액, 경제활동 등에 대한 자료를 담고 있는 파일로, 기본적으로 Master file에 포함되는 정보로 구상되어 있으나, 향후 별도의 파일로 보고될 지 여부는 추후 논의를 통해 결정할 예정

․ Local File은 개별 기업 소재지국에서 필요로 하는 구체적 정보로 구성되어 있는 파일로 각 현지개별기업별로 작성해 해당 소재지국 과세당국에 보고하고, 기본적으로 국가간 공유 목적은 아님

ㅇ 다른 액션플랜과의 조정(Coordination) 문제
- BEPS 및 해결책에 대한 데이터 입수․분석을 위한 방법확립(액션플랜 11, WP2소관)과 납세자의 강제적 자기신고제도(액션플랜 12, WP11소관)와의 보충적이고 중복적인 측면을 고려한 작업진행의 필요성 제기

ㅇ Master file 관련 논의
- (강제성) EU측에서 마스터파일의 보고에 강제성을 도입하는 방안과 중소기업에 대한 작성 면제방식을 제안한 것과 관련, OECD는 구속력을 가지는 규율을 만드는 기관이 아니고 다만 권고를 할 수 있는바 마스터파일은 모회사에게 적용하도록 권장하고 중소기업에 대해서는 예외를 인정하는 방안을 모색하겠다는 사무국의 답변이 있었음

- (목적) 위험평가(risk assessment), 납세자의 정상가격원리 부합여부 자기점검, 이전가격조사목적등 이전가격 문서화의 주된 목적을 사무국에서 설명하고, 미국측에서 위험평가와 조사목적 관련 Best Practices의 제공을 요구

- (간소화*) 마스터파일에 포함된 상호합의(MAP), 정상가격산출방법 사전승인제도(APA), 예규(rulings) 등에 대해 간소화 차원과 Chilling effect(민간의 MAP,APA 신청감소효과)를 고려해 삭제하자는 의견과 국내법과의 조화문제를 검토하기 위해 포함시켜야 한다는 견해가 대립
* 재정위원회 운영위원회에서 민간의 부담을 고려해 문서화작업을 최대한 간소화해 줄 것을 요구

- (보안) 마스터파일은 기본적으로 국가간 공유를 목적으로 하므로, 다국적기업의 불필요한 정보 및 보안사항까지 국가간 공유할 가능성 제기

- (다국적기업 내부의 금융활동) 마스터파일의 주요 내용중 하나로 포함되어 있는 MNE's intercompany financial activities에 대해, 민간부담과 마스터파일포함 불필요성 등을 이유로 local file로 이동할 것을 주장하는 견해와 전체적인 금융구조를 이해하는 측면에서 유용하다는 견해로 대립

ㅇ 국가별 보고(Country by Country Report) 관련 논의
- (작성방식) 작성기준으로 국가별(Country by Country) 작성방식과 기업체별(entity by entity) 작성방식을 놓고, 회원국간 논의 결과 대다수 회원국들은 기업체별 작성방식을 선호

- (그룹관련) 그룹의 범위와 관련해 지분기준과 소득기준중 많은 회사들을 보고대상에 포섭시키는 의미에서 지분기준을 회원국들이 선호하였으며, 파트너십과 고정사업장 까지 그룹의 범위에 포함시키는 것으로 사무국에서 설명

- (flexibility) 민간저항을 고려해 문서화작업에 유연성을 부여하는 문제와 관련, 어떻게 그리고 얼마만큼 유연성을 부여하는지를 결정하기 어려움을 확인하고 또한 유연성과 명확성(clarity)의 상충문제가 발생할 가능성이 제기됨

- (경제활동정보) 종업원수, 인건비, 현금이외의 유형자산, 로얄티, 이자, 서비스사용료 Animations) 분할 - Unity 매뉴얼 등의 경제활동정보를 마스터파일이나 로컬파일로 이동해야 한다는 견해가 제기되었으나, 로컬파일로 이동시 다른 나라에서 볼 수 없는 문제점이 제기

- (기타) 그밖에 그룹의 기능(function), 실효세율, footnote 등을 추가하자는 견해 제기

ㅇ 이행문제(implementation issue) 논의
- (국가간 공유문제) 실제로 다국적기업에서 작성된 정보가 어떻게 국가간에 공유될 수 있는 지가 문서화작업의 가장 중요한 쟁점으로 기본적으로 마스터파일과 국가별보고자료는 국가간 공유를 실시하고 로컬파일은 해당지역 과세당국에게만 보고하는 것으로 회원국들간 공감대 형성

- (사무국 제안) 우선적으로 국내법 개정을 통해 마스터파일과 국가별 보고자료는 모회사가 작성해 거주지국에 보고하고, 이를 자회사가 공유하게 한 뒤, 자회사는 해당 과세당국에 보고하는 방안과 국내법 개정이 어려운 경우 보충적으로 조세조약을 통해 정보를 교환하는 방식 제안*
* 다음번 개정안에 모델 국내법 권고안을 사무국에서 제시할 예정

(4) 위험(risk), 재구성(recharacterization), 정상가격방법 관련 논의

□ BEPS 액션플랜과의 관계
ㅇ 위험과 재구성 및 정상가격방법과 관련된 BEPS 이전가격이슈는 액션플랜 9(위험 및 자본의 이전가격결정 결과와 가치증식의 연계)와 액션플랜 10(고위험 거래의 이전가격결정 결과와 가치증식의 연계)과 관련된 문제로 2015년 9월까지 6작업반에서 마무리할 예정

□ 주요 논의 내용
ㅇ 위험부담(Risk taking)의 할당문제
- 다국적기업의 그룹간 위험부담양상은 대체적으로 저세율국(low tax rate jurisdiction)에 위치한 하나의 기업에 위험이 많이 할당되고 이에 따라 당해기업에 많은 소득이 배정되어 결과적으로 BEPS 문제를 야기

ㅇ 위험과 재구성과의 관계
- 다국적기업이 설정한 그룹내 기업간 위험의 할당(Allocation)을 과세당국이 인정하지 않고 재설정하는 경우를 정상가격원리의 차이조정으로 보아야 하는지 아니면 재구성(recharacterization)으로 보아야 하는지에 대해 견해 대립

ㅇ 재구성과 정상가격결정의 적용순서
- EU측에서 가격결정을 먼저 적용한 뒤 가격결정이 어려운 경우 재구성을 고려해야 한다는 의견을 제시한 데 대해, 다수 회원국들은 재구성을 먼저 적용하고 재구성에 해당되지 않는 경우 정상가격원리를 적용해야 한다는 입장 표명

ㅇ 정상가격원리 vs beyond 정상가격원리
- 위험 및 재구성과 관련해서 전통적인 정상가격원리를 적용하기 어려운 점을 감안해 정상가격원리를 고수해야 할지 아니면 국내조세회피규정과 같은 특별규정을 적용해야 할지에 대해 논의가 있었으며, 이에 대해 사무국에서는 특별규정도 조약의 규정을 준수하고 이중과세를 초래해서는 안된다는 점을 강조


ㅇ 이익분할방법(Profit Split Method)
- 비교대상을 찾기 어렵고 다국적기업의 그룹내 활동이 연관성이 매우 높은 경우(highly integrated situation)에 유용하게 적용할 수 있는 이익분할방법과 관련해 보다 상세한 지침이 제시될 것을 다수 회원국에서 요구
* (이익분할방법) 특수관계회사들간의 특수관계거래로부터 발생하는 결합이익을 식별하고 그 이익을 독립기업원칙하의 계약에서 이익을 분할하는 타당한 경제적 방법을 바탕으로 하여 특수관계회사가 당사자간에 분할하는 거래이익방법으로, 특히 무형자산, 위험 등과 관련해 매우 유용한 정상가격결정방법

ㅇ 자본화(Capitalization) 관련 논의
- 6작업반에서 정상가격원리를 이용해 다루어야 한다는 견해와 액션플랜 4(이자 공제 및 기타 금융 지급금을 통한 세원잠식 통제)와 관련된 11작업반(공격적조세회피작업반)에서 정상가격원리를 벗어난 특별규정의 도입을 통해 처리해야 한다는 견해로 대립

- 특히, 자본화중에서 Overcapitalization에 대한 규제에 대해 다소 과도하다는 견해와 규제가 필요하다는 입장이 대립하였으며, 보다 명확한 이해를 위해 어떤 경우에 자본화를 통해 BEPS문제를 야기하는지에 대해 예제가 필요하다는 의견 제시

ㅇ 주요 이슈들의 상호관계 논의
- 정상가격결정과정에서 위험, 재구성, 무형자산, 조세회피규정 등 현재 6작업반에서 논의되고 있는 주요 이슈들의 상호관계에 대해 뉴질랜드측에서 논리적인 도표를 제시

- 재구성과 관련해서, 재구성을 정상가격결정을 위한 기능,위험, 자산분석과정의 일부로 보는 견해와 재구성을 가격결정과는 별도로 고려해야 한다는 견해 등 재구성과 관련해 다양한 의견*이 제시
* (영국) 재구성을 경제적 실질(economic substance)이 다른 경우로 국한하고, 기능․위험․자산분석을 통한 조건의 변경은 재구성으로 보지 않는 견해
(남아공) 기능․위험․자산분석과 경제적 실질분석은 분리가 어렵다는 견해

(미국) 가격결정 전에 거래를 확인하고 거래의 실질을 결정하자는 견해로, 납세자가 제시한 사업구조를 인정하면 정상가격분석을 실시하고, 그렇지 않으면 다른 거래로 인식하고 조세회피규정 등 다른 방법 적용

- 이전가격가이드라인의 재구성 규정을 크게 부분적 재구성(TPG 1.46(위험배분약정), 1.53(계약조건))과 전반적 재구성(TPG 1.65*)로 나누고 전자에 대해서는 재구성이 아닌 정상가격분석의 일부로 보고 후자에 대해서는 별도의 규정을 추후에 마련해야 한다는 쪽으로 대체적으로 의견이 수렴
* (주요 내용) 과세당국이 예외적으로 납세자가 채택한 특수관계거래의 구조를 무시하는 것이 적절하고 타당한 두가지 경우 제시
․ 계약의 경제적 실질이 형식과 다른 경우
․ 거래의 형태와 경제적 실질이 일치한다 하더라도 그 거래와 관련된 제반사항을 종합적으로 고려할 때 거래에 대한 약정이 합리적으로 행동하는 독립기업이 선택하였을 약정과 다르고 실제구조가 과세당국이 적정한 이전가격을 책정하는 것을 방해하는 경우

- 내년초까지 예제를 포함한 Draft안을 사무국에서 만들어 회원국들의 의견을 수렴할 계획

(5) 고위험 세원잠식 지불(High risk base-eroding payment) 관련 논의

□ BEPS 액션플랜과의 관계
ㅇ 고위험 세원잠식 지불문제와 관련된 BEPS 이전가격이슈는 액션플랜 10(고위험 거래의 TP 결과와 가치증식의 연계)과 관련된 문제로 2015년 9월까지 6작업반에서 마무리할 예정

ㅇ 동 주제는 개발도상국의 의견개입(input)이 매우 중요한 관계로 설문조사를 우선적으로 실시하고, 이를 바탕으로 작업을 진행할 예정

□ 주요 논의 내용
ㅇ 저부가가치용역서비스(low value added services)
- 이전가격 간소화 프로젝트의 하나로 주사무소비용(head office expense)이라고도 불리는 저부가가치용역서비스 관련 규정을 이전가격가이드라인에 추가하는 작업(제 7장 개정)이 2011년이래 진행중
- 사무국에서는 동 작업을 BEPS 액션플랜 10의 일부분으로 진행시킬 것을 제안하였으며, 저부가가치용역서비스의 정의를 설정하고 간단한 계산하는 방법 등을 강조

ㅇ 관리비용(management fee)
- 관리비용의 정의와 관련, 모회사 거주지국에 해당되는 경우가 많은 나라의 경우 관리비용의 정의를 넓혀야 한다는 주장을 하고, 자회사 거주지국에 해당되는 경우가 많은 나라의 경우 관리비용의 정의를 좁혀야 한다는 견해를 개진, 사무국에서 정의를 구체화하겠다고 제안

(6) 국경간 금융거래(Cross-border Financial transactions)

□ BEPS 액션플랜과의 관계
ㅇ 국경간 금융거래와 관련된 BEPS 이전가격이슈는 액션플랜 4(이자 공제 및 기타 금융 지급금을 통한 세원잠식 통제) 및 액션플랜 9(위험 및 자본의 TP 결과와 가치증식의 연계)와 관련된 문제로 2015년 12월까지 6작업반에서 마무리할 예정

ㅇ 동 작업은 액션플랜 4의 이자비용공제 부분(현재 WP11에서 포커스그룹을 통해 심층 논의중)을 제외한 나머지 금융거래에 대해 이전가격측면에서 세원잠식문제의 해결을 모색

□ 주요 논의 내용
ㅇ 유연성(flexibility) vs 정상가격원리
- 국경간 금융거래의 이전가격이슈를 처리하기 위한 방법론에 대한 논의로 AOA*(Authorized OECD Approach) 활용 등 접근방법을 넓히자는 견해와 독립기업가정(separate entity)에 기초한 정상가격원리의 틀안에서 금융거래를 처리하자는 견해로 대립

ㅇ 작업수행 시점에 대한 논의
- 국경간 금융거래관련 BEPS이슈는 11작업반의 작업(액션플랜 4)과 밀접히 관련되어 있어 6작업반의 동 과제에 대한 작업수행시점을 11작업반의 논의를 지켜보고 난 뒤 하자는 견해와 지금 바로 논의를 시작하자는 견해로 대립

ㅇ 과다자본화(Overcapitalization)
- 적정한 자본규모가 무엇인지를 이전가격측면에서 규정*하는 것이 바람직한지에 대해 회원국간 의견차 확인
* BEPS 액션플랜 9에 ‘과도한 자본(excessive capital)의 그룹멤버간 배정에 의한 이익이전 방지’라는 내용이 명시
- BEPS 액션플랜을 고려해 우선 과다자본관련 문제를 확인하고 해결방안을 찾자는 견해, 위험과 자본을 함께 논의하자는 견해 등이 제시

(7) 향후 추진 계획

ㅇ 이전가격관련 BEPS 이슈들에 대한 6작업반의 대응전략을 담은 보고서를 금년도 연말까지 사무국에서 마련하고, 이를 회원국들에게 회람시켜 회원국들의 의견을 들은 뒤, 14년 3월 회의에서 보고서안에 대해 논의*하고 동년 5월 회의에서 마무리할 예정
* 이전가격문서화(documentation), 세원잠식 지불(base erosion payment), financial transaction(금융거래), 위험 및 재구성(risk and recharacterization), 무형자산(intangibles) 등

ㅇ 원가분담약정(Cost Contribution Arrangement)에 대한 작업은 내년 5월까지 논의를 진행시키지 않기로 합의하고, 또한 내년 3월 6작업반 회의 전에 보고서안을 민간에 공개해 민간의견을 수렴할 예정

주오이시디 대한민국 대표부 주소 : Délégation Permanente de la Corée auprès de l’OCDE - 4, place de la Porte de Passy 75016 Paris, France 전화번호 : (33-1) 4405-2050 | 휴일 또는 근무시간 이후 (33-1)-4405-2892 | 업무시간 : 월~금 (09:00~12:30, 14:30~18:00)

애니메이션(Animations) 분할

애니메이션화된 캐릭터에는 일반적으로 게임에서 다른 상황에 활성화되는 여러 다른 동작이 존재합니다. 이러한 움직임을 Animation Clips이라 부릅니다. 예를 들어 걷기, 달리기, 뛰기, 던지기, 또는 죽어가는 상황 등에 별도의 애니메이션 클립이 사용될 수 있습니다. 모델이 애니메이션화되는 방법에 따라 개별 움직임은 구분된 애니메이션 클립으로 임포트하거나 각 움직임이 그 이전 움직임에 단순히 이어지는 하나의 클립으로 임포트할 수도 있습니다. 하나의 클립만 있는 경우 클립은 반드시 Unity 내에서 컴포넌트 애니메이션 클립으로 분할되어야 하며 이로 인해 워크플로에 몇 가지 단계가 추가됩니다.

사전 분할된 애니메이션이 포함된 모델 사용

작업하기 가장 간단한 모델 타입은 사전 분할된 애니메이션이 포함된 모델입니다. 이러한 애니메이션이 있을 경우 Animation Importer InspectorAnimations 탭은 다음과 같습니다.

사용 가능한 클립의 리스트는 Preview Window(인스펙터의 하단)에 있으며 재생을 눌러 미리 볼 수 있습니다. 클립의 프레임 범위는 필요한 경우 수정할 수 있습니다.

분할되지 않은 애니메이션이 포함된 모델 사용

클립이 하나의 연속 애니메이션으로 제공되는 모델의 경우 Animation Importer InspectorAnimation 탭은 다음과 같습니다.

이러한 경우에는 프레임 범위를 개별 애니메이션 시퀀스 각각에 대응되도록 정의할 수 있습니다(걷기, 뛰기 등). 새 애니메이션 클립을 생성하려면 (+)를 누르고 포함될 프레임의 범위를 선택하면 됩니다.

임포트 설정에 있는 Split Animations 표는 에셋 파일의 어떤 프레임이 어떤 애니메이션 클립을 구성하는지를 Unity에 알려주는 역할을 합니다. 여기에서 지정한 이름은 게임에서 해당 클립을 활성화하는 데 사용됩니다.

애니메이션 인스펙터에 대한 자세한 내용은 애니메이션 클립 컴포넌트 레퍼런스 페이지를 참조하십시오.

Unity에서 메카님을 사용하여 오브젝트 및 프로퍼티 애니메이션 만들기

Unity의 애니메이션 창을 사용하여 오브젝트 또는 컴포넌트 프로퍼티를 애니메이션화하는 애니메이션 클립을 생성할 수 있습니다. 애니메이션 클립은 외부 애니메이션 클립(예: 캐릭터 애니메이션)과 완전히 동일한 방식으로 상태 머신에 정렬됩니다. 예를 들어, 카메라의 움직임, 광원의 컬러, 스프라이트 애니메이션의 개별 프레임, 스크립트의 공용 프로퍼티 등을 애니메이션화할 수 있습니다.

애니메이션을 위한 캐릭터 또는 기타 게임 오브젝트를 설정하기 위해서는 다음 과정을 따라야 합니다.

  • New Animator Controller 를 생성합니다.
  • Animator Window 를 열어 애니메이터 컨트롤러를 편집합니다.
  • 원하는 애니메이션 클립을 Animator Controller Window 으로 드래그합니다.
  • 계층 구조에 모델 에셋을 드래그합니다.
  • 에셋의 Animator 컴포넌트 에 애니메이터 컨트롤러를 추가합니다.

여러 모델 파일을 사용하여 애니메이션 임포트

애니메이션을 임포트하는 또 다른 방법은 Unity가 애니메이션 파일에 사용하는 네이밍 체계를 따르는 방법입니다. 별도의 모델 파일을 생성하고 ‘[email protected]’ 컨벤션에 따라 이름을 지정합니다. 예를 들어 “goober”라는 모델의 경우 “[email protected]”, “[email protected]”, “[email protected]”, “[email protected]”라고 명명한 파일을 사용하여 대기, 걷기, 점프, 벽 점프 애니메이션을 분리하여 임포트할 수 있습니다. 설령 원본 파일이 메시 데이터와 함께 익스포트되어도 파일의 애니메이션 데이터만 사용됩니다.

하나의 애니메이션화된 캐릭터를 위한 애니메이션 파일 네 개의 예제(.fbx 접미사는 Unity에서 표시되지 않습니다.)

하나의 애니메이션화된 캐릭터를 위한 애니메이션 파일 네 개의 예제(.fbx 접미사는 Unity에서 표시되지 않습니다.)

Unity는 자동으로 파일 네 개를 모두 임포트하며 모든 애니메이션을 @ 마크가 없는 파일에 모읍니다. 위 예제에서는 goober.mb 파일이 대기, 점프, 걷기, wallJump를 자동으로 참조하도록 설정됩니다.

FBX 파일의 경우 단순히 각 클립에 대해 원하는 키프레임을 익스포트하여 애니메이션을 체크하지 않은 모델 파일(예: goober.fbx) 및 네 개의 클립을 [email protected]_animname_.fbx로 익스포트 해야 합니다(FBX 다이얼로그에서 애니메이션을 활성화함).

경계 값 분석 및 등가 분할이란 무엇입니까?

이 방법에서 입력 도메인 데이터는 서로 다른 등가 데이터 클래스로 나뉩니다. 이 방법은 일반적으로 사용됩니다. 총 테스트 케이스 수를 줄이려면 최대 요구 사항을 충족하는 유한 한 테스트 가능한 테스트 케이스 세트로.

경계 값 분석 및 등가 분할이란?

요컨대, 가능한 모든 테스트 케이스를 가져 와서 클래스에 배치하는 프로세스입니다. 테스트하는 동안 각 클래스에서 하나의 테스트 값이 선택됩니다.

예를 들어 1부터 1000까지의 숫자를 허용하는 입력 상자에 대해 테스트하는 경우 모든 1000 개의 유효한 입력 번호에 대해 1000 개의 테스트 케이스를 작성하고 유효하지 않은 데이터에 대한 다른 테스트 케이스를 작성하는 데 쓸모가 없습니다.

위의 Equivalence Partitioning 방법을 사용하면 테스트 케이스를 클래스라고하는 세 가지 입력 데이터 세트로 나눌 수 있습니다. 각 테스트 케이스는 각 클래스를 나타냅니다.

따라서 위의 예에서 테스트 케이스를 유효하고 유효하지 않은 입력의 세 가지 등가 클래스로 나눌 수 있습니다.

등가 분할을 사용하여 1에서 1000 사이의 숫자를 허용하는 입력 상자에 대한 테스트 케이스 :

#1) 모든 유효한 입력이있는 하나의 입력 데이터 클래스입니다. 유효한 테스트 케이스로 1에서 1000 사이의 단일 값을 선택하십시오. 1에서 1000 사이의 다른 값을 선택하면 결과가 동일합니다. 따라서 유효한 입력 데이터에 대한 하나의 테스트 케이스로 충분합니다.

#두) 모든 값이 하한 미만인 입력 데이터 클래스입니다. 즉 1 미만의 값은 유효하지 않은 입력 데이터 테스트 케이스입니다.

#삼) 세 번째 잘못된 입력 클래스를 나타 내기 위해 1000보다 큰 값을 가진 입력 데이터입니다.

따라서 Equivalence Partitioning을 사용하여 가능한 모든 테스트 사례를 세 가지 클래스로 분류했습니다. 모든 클래스의 다른 값이있는 테스트 케이스는 동일한 결과를 제공해야합니다.

우리는 테스트 케이스를 설계하기 위해 모든 입력 클래스에서 한 명의 대표자를 선택했습니다. 테스트 케이스 값은 등가 클래스의 속성을 가장 많이 실행할 수있는 방식으로 선택됩니다.

Equivalence Partitioning은 최대 요구 사항을 충족하기 위해 가장 적은 테스트 케이스를 사용합니다.

경계 값 분석

입력 도메인의 끝 부분에있는 입력 값은 시스템에서 더 많은 오류를 유발한다는 사실은 널리 알려져 있습니다. 더 많은 응용 경계에서 오류가 발생합니다. 입력 도메인의. '경계 값 분석'테스트 기법은 입력 영역의 중앙에 존재하는 오류를 찾는 대신 경계에서 오류를 식별하는 데 사용됩니다.

경계 값 분석은 동등성 클래스의 가장자리에서 테스트 케이스가 선택되는 테스트 케이스를 설계하기위한 동등성 분할의 다음 부분입니다.

경계 값 분석을 사용하여 1에서 1000 사이의 숫자를 허용하는 입력 상자에 대한 테스트 케이스 :

#1) 입력 도메인의 입력 경계, 즉 우리의 경우 값 1과 1000과 정확히 일치하는 테스트 데이터가있는 테스트 케이스.

#두) 입력 도메인의 극단 가장자리 바로 아래 값 (예 : 값 0 및 999)으로 데이터를 테스트합니다.

#삼) 입력 도메인의 극단 가장자리 바로 위에있는 값 (예 : 값 2 및 1001)으로 데이터를 테스트합니다.

경계 값 분석은 종종 스트레스 및 음성 테스트의 일부로 불립니다.

노트 : 입력 도메인에 대해 생성 한 각 동등성 클래스에서 하나의 값만 테스트하는 엄격하고 빠른 규칙은 없습니다. 필요와 이전 판단에 따라 각 동등성 클래스에서 여러 개의 유효하고 유효하지 않은 값을 선택할 수 있습니다.

예를 들어 1에서 1000 개의 입력 값을 유효하지 않은 데이터 동등성 클래스로 나눈 경우 1, 11, 100, 950 등과 같은 테스트 케이스 값을 선택할 수 있습니다. 유효하지 않은 데이터 클래스가있는 다른 테스트 케이스에 대해서도 동일한 케이스입니다.

프로젝트가 확장될 때 코드 설계 방법

이 페이지의 내용: 성장하는 프로젝트의 코드를 설계하여 문제를 줄이고 깔끔하게 확장하는 데 효과적인 전략을 소개합니다. 프로젝트가 성장함에 따라 반복해서 설계를 수정하고 정리해야 합니다. 변경 중인 사항에서 한 걸음 물러나서, 작은 요소로 나누어 정리하고, 다시 통합하는 것이 좋습니다.

이 문서는 스웨덴 소재의 게임 스튜디오 Fall Damage의 CTO인 미카엘 칼름스(Mikael Kalms)가 작성했습니다. 미카엘은 20년 넘게 게임 개발 및 출시 관련 일을 해왔습니다. 긴 시간이 흘렀지만, 미카엘은 여전히 프로젝트가 안전하고 효율적인 방식으로 성장할 수 있도록 코드를 설계하는 방법에 관심이 많습니다.

프로젝트가 확장될 때 코드 설계 방법

유나이트 베를린 강연을 위해 팀에서 제작한 아주 기본적인 Pong 스타일의 게임 코드 예제를 살펴보겠습니다. 위의 이미지에서 볼 수 있듯이, 상하좌우에 두 개의 패들(paddle)과 네 개의 벽, 게임 로직과 점수 UI가 있습니다. 패들뿐만 아니라 벽에도 간단한 스크립트가 적용되었습니다.Animations) 분할 - Unity 매뉴얼

이 예제는 다음과 같은 몇 가지 핵심 원칙에 기반을 두고 있습니다.

  • 하나의 “항목“ = 하나의 프리팹
  • 하나의 “항목“에 대한 커스텀 로직 = 하나의 MonoBehavior
  • 애플리케이션 = 상호 연결된 프리팹을 포함하는 씬

이러한 원칙은 이와 같이 매우 단순한 프로젝트에 효과적이지만, 이를 확장하려면 구조를 변경해야 합니다. 그렇다면 코드를 구성하는 데 사용할 수 있는 전략에는 무엇이 있을까요?

프로젝트가 확장될 때 코드 설계 방법_컴포넌트 파라미터

먼저 인스턴스, 프리팹 및 스크립터블 오브젝트의 차이점에 대해 혼동되는 부분을 정리하겠습니다. 위의 이미지는 인스펙터에서 확인한 플레이어 1의 패들 게임 오브젝트에 있는 패들 컴포넌트입니다.

여기에 세 가지 파라미터가 있음을 알 수 있습니다. 그러나, 이 화면에서는 확인하고자 하는 기반 코드가 표시되지 않습니다.

인스턴스의 왼쪽 패들에서 입력축을 변경하는 것이 의미가 있을까요? 아니면 이 작업을 프리팹에서 수행해야 할까요? 입력축은 플레이어마다 다르므로, 아마도 인스턴스에서 변경해야 할 것입니다. 그렇다면 Movement Speed Scale은 어떨까요? 인스턴스와 프리팹 중 어디에서 변경해야 할까요?

패들 컴포넌트를 나타내는 코드를 살펴보겠습니다.

프로젝트가 확장될 때 코드 설계 방법_코드의 파라미터

조금만 주의 깊게 생각한다면, 프로그램에서 여러 파라미터가 서로 다른 방식으로 사용되고 있음을 알 수 있습니다. 각 플레이어에 대해 InputAxisName을 개별적으로 변경해야 합니다. MovementSpeedScaleFactor와 PositionScale은 두 플레이어가 공유해야 합니다. 다음은 언제 인스턴스, 프리팹 및 스크립터블 오브젝트를 사용해야 하는지 안내하는 전략입니다.

  • 한 번만 필요한 것이라면 프리팹을 생성한 다음 인스턴스화하세요.
  • 여러 번 필요하며 인스턴스와 관련하여 몇 가지 수정이 필요하다면 프리팹을 생성하고 인스턴스화한 다음 일부 설정을 오버라이드하면 됩니다.
  • 여러 인스턴스를 동일하게 설정해야 한다면 프리팹 대신 스크립터블 오브젝트와 소스 데이터를 생성하세요.

다음 코드 예제에서 패들 컴포넌트에 스크립터블 오브젝트를 사용하는 방법을 살펴볼 수 있습니다.

프로젝트가 확장될 때 코드 설계 방법_스크립터블 오브젝트 사용

이러한 설정을 PaddleData 유형의 스크립터블 오브젝트로 옮겼기 때문에, 패들 컴포넌트에는 해당 PaddleData에 대한 레퍼런스만 있습니다. 인스펙터에는 PaddleData와 두 개의 Paddle 인스턴스가 있습니다. 계속해서 개별적인 패들이 각기 가리키고 있는 공유 설정의 패킷과 축 이름을 변경할 수 있습니다. 새로운 구조를 통해 서로 다른 설정 이면에 있는 의도를 더 쉽게 확인할 수 있습니다.

프로젝트가 확장될 때 코드 설계 방법_단일 책임 원칙

만일 실제 개발하는 게임이라면, 개별 MonoBehavior가 점점 더 커질 것입니다. 각 클래스가 하나의 것을 처리해야 한다고 규정하는 단일 책임 원칙(Single Responsibility Principle)에 따르면서 MonoBehavior를 분리하는 방법을 살펴보겠습니다. 원칙을 올바르게 적용했다면 “무엇을 하지 않습니까?“뿐만 아니라 “특정 클래스는 무엇을 합니까?“라는 질문에 대해 간단한 답변을 할 수 있어야 합니다. 이렇게 하면 팀의 모든 개발자가 개별 클래스가 하는 일을 쉽게 이해할 수 있습니다. 이 원칙은 모든 규모의 코드 기반에 적용할 수 있습니다. 위의 이미지에서 간단한 예제를 살펴보겠습니다.

위 예제는 공에 대한 코드입니다. 잘 보이지는 않지만 자세히 살펴보면 공에는 속도 값을 갖는다는 것을 알 수 있습니다. 이를 통해 디자이너는 공의 초기 속도 벡터를 설정할 수 있고, 직접 만든 물리 시뮬레이션은 현재 공의 속도를 지속해서 트래킹할 수 있습니다.

여기에서는 동일한 변수를 약간 다른 두 가지 용도로 재사용하고 있습니다. 공이 움직이기 시작하면, 초기 속도에 대한 정보가 손실됩니다.

직접 만든 물리 시뮬레이션은 단순히 FixedUpdate()의 동작이 아닙니다. 여기에는 공이 벽에 부딪칠 때의 반응도 포함됩니다.

OnTriggerEnter() 콜백 내부에는 Destroy() 연산이 있습니다. 즉, 트리거 로직이 자체 게임 오브젝트를 삭제하는 곳입니다. 규모가 큰 코드 기반에서 엔티티가 스스로 삭제할 수 있도록 허용하는 경우는 매우 드뭅니다. 대신에 소유주가 자신의 소유 항목을 삭제합니다.

여기에서는 더 작은 부분으로 나눌 수 있습니다. 이러한 클래스에는 게임 로직, 입력 처리, 물리 시뮬레이션, 프레젠테이션 등 다양한 종류의 작업이 있습니다.

다음은 작게 나누는 방법입니다.

  • 일반적인 게임 로직, 입력 처리, 물리 시뮬레이션 Animations) 분할 - Unity 매뉴얼 및 프레젠테이션은 MonoBehavior, 스크립터블 오브젝트 또는 원시적인 C# 클래스 내에 있을 수 있습니다.
  • 인스펙터에서 파라미터를 표시하려면, MonoBehavior 또는 스크립터블 오브젝트를 사용할 수 있습니다.
  • 엔진 이벤트 핸들러와 게임 오브젝트의 수명주기 관리는 MonoBehavior 내에 있어야 합니다.

대부분의 게임의 경우 MonoBehavior에 최대한 코드를 많이 확보하는 것이 좋을 것입니다. 스크립터블 오브젝트를 사용하는 것이 이를 위한 한 가지 방법이 될 수 있으며, 이 방법을 위한 몇 가지 우수한 리소스가 이미 나와 있습니다.

프로젝트가 확장될 때 코드 설계 방법_MonoBehavior를 C# 클래스로 이동

또 다른 방법으로 코드를 MonoBehavior에서 일반적인 C# 클래스로 이동하는 방법과 그 이점이 무엇인지 살펴보겠습니다.

일반적인 C# 클래스는 코드를 작은 덩어리로 나누어 구성하는 데 Unity 자체 오브젝트보다 우수한 언어 체계를 갖추고 있습니다. 또한 일반적인 C# 코드는 Unity 외부의 .NET 코드 기반과 공유될 수 있습니다.

반면에 일반적인 C# 클래스를 사용하면, 에디터가 오브젝트를 이해하지 못하고 인스펙터에 네이티브 형식으로 표시할 수 없게 되는 등의 문제가 발생할 수 있습니다.

이 방법을 사용하면 작업 유형별로 로직을 나눌 수 있습니다. 다시 공의 예제를 살펴보면, BallSimulation이라고 하는 간단한 물리 시뮬레이션을 C# 클래스로 옮겼습니다. 이 시뮬레이션이 하는 일은 물리 통합과 공이 무언가를 칠 Animations) 분할 - Unity 매뉴얼 때마다 반응하는 것입니다.

하지만 공 시뮬레이션이 공이 실제로 무엇을 쳤는지에 따라 결정을 내린다는 점이 이해하기 어려울 수 있습니다. 이는 게임 로직에 더 가깝습니다. 결론적으로 공에는 어떤 면에서 시뮬레이션을 제어하는 로직이 있으며, 시뮬레이션 결과는 MonoBehavior로 피드백된다고 볼 수 있습니다.

위에서 재구성된 버전을 살펴보면 중요한 변화를 볼 수 있는데, Destroy() 연산이 많은 레이어에 더는 파묻혀 있지 않습니다. 이 시점에 MoneBehavior에는 단 몇 가지의 분명한 담당 영역이 있습니다.

이에 대해 할 수 있는 많은 일이 있습니다. FixedUpdate()에서 포지션 업데이트 로직을 살펴보면, 코드를 한 위치에서 보내면 거기에서 새로운 포지션을 반환해야 한다는 사실을 알 수 있습니다. 공 시뮬레이션은 실제로 공의 위치를 갖고 있지 않습니다. 즉, 제공된 공의 위치를 기반으로 시뮬레이션 틱을 실행한 다음 결과를 반환합니다.

프로젝트가 확장될 때 코드 설계 방법_인터페이스 사용

인터페이스를 사용하는 경우 MonoBehavior에 있는 공의 일부 중 필요한 부분(위 이미지 참조)만을 시뮬레이션과 공유할 수 있습니다.

코드를 다시 살펴보겠습니다. Ball 클래스는 간단한 인터페이스를 구현합니다. LocalPositionAdapter 클래스를 사용하면 Ball 오브젝트에 대한 레퍼런스를 다른 클래스로 넘길 수 있습니다. 이때 Ball 오브젝트 전체를 넘겨주지 않고, LocalPositionAdapter 부분만 전달합니다.

또한 BallLogic은 게임 오브젝트를 제거할 시점이 되면 Ball에 이를 알려야 합니다. 플래그를 반환하는 대신에 Ball은 BallLogic에 델리게이트를 제공할 수 있습니다. 이것이 재구성된 버전에서 마지막에 표시된 행이 하는 일입니다. 이 예시는 잘 정돈된 설계를 보여줍니다. 다양한 보일러 플레이트 로직이 있지만, 각 클래스는 세부적으로 정의된 목적을 가지고 있습니다.

이 원칙을 잘 사용하면 1인 프로젝트를 잘 구성할 수 있습니다.

프로젝트가 확장될 때 코드 설계 방법_소프트웨어 아키텍처

규모가 조금 더 큰 프로젝트를 위한 소프트웨어 아키텍처 솔루션을 살펴보겠습니다. 공 게임의 예제에서 BallLogic, BallSimulation 등의 더 구체적인 클래스를 코드에 추가하기 시작한다면, 계층을 생성할 수 있어야 합니다.

MonoBehaviour는 다른 모든 로직을 마무리하기 때문에 모든 것을 알 필요가 있지만, 게임의 시뮬레이션은 로직이 어떻게 작동하는지 반드시 알아야 할 필요는 없습니다. 시뮬레이션을 실행할 뿐입니다. 때때로 로직이 신호를 시뮬레이션에 제공하기 때문에 시뮬레이션이 적절하게 반응하는 것입니다.

입력을 별도의 독립적인 장소에서 처리하는 것이 좋습니다. 바로 이곳에서 입력 이벤트가 생성되며 로직에 이를 공급합니다. 그다음은 시뮬레이션에 달려 있습니다.

이 방법은 입력 및 시뮬레이션에 적합합니다. 하지만 프레젠테이션과 관련된 문제, 예를 들어 특수 효과를 생성하는 로직, 점수 집계 업데이트 등에 문제가 발생할 가능성이 있습니다.

프레젠테이션은 다른 시스템에서 어떤 일이 벌어지고 있는지 알 필요가 있지만, 해당 시스템에 모두 액세스할 필요는 없습니다. 가능하다면 로직과 프레젠테이션을 분리하세요. 로직만 가능한 모드와 로직 및 프레젠테이션이 모두 가능한 모드에서 코드 기반을 실행할 수 있는 위치를 확보해 보세요.

프레젠테이션이 적시에 업데이트되도록 로직과 프레젠테이션을 연결해야 할 때도 있습니다. 하지만 이 경우에도 올바르게 표시하는 데 필요한 것만 프레젠테이션에 제공해야 합니다. 이렇게 하면 두 부분 간에 자연스러운 경계가 생겨 제작하는 게임의 복잡도를 전체적으로 줄일 수 있습니다.

때로는 데이터로 수행할 수 있는 모든 로직 및 연산을 같은 클래스에 통합하지 않고, 해당 데이터만 포함하는 클래스를 갖는 것이 좋습니다.

또한 데이터는 소유하지 않지만 부여된 오브젝트를 조작하는 함수는 포함하는 클래스를 만드는 것이 좋습니다.

전역 변수를 건드리지 않는다고 가정했을 때 정적 메서드의 장점은 메서드를 호출할 때 인수로 전달되는 내용을 살펴봄으로써 해당 메서드가 잠재적으로 영향을 미치는 범위를 식별할 수 있다는 점입니다. 메서드의 구현을 살펴볼 필요가 전혀 없습니다.

이 접근법은 기능 프로그래밍 분야를 다룹니다. 여기서 핵심은 함수에 무언가를 보내면, 함수는 결과를 반환하거나 반환 파라미터 중 하나를 수정한다는 점입니다. 이 방법을 사용하면 전형적인 객체 지향 프로그래밍을 할 때보다 버그가 적게 발생할 수 있습니다.

오브젝트 사이에 접착 로직을 삽입하여 오브젝트를 분리할 수도 있습니다. Pong 스타일의 예제 게임을 다시 보면, 공 로직과 점수 프레젠테이션이 서로 어떻게 이야기할까요? 공과 관련하여 무언가가 발생하면 공 로직이 점수 프레젠테이션에 정보를 주는 것일까요? 점수 로직이 공 로직에 쿼리하는 것일까요? 이 둘은 어떻게든 서로 정보를 교환해야 합니다.

이를 위해 로직이 항목을 만들고 프레젠테이션이 해당 항목을 읽을 수 Animations) 분할 - Unity 매뉴얼 있는 스토리지 영역을 제공하는 것이 유일한 목적인 버퍼 오브젝트를 생성할 수 있습니다. 또는 로직 시스템이 대기열에 항목을 넣을 수 있고 프레젠테이션은 대기열에서 나오는 내용을 읽을 수 있도록 항목 간에 대기열을 만들 수 있습니다.

게임 규모가 커짐에 따라 로직과 프레젠테이션을 분리하는 경우, 메시지 버스를 사용하는 것도 좋은 방법입니다. 메시징의 핵심 원칙은 수신자도 발신자도 상대방에 대해 알지 못하지만 메시지 버스/시스템은 인식하고 있다는 것을 양 쪽이 모두 안다는 것입니다. 따라서 점수 프레젠테이션은 점수를 변경하는 모든 이벤트에 대해 메시징 시스템에서 정보를 받아야 합니다. 그러면 게임 로직은 플레이어의 포인트 변화를 나타내는 이벤트를 메시징 시스템에 게시합니다. 시스템들을 분리하고 싶다면, UnityEvents를 활용해서 시작하거나 직접 작성해볼 수도 있습니다. 시스템을 분리하면 별도의 목적으로 별도의 버스를 이용할 수 있게 됩니다.

LoadSceneMode.Single을 사용하지 말고 대신 LoadSceneMode.Additive를 사용하는 것이 좋습니다.

씬을 언로드할 때는 명시적 언로드를 사용해야 합니다. 결국에는 씬을 전환할 때 일부 오브젝트를 유지해야 하기 때문입니다.

DontDestroyOnLoad도 사용하지 않는 것이 좋습니다. 이를 사용하면 오브젝트의 수명을 제어할 수 없습니다. 실제로 LoadSceneMode.Additive를 사용해 로딩할 경우, DontDestroyOnLoad를 사용할 필요가 없습니다. 대신 오래 사용해야 하는 오브젝트를 오랜 기간 유지되는 특별 씬에 넣는 것이 더 좋습니다.

모든 게임에서 유용했던 팁을 추가하자면, 깔끔하고 제어된 종료를 지원하는 것입니다.

애플리케이션이 종료되기 전에 사실상 모든 리소스를 릴리스하도록 해야 합니다. 가능하다면 전역 변수를 지정하지 말고, 어떤 게임 오브젝트도 DontDestroyOnLoad로 표시해서는 안됩니다.

항목들을 종료하는 특정한 순서가 있을 때, 오류를 찾아내고 리소스 유출을 찾는 것이 더 쉽습니다. 이렇게 하면 플레이 모드를 종료할 때 양호한 상태로 Unity 에디터를 나갈 수 있습니다. Unity는 플레이 모드를 종료할 때 전체 도메인을 다시 로드하지 않습니다. 게임을 깔끔하게 종료한다면, 에디터에서 게임을 실행한 후에 해당 에디터나 모든 종류의 편집 모드 스크립팅에서 이상 동작이 나타날 가능성이 작아집니다.

Git, PerForce, Plastic과 같은 버전 관리 시스템을 사용하면 씬 파일 병합으로 인한 번거로움을 줄일 수 있습니다. 모든 에셋을 텍스트로 저장하고 오브젝트를 씬 파일에서 프리팹으로 이동시킵니다. 마지막으로 씬 파일을 여러 개의 작은 씬으로 나누면 됩니다. 단, 추가 툴이 필요할 수 있습니다.

예를 들어 10명이 넘는 사람들이 한 팀에서 일하게 된다면, 프로세스 자동화에 대한 작업을 해야 합니다.

창의적인 프로그래머라면 독창적이고 신중한 작업을 하고 가능한 반복적인 부분은 최대한 자동화하고 싶어합니다.

먼저 코드를 테스트하는 로직을 만들어보시기 바랍니다. 특히 MonoBehaviour에서 일반 클래스로 이동하는 경우, 로직 및 시뮬레이션 모두에 대한 단위 테스트를 작성하기 위해서 단위 테스트 프레임워크를 사용하는 방법이 간단합니다. 아무 곳에나 해당하는 것은 아니지만, 나중에 다른 프로그래머가 코드에 액세스할 수 있도록 합니다.

코드만 테스트가 필요한 것은 아닙니다. 콘텐츠도 테스트가 필요할 수 있습니다. 팀에 콘텐츠 크리에이터가 있는 경우, 제작하는 콘텐츠를 신속하게 검증할 수 있는 표준화된 방법을 갖추는 것이 좋습니다.

프리팹의 유효성 검사 또는 커스텀 에디터를 통해 입력한 데이터의 유효성 검사와 같은 테스트 로직은 콘텐츠 크리에이터가 쉽게 사용할 수 있어야 합니다. 에디터에서 버튼 클릭 한 번으로 신속하게 유효성 검사를 하는 것이 곧 시간을 절약하는 길입니다.

이 다음 단계는 Unity 테스트 러너를 설정해 정기적으로 자동 재검사를 하는 것입니다. 이때 Unity 테스트 러너를 빌드 시스템의 일부로 설정해 모든 테스트를 실행하도록 하세요. 알림을 설정해 문제가 실제로 발생하면 팀원들이 Slack 또는 이메일 알림을 받도록 하는 것이 가장 좋습니다.

자동 게임 플레이에는 AI가 게임을 플레이하고 오류를 기록하는 작업이 수반됩니다. 간단히 말해, AI가 더 많은 오류를 찾을수록 낭비되는 시간이 줄어듭니다.

Fall Damage의 경우, 약 10개의 게임 클라이언트를 같은 기기에 가장 낮은 세부 설정을 사용하여 모두 실행했습니다. 충돌을 확인한 후에 오류 기록을 보았습니다. 클라이언트 중 하나가 충돌할 때마다 버그를 찾기 위해 직접 게임을 하거나 QA팀을 배정하지 않아도 되므로 시간을 절약할 수 있었습니다. 즉, 다른 플레이어와 함께 직접 게임을 하면서 테스트하여 게임이 재미있는지, 시각적인 글리치(glitch)가 있는지 등에 집중할 수 있었습니다.


0 개 댓글

답장을 남겨주세요