Module
PrismStudio에서 사용되는 Module은, 복잡한 프로그래밍을 하지 않아도 간단하게 PrismStudio와 연동되는 기본/제3자 기능을 제작할 수 있도록 설계되었습니다.
MonoBehaviour
를 상속받고 있기에, Unity에서 어려움 없이 쉽게 만들 수 있습니다.
Module 방식을 채택함 으로써 본래 메인 시스템이 다루고 있는 모든 로직 (카메라 위치 및 속성 등)이 이제는 여러 모듈로 분산되어, 유지보수가 더욱 간편해졌으며, 새로운 기능을 추가하는데에 큰 어려움 없이 구현할 수 있게 되었습니다.
tip
Module은 StudioSystem에 등록되지 않아도 독립적으로 작동할 수 있습니다만, Module을 상속받았다는 것은 PrismStudio와 함께 작동하도록 한다라는 전제 하에 구조를 만드는 편이 이상적입니다.
예시
아래는 Module을 상속하는 커스텀 모듈의 예시 코드입니다.
ExampleModule.cs의 부분
public class ExampleModule : Module
{
public override string description(SupportedLanguage lang)
{
// 반환된 string은 모듈의 설명란으로써 보이게 됩니다.
// 어떤 언어를 요구하는지 매개변수로 SupportedLanguage lang이 제공됩 니다.
// 국제화를 하고 싶지 않다면, switch 문을 사용하지 않고, 원하는 문자열을 그대로 반환합니다.
switch (lang)
{
case SupportedLanguage.Korean:
{
return "모듈 예시";
}
case SupportedLanguage.Japanese:
{
return "モジュール例";
}
}
return "Module example";
}
public override void OnStudioSystemInitialized(StudioSystem studioSystem)
{
// StudioSystem이 이 모듈을 등록했을때 호출됩니다.
// 여기서 StudioSystem에게 Endpoint를 요구하여, VRChat으로부터 OSC 메세지를 받았을 때 특정 함수가 실행되도록 할 수 있습니다.
// 여기 예시에는, 아바타의 꼬리에 PhysBone을 설정하고, Parameter를 Tail로 설정한 뒤, 누군가가 꼬리 PhysBone을 잡았을때 특정 함수를 호출하도록 합니다.
studioSystem.AddEndpoint("/avatar/parameters/Tail_IsGrabbed", "f", Received);
}
void Received(OscMessage message)
{
Debug.Log(message[0]);
}
public override void OnCameraTypeChanged(StudioSystem.ClientCameraType newCameraType)
{
// StudioSystem에 카메라 타입이 변경되었을때 호출됩니다.
Debug.Log($"Camera changed to {newCameraType}");
}
public override bool OnSend(StudioSystem system, bool immediate)
{
// 이 함수는 StudioSystem이 OSC를 전송할때 실행됩니다.
// bool을 반환하는 것이 필수이며, bool의 값은 함수의 실행 성공 여부를 말합니다.
// 함수의 실행 성공 여부를 감지하기 위해, try/catch를 사용하는 것을 추천합니다.
try
{
// 여기서 VRChat으로 OSC 메세지를 보낼 수 있습니다.
OscMessage msg = new OscMessage("/avatar/parameters/ExampleParameter", 3);
system.Send(msg);
} catch (Exception e)
{
// 에러가 발생한 경우, Debug.LogException을 호출한 뒤 false를 반환하는 것이 이상적입니다.
Debug.LogException(e);
return false;
}
return true;
}
}