AnyPortrait > 스크립트 > 초기화, 기본 설정
apPortrait가 포함된 GameObject를 사용할 때 호출해야하는 함수들과 기본적으로 참고해야하는 함수들을 안내합니다.
첫 업데이트 직전에 자동으로 실행되는 초기화 함수입니다.
만약 프리팹(Prefab)을 실시간으로 로드하여 사용하는 경우, Initialize() 또는 AsyncInitialize() 함수를 꼭 호출해야합니다.
데이터가 많은 경우 실행 시간이 오래 걸리는 함수입니다. AsyncInitialize() 함수를 사용할 것을 권장합니다.
bool : 초기화 중이거나 이미 끝났다면 false를 리턴하며, 초기화가 성공적으로 처리되면 true를 리턴
Initialize()와 동일한 기능을 수행하는 초기화 함수입니다.
프리팹을 실시간으로 로드하여 사용되는 경우, Initialize() 또는 AsyncInitialize() 함수를 꼭 호출해야합니다.
코루틴을 이용하여 실행 시간 부하가 적도록 비동기로 처리를 합니다.
콜백 이벤트를 매개 변수로 입력하면, 종료 시에 호출됩니다.
ms 단위의 시간인 timePerYield를 인자로 넣으면 코루틴 처리 시간을 타이머로 계산하여 CPU에 더욱 부하가 적도록 동작합니다.
대신 이 경우에 초기화 시간이 다소 오래 걸릴 수 있습니다.
(timePerYield를 이용한 처리는 v1.1.7부터 적용됩니다.)
apPortrait.OnAsyncLinkCompleted onAsyncLinkCompleted : 초기화가 종료되면 호출되는 콜백 이벤트
int timePerYield : 비동기 처리시 yield가 호출되는 제한 시간(ms).
bool : 초기화 중이거나 이미 끝났다면 false를 리턴하며, 비동기 초기화가 시작되면 true를 리턴
루트 유닛이 출력되도록 합니다.
"자동으로 시작되는 애니메이션 클립"이 있는 루트 유닛이나 0번 인덱스의 루트 유닛을 대상으로 합니다.
다른 루트 유닛은 자동으로 숨겨집니다.
apOptRootUnit targetOptRootUnit : 출력하고자 하는 루트 유닛
모든 루트 유닛을 숨깁니다.
루트 유닛이 출력되도록 합니다.
"자동으로 시작되는 애니메이션 클립"이 있는 루트 유닛이나 0번 인덱스의 루트 유닛을 대상으로 합니다.
다른 루트 유닛은 자동으로 숨겨집니다.
ShowRootUnit()과 동일합니다.
모든 루트 유닛을 숨깁니다.
HideRootUnits()와 동일합니다.
Important 속성을 지정합니다.
Important 속성이 True라면 이 객체는 매 프레임마다 업데이트됩니다.
Important 속성이 False라면 에디터에서 지정된 FPS에 따라 업데이트를 합니다.
bool isImportant : Important 설정
Important 속성이 꺼진 경우, 캐릭터는 고정 FPS로 실행됩니다. (게임의 FPS에 따라 더 적은 FPS에서 실행될 수 있습니다.)
Bake 단계에서 설정했던 고정 FPS의 값을 스크립트로 변경할 수 있습니다.
int fps : 캐릭터의 애니메이션이 실행되는 고정 FPS. Important 속성이 꺼진 경우에만 유효합니다.
요청된 인덱스에 맞는 루트 유닛을 리턴합니다.
int rootUnitIndex : 루트 유닛 인덱스. 기본은 0
apOptRootUnit : 인덱스에 해당하는 루트 유닛. 없다면 null 리턴
현재 재생되는 루트 유닛을 리턴합니다.
apOptRootUnit : 현재 재생되는 루트 유닛. 없다면 null 리턴
현재 재생되는 루트 유닛의 인덱스를 리턴합니다.
int : 현재 재생되는 루트 유닛의 인덱스. 없다면 -1 리턴
만약 클리핑 마스크가 적용된 메시가 있다면, 렌더링을 위해 카메라 1개와 연동을 자동으로 합니다.
이 함수를 호출하면 현재 카메라와 연동된 정보를 없애고 초기화합니다.
다시 렌더링을 할 때, 자동으로 다시 연동을 시도합니다.
클리핑 마스크가 적용된 전체 또는 일부 메시들에 대해서 카메라와의 연동을 다시 실행합니다.
설정에 따라 카메라와 연동은 보류하고 렌더 텍스쳐(RenderTexture)만 다시 만들 수도 있습니다.
bool isOnlyActiveRootUnit : true를 입력하면 현재 실행 중인 루트 유닛에 한정해서 리셋을 하며, false라면 전체 루트 유닛을 대상으로 합니다.
apOptRootUnit targetOptRootUnit : 리셋을 하고자 하는 루트 유닛
bool isRegistToCamera : true라면 카메라와 연동을 다시 하며, false일 경우 렌더 텍스쳐(RenderTexure)만 다시 생성하고 다음 프레임을 기다립니다.
GameObject들을 렌더링하는 순서를 계산할 때 사용되는 Sorting Layer를 설정합니다.
동일한 레이어의 Game Object들을 묶어서 렌더링 순서를 계산합니다.
Sorting Layer는 유니티의 Project Settings > Tags and Layers로 설정할 수 있습니다.
설정되지 않은 이름을 입력한 경우 에러 메시지와 함께 처리가 실패됩니다.
만약, 특정 apOptTransform의 Sorting Layer만 변경하고자 하는 경우,
apOptTransform 객체를 직접 지정하거나 이름을 인자로 입력하면 됩니다.
string sortingLayerName : 설정하고자 하는 Sorting Layer의 이름
apOptTransform optTransform : 부분적으로 Sorting Layer를 변경하고자 하는 대상
string transformName : 부분적으로 Sorting Layer를 변경하고자 하는 optTransform의 이름
int rootUnitIndex : 부분적으로 Sorting Layer를 변경하고자 하는 optTransform이 속한 Root Unit의 인덱스
GameObject들을 렌더링하는 순서를 계산할 때 사용되는 Sorting Order를 설정합니다.
동일한 Sorting Layer에서 큰 값을 가진 GameObject가 앞에서 렌더링됩니다.
만약, 특정 apOptTransform의 Sorting Order만 변경하고자 하는 경우,
apOptTransform 객체를 직접 지정하거나 이름을 인자로 입력하면 됩니다.
int sortingOrder : 렌더링 순서. 큰 값일 수록 앞에서 렌더링됩니다.
apOptTransform optTransform : 부분적으로 Sorting Order를 변경하고자 하는 대상
string transformName : 부분적으로 Sorting Order를 변경하고자 하는 optTransform의 이름
int rootUnitIndex : 부분적으로 Sorting Order를 변경하고자 하는 optTransform이 속한 Root Unit의 인덱스
현재 적용된 Sorting Layer의 이름을 리턴합니다.
Sorting Layer의 이름은 Project Settings > Tags and Layers에 등록된 상태여야 합니다.
이 함수를 호출할 때마다 프로젝트의 설정을 조회하므로, 자주 호출하는 것을 권장하지 않습니다.
string : 적용된 Sorting Layer의 이름입니다. 프로젝트 설정과 맞지 않은 Sorting Layer 값을 가진다면 "Unknown Layer"를 리턴합니다.
현재 적용된 Sorting Order 값을 리턴합니다.
이 값이 클 수록 앞에서 렌더링됩니다.
int : 현재의 렌더링 정렬 순서입니다.
특정 apOptTransform에 대한 현재의 Sorting Order 값을 리턴합니다.
이 값이 클 수록 앞에서 렌더링됩니다.
apOptTransform optTransform : 조회하고자 하는 대상
int : 현재의 렌더링 정렬 순서입니다.
apPortrait의 Sorting Order Option이 "Depth To Order" 또는 "Reverse Depth To Order"인 경우에 사용되는 함수입니다.
Depth에 의해서 메시들의 Sorting Order 값이 자동으로 변경될지 여부를 결정합니다.
스크립트로 Sorting Order를 제어하고자 하는 경우 False를 입력해야 자동으로 Sorting Order가 변경되는 것을 막을 수 있습니다.
기본적으로 True입니다.
bool isEnabled : true인 경우 Sorting Order가 자동으로 변경됩니다.
씬에 존재하는 카메라들을 자동으로 인식하도록 설정하면서, 동시에 현재 카메라들을 확인하여 렌더링 방식을 다시 결정합니다.
이 함수가 호출되지 않아도 기본적으로 씬의 카메라들을 실시간으로 인식하도록 설정되어 있습니다.
캐릭터를 렌더링하는 직접 카메라들을 지정할 수 있습니다.
이 함수가 호출된 이후부터는 FindRenderingCamerasAutomatically() 함수가 호출되기 전까지 자동으로 씬에 존재하는 카메라를 확인하지 않습니다.
params Camera[] cameras : 1개 혹은 여러개의 카메라들을 지정합니다.
int : 실제로 캐릭터를 렌더링할 수 있는 카메라의 개수입니다.
애니메이션, 컨트롤 파라미터, 본 또는 루트 유닛을 대상 캐릭터에 동기화를 합니다.
이 함수를 호출하면 해당 캐릭터는 대상 캐릭터에 종속되어 업데이트됩니다.
이 함수를 사용하는 예제들을 다음의 페이지에서 볼 수 있습니다.
- 다른 캐릭터와 동기화된 재생
- 본을 동기화하여 의상 교체하기
apPortrait targetPortrait : 동기화 대상이 되는 apPortrait입니다.
bool syncAnimation : 애니메이션을 동기화할지 여부입니다.
bool syncControlParam : 컨트롤 파라미터를 동기화할지 여부입니다.
bool syncRootUnit : 루트 유닛을 동기화할지 여부입니다. 동기화되는 apPortrait의 루트 유닛의 개수가 2개 이상이며 동일해야합니다. 애니메이션이 동기화되면 이 요청은 무시됩니다.
bool syncBones : 본의 움직임을 동기화할지 여부입니다.
SYNC_BONE_OPTION syncBoneOption : 본의 움직임을 동기화할 경우, 어떤 방식으로 동기화할지 선택할 수 있습니다. MatchFromRoot를 입력하면 최상위인 루트 본부터 구조가 동일해야하며, MatchFromSubBones를 입력하면 동기화되는 캐릭터의 루트 본이 대상 캐릭터의 루트 본이 아니더라도 동기화가 됩니다. syncBones가 false라면 이 옵션은 무시되므로 아무 값이나 입력하면 됩니다.
bool : 동기화 처리 결과입니다. 동기화 대상이 유효하지 않거나 이미 동기화되어있는 등 처리가 실패하면 false를 리턴합니다.
Synchronize 함수로 설정된 동기화를 해제합니다.
캐릭터가 업데이트될 때, Unity의 어떤 시간값을 사용할지 결정합니다.
이 옵션에 따라 게임 배속에 영향을 받을지 여부와 자체 배속을 설정할 수 있습니다.
메카님을 이용하는 경우 적용되지 않습니다.
이 함수를 이용한 예제는 관련 페이지에서 보실 수 있습니다.
bool useUnscaleDeltaTime : 이 값이 true면 Unity의 Time.unscaledDeltaTime에 의해서 업데이트되며, false면 Time.deltaTime에 의해서 업데이트 됩니다. (기본값은 false 입니다.)
float multiplier : 자체적인 업데이트 배속을 설정할 수 있습니다. 입력하지 않으면 기본값인 1배속으로 설정됩니다.
캐릭터가 업데이트될 때, 콜백 함수를 이용하여 재생 속도를 제어할 수 있습니다.
메카님을 이용하는 경우 적용되지 않습니다.
이 함수를 이용한 예제는 관련 페이지에서 보실 수 있습니다.
OnDeltaTimeRequested onDeltaTimeRequested : 현재 프레임의 시간을 리턴하는 콜백 함수입니다. 사용자가 직접 업데이트 시간을 변조할 수 있습니다. 콜백 함수의 형식은 "float OnDeltaTimeRequested(object savedObject)" 입니다.
object savedObject : 콜백 함수가 호출 될 때, 어느 객체가 호출하는지 구분하는 등의 용도로 사용할 수 있는 값입니다. 타입에는 제한이 없으며 null도 가능합니다.
FPS 옵션에 따라 일정 시간 간격으로 메시가 갱신되도록 설정합니다.
이 옵션에 대한 설명은 관련 페이지에서 볼 수 있습니다.
int fps : 메시가 갱신되는 빈도를 FPS 단위로 설정합니다. 최대 30 FPS의 값을 입력할 수 있습니다.
bool isSyncUpdate : 메시 갱신 타이밍이 동일 옵션을 가진 다른 캐릭터와 동기화할지 여부입니다.
public class PrefabTest : MonoBehaviour
{
void Start () { }
void Update ()
{
if(Input.GetKeyUp(KeyCode.P))
{
GameObject swordGirl = Resources.Load<GameObject>("TestPrefab/SwordGirl");
swordGirl = Instantiate<GameObject>(swordGirl);
apPortrait swordGirlPortrait = swordGirl.GetComponent<apPortrait>();
swordGirlPortrait.transform.parent = this.transform;
swordGirlPortrait.transform.localPosition = Vector3.zero;
swordGirlPortrait.AsyncInitialize(OnPortraitLoadAsync);
}
}
void OnPortraitLoadAsync(apPortrait portrait)
{
portrait.Play("Idle");
}
}