Skip to content

WDataContainer

KarmoDDrine edited this page Apr 28, 2025 · 1 revision

1. MemberData에 붙어있는 _MDataContainer에 정보를 추가로 넣어서 다른 캔버스나 매니저 등에서 사용할 수 있는가

2. WaktaMemberData 자체에 데이터를 추가해야 한다면 코드를 자유롭게 수정해서 사용할 수 있는지와 새로운 정보를 추가해서 사용하는 것이 자유로운지,

_

네, 다른 곳에서도 사용할 수 있습니다. 코드 수정, 새로운 정보를 추가하는 것도 가능합니다.

MDataContainer는 데이터를 에디터 타임에 미리 정의/저장해두고, 이를 런타임에 사용하기 위해 만들어진 클래스입니다.

WaktaMember로 예를 든다면, 왁타버스분들의 닉네임, 타입 (WaktaMemberType), 프로필 사진 등을 미리 저장해두고, 이를 게임 진행 도중 불러와서 원하는 목적에 사용할 수 있습니다. 예를 든다면, 컨텐츠 도중 어떤 '자리'에 특정 왁타버스분이 등록된다면, WaktaMember에서 프로필 사진을 불러와 UI에 띄우는 식으로.

MDataContainer는 아래 같이 사용합니다 !

  1. 씬에 빈 오브젝트를 만들고,
  2. 해당 오브젝트에 MDataContainer 컴포넌트를 붙이고,
  3. 컴포넌트에 원하는 데이터를 넣고,
  4. 이 컴포넌트를 다른 곳에서 참조하여, MDataConatiner안에 있는 데이터에 접근하여 쓰는 식으로 사용합니다

( 참고, 중요하지 않음 >> 혹시 유니티의 스크립터블 오브젝트를 아신다면, 그것과 비슷한 개념으로 사용하기 위해 만들었습니다. VRChat에서는 스크립터블 오브젝트를 사용할 수 없어서, 이를 대체하기 위한 클래스라고 보시면 됩니다 ! 스크립터블 오브젝트는 에셋 파일을 만들지만, MDataContainer는 씬에 인스턴스를 직접 만든 다는 점에서 차이가 있네요. )

MDataConatiner는 특정 기능/클래스에 종속되지 않고, 다양한 곳에서 활용되기 위해 만들어진 독립적인 클래스

  • 그 목적대로, 데이터를 에디터 타임에 미리 저장하고 런타임에 사용하는 기능이 필요하다면, 다른 곳에서도 사용할 수 있습니다.

  • 여러 기능/클래스에서 하나의 공통된 데이터 구조를 사용하기 위함도 있습니다.

  • MDataContainer가 특정 기능/컨텐츠에 종속되지 않기 때문에, 일반적으로 다양한 기능/컨텐츠에서 공통적으로 사용되는 데이터들을 미리 변수로 정의해뒀습니다. 이는 조금 추상적이고? 그 목적이 모호? 할 수 있습니다.

  • string Name, string Value, Sprite Sprite, string StringData, Sprite[] Sprites, int RuntimeInt, bool RuntimeBool, string RuntimeString 등이 있습니다.

위 같은 이유로, 세 가지 정도의 문제가 있을 수 있습니다.

  1. 특정 기능/컨텐츠에는 사용되지 않는 데이터 변수가 있어 공간이 낭비될 수 있고
  2. 반대로 특정 기능/컨텐츠에선 필요한데, MDataContainer에서는 정의되지 않은 데이터 변수가 있을 수 있습니다.
  3. 데이터 변수의 이름이 고정됩니다.
  • (예를 들어 '특정 컨텐츠에서, 아이템의 설명' 같은 데이터는 string[] StringData에 저장할 수 있겠지만, 이는 ItemDescription 같은 직관적인 이름이 아니라서, 코드만 보고는 한 눈에 알아보기 어려울 수 있습니다. 미리 사용할 데이터 구조를 정리하고, 주석을 달고, 팀원이 있다면 공유해야 합니다. )

  • 이런 경우

    1. MDataContainer를 상속받아 새로운 클래스를 만들어서 사용하거나, (예를 들어, WaktaMemberData)
    • 변수를 추가하거나
    • 화살표 함수로 특정 데이터의 이름을 대신할 새로운 이름을 만들거나 (예를 들어, public string Nickname => Name;)
      • 이렇게 하더라도 Name은 그대로 남아서, Nickname, Name 두 개의 접근 방법이 생기게 되지만..
    1. 패키지에 포함된 MDataContainer 코드를 직접 수정하여 새로운 데이터 변수를 추가하거나
    2. 데이터를 문자열로 변환하여 string Valuestring[] 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}");
}

Clone this wiki locally