AnyPortrait > 메뉴얼 > 스크립트로 초기화하기

스크립트로 초기화하기


1.1.7

유니티의 기본적인 함수인 "Instantiate"를 이용하여 프리팹의 오브젝트를 씬에 배치하거나, 씬의 오브젝트를 복제할 수 있습니다.
Instantiate는 유니티로 게임을 만들 때 가장 많이 사용되는 함수 중 하나일 것입니다.
AnyPortrait로 제작한 캐릭터를 Instantiate 함수로 복제할 때, 간혹 초기화에 대한 에러를 겪는 경우가 있습니다.
이 페이지는 간단한 코드 예제를 통해서 초기화에 대해서 설명합니다.
(초기화 함수에 관해서는 관련 페이지를 참고해주세요.)




씬에 배치된 AnyPortrait 캐릭터를 복제해봅시다.
이 샘플은 "Space Bar"를 입력하면 캐릭터가 복제되어서 약간 오른쪽에 배치되고 "Move" 애니메이션을 재생해보겠습니다.
이것으로 스크립트로 작성하면 다음과 같을 것입니다.



이 스크립트를 유니티 씬에 배치하고 게임을 실행해봅시다.




게임을 실행하고 Space Bar를 누르면 캐릭터가 복제가 되지만 에러가 발생합니다.
그리고 "Move" 애니메이션도 재생되지 않습니다.
이 에러는 유니티 씬에 처음으로 배치된 캐릭터가 초기화 과정을 거치지 않은 상태에서, 바로 Play 함수가 호출되었기 때문입니다.


AnyPortrait의 시스템은, 자동으로 캐릭터가 처음 로드되면 해당 업데이트 프레임에 바로 초기화를 수행합니다.
그렇지만 Instantiate 함수로 로드된 직후에 apPortrait의 어떤 함수를 호출한다면, 아직 초기화가 되지 않은 상태이므로 에러가 발생하며 그 함수는 정상적으로 동작하지 않습니다.


이 문제를 해결하는 방법은 다음의 두가지가 있습니다.
(1) 스크립트를 이용하여 초기화를 직접 실행합니다.
(2) 로드된 프레임에서는 apPortrait의 함수를 호출하지 않고, 다음 프레임까지 기다립니다.


이 페이지에서는 (1)의 방법에 대해서 설명합니다.


코드를 다음과 같이 수정해봅시다.
(불필요한 주석은 삭제했습니다.)



Play 함수를 실행하기 전에 apPortrait의 Initialize 함수를 호출하도록 작성했습니다.
Initialize 함수는 apPortrait를 초기화하여 업데이트를 할 수 있도록 준비시키는 역할을 합니다.


이제 게임을 실행해봅시다.




슬라임 캐릭터가 복제되어 에러 없이 Move 애니메이션이 재생이 됩니다.


초기화 함수는 Initialize 외에도 AsyncInitialize 함수도 있습니다.
이 함수들의 특징은 다음과 같습니다.


1. Initialize()
: 기본적인 초기화 함수입니다.
함수가 호출되는 시점에서 모든 초기화 처리가 이루어집니다.
함수가 호출될 때 초기화가 완료되므로 바로 apPortrait를 제어할 수 있는 장점이 있습니다.
캐릭터가 애니메이션이나 모디파이어를 많이 가지고 있다면 초기화 코드는 매우 무거우며, 일시적으로 FPS (Frames Per Second)가 저하될 수 있습니다.


2. AsyncInitialize(OnAsyncLinkCompleted onAsyncLinkCompleted)
: 비동기 초기화 함수입니다.
게임 중에 초기화가 될 때 FPS가 크게 떨어지는 것이 문제가 된다면, 이 함수는 좋은 선택이 될 것입니다.
함수가 호출되더라도 초기화는 약간의 업데이트가 진행된 이후에 완료됩니다.
이 함수가 호출된 직후에는 apPortrait를 바로 제어할 수 없습니다.
초기화가 완료될 때 인자로 입력된 이벤트를 호출합니다.


3. AsyncInitialize(int timePerYield, OnAsyncLinkCompleted onAsyncLinkCompleted)
: v1.1.7에서 추가된 함수입니다.
ms 단위의 timePerYield 인자가 추가되어 비동기 처리 단위의 제한 시간을 지정할 수 있습니다.
기존의 AsyncInitialize 함수에 비해서 처리 시간은 더 증가되지만, 게임의 FPS를 인식하여 최대한 성능에 영향을 주지 않도록 개선되었습니다.
동시에 많은 캐릭터를 로드할 때 좋습니다.


비동기 초기화를 이용하여 코드를 작성해봅시다.



비동기 초기화는 바로 완료되지 않으므로, 초기화 함수 호출 직후에 apPortrait를 제어할 수 없습니다.
이벤트를 이용하는 것을 권장합니다.