-
Notifications
You must be signed in to change notification settings - Fork 3
WDataContainer
_
네, 다른 곳에서도 사용할 수 있습니다. 코드 수정, 새로운 정보를 추가하는 것도 가능합니다.
MDataContainer는 데이터를 에디터 타임에 미리 정의/저장해두고, 이를 런타임에 사용하기 위해 만들어진 클래스입니다.
WaktaMember로 예를 든다면, 왁타버스분들의 닉네임, 타입 (WaktaMemberType), 프로필 사진 등을 미리 저장해두고, 이를 게임 진행 도중 불러와서 원하는 목적에 사용할 수 있습니다. 예를 든다면, 컨텐츠 도중 어떤 '자리'에 특정 왁타버스분이 등록된다면, WaktaMember에서 프로필 사진을 불러와 UI에 띄우는 식으로.
MDataContainer는 아래 같이 사용합니다 !
- 씬에 빈 오브젝트를 만들고,
- 해당 오브젝트에 MDataContainer 컴포넌트를 붙이고,
- 컴포넌트에 원하는 데이터를 넣고,
- 이 컴포넌트를 다른 곳에서 참조하여, MDataConatiner안에 있는 데이터에 접근하여 쓰는 식으로 사용합니다
( 참고, 중요하지 않음 >> 혹시 유니티의 스크립터블 오브젝트를 아신다면, 그것과 비슷한 개념으로 사용하기 위해 만들었습니다. VRChat에서는 스크립터블 오브젝트를 사용할 수 없어서, 이를 대체하기 위한 클래스라고 보시면 됩니다 ! 스크립터블 오브젝트는 에셋 파일을 만들지만, MDataContainer는 씬에 인스턴스를 직접 만든 다는 점에서 차이가 있네요. )
-
그 목적대로, 데이터를 에디터 타임에 미리 저장하고 런타임에 사용하는 기능이 필요하다면, 다른 곳에서도 사용할 수 있습니다.
-
여러 기능/클래스에서 하나의 공통된 데이터 구조를 사용하기 위함도 있습니다.
-
MDataContainer가 특정 기능/컨텐츠에 종속되지 않기 때문에, 일반적으로 다양한 기능/컨텐츠에서 공통적으로 사용되는 데이터들을 미리 변수로 정의해뒀습니다. 이는 조금 추상적이고? 그 목적이 모호? 할 수 있습니다.
-
string Name,string Value,Sprite Sprite,string StringData,Sprite[] Sprites,int RuntimeInt,bool RuntimeBool,string RuntimeString등이 있습니다.
위 같은 이유로, 세 가지 정도의 문제가 있을 수 있습니다.
- 특정 기능/컨텐츠에는 사용되지 않는 데이터 변수가 있어 공간이 낭비될 수 있고
- 반대로 특정 기능/컨텐츠에선 필요한데, MDataContainer에서는 정의되지 않은 데이터 변수가 있을 수 있습니다.
- 데이터 변수의 이름이 고정됩니다.
-
(예를 들어 '특정 컨텐츠에서, 아이템의 설명' 같은 데이터는
string[] StringData에 저장할 수 있겠지만, 이는ItemDescription같은 직관적인 이름이 아니라서, 코드만 보고는 한 눈에 알아보기 어려울 수 있습니다. 미리 사용할 데이터 구조를 정리하고, 주석을 달고, 팀원이 있다면 공유해야 합니다. ) -
이런 경우
- MDataContainer를 상속받아 새로운 클래스를 만들어서 사용하거나, (예를 들어, WaktaMemberData)
- 변수를 추가하거나
- 화살표 함수로 특정 데이터의 이름을 대신할 새로운 이름을 만들거나 (예를 들어,
public string Nickname => Name;)- 이렇게 하더라도
Name은 그대로 남아서,Nickname,Name두 개의 접근 방법이 생기게 되지만..
- 이렇게 하더라도
- 패키지에 포함된 MDataContainer 코드를 직접 수정하여 새로운 데이터 변수를 추가하거나
- 데이터를 문자열로 변환하여
string Value나string[] StringData에 저장하고, 사용할 때 파싱하는 방법 등을 사용할 수 있습니다.
- 전에는 제가 Woodon을 사용한 프로젝트들을 패키지 내 Sample로 공유를 해뒀는데, Woodon 버전 업을 하면서 호환되지 않는 코드들이 몇몇 생겨서, 당장은 Sample을 지워두었습니다. 이런 부분도 부지런히 정리하겠습니다.
간단한 사용 예시는 아래와 같습니다.
private void Example()
{
VRCPlayerApi playerApi = seat.GetTargetPlayerAPI();
string displayName = playerApi.displayName;
WaktaManager waktaManager = WaktaManager.GetInstance();
WaktaMember waktaMember = WaktaUtil.GetWaktaMember(displayName);
Debug.Log($"waktaMember: {waktaMember}");
}