이 래퍼를 사용하면 Unity C#에서 YouTube Playables SDK에 액세스할 수 있습니다. 래퍼에는 개발 속도를 높이는 데 도움이 되는 .jslib 플러그인과 C# 파일이 있습니다. 프로젝트에서 이를 사용하는 방법을 보여주는 샘플 프로젝트도 있습니다.
Unity 패키지는 Playables 샘플 저장소에서 다운로드할 수 있습니다.
사용
- Unity 프로젝트 플랫폼이
WebGL
로 설정되어 있는지 확인합니다. 이 설정은Build Settings
에서 확인할 수 있습니다. WebGLTemplate
를 사용하여 웹용 게임을 빌드하거나 자체 index.html 파일 사용 섹션에 따라index.html
파일에서 웹 SDK를 설정하고 초기화했는지 확인합니다.WebGLTemplate
은Google-WebGLTemplate-only.unitypackage
또는GoogleYTGameWrapper-with-sample.unitypackage
패키지에서 찾을 수 있습니다. 이 템플릿을 설정하고 사용하려면 WebGL 템플릿 섹션의 단계를 따르세요.- 자체 웹 및
index.html
파일을 사용하려면index.html
Unity 생성 스크립트에 두 줄을 추가해야 합니다. 통합에 관한 내용은 자체 index.html 파일 사용 섹션을 참고하세요.
- Unity에서 프로젝트를 연 다음 패키지를 열고 프로젝트로 가져옵니다.
GoogleYTGameWrapper.unitypackage
: YouTube 게임 룸 SDK를 연결하는 JS 플러그인과 이를 제품에 연결하는 데 도움이 되는 C# 래퍼가 포함되어 있습니다.GoogleYTGameWrapper-with-sample.unitypackage
: GoogleYTGameWrapper 패키지에 있는 파일 콘텐츠와 C#에서 YouTube 게임 룸 SDK를 사용하는 방법을 보여주는 샘플이 포함되어 있습니다.
- 중요: 기본 장면에서 새 게임 객체를 만들고 이름을
YTGameWrapper
로 지정합니다. 이 게임 객체는 JS 브리지와 통신하는 데 사용됩니다. - 중요: 가져온
YTGameWrapper.cs
코드를 스크립트 구성요소로YTGameWrapper
GameObject에 추가합니다. 프로젝트에 여러 장면이 있는 경우
YTGameWrapper.cs
스크립트에DontDestroyOnLoad
를 추가해야 합니다. 스크립트의 새 버전에는 기본적으로 사용 설정된DontDestroyOnSceneChange
전환 버튼이 있습니다. 이렇게 하면 스크립트와 GameObject가 게임 전체에 걸쳐 유지됩니다.GameObject.DontDestroyOnLoad(this.gameObject);
YTGameWrapper.cs
구성요소와YTGameWrapper
GameObject는 YouTube Playables SDK에 연결하는 데 사용됩니다. 이를 사용하여 YouTube에 연결합니다. 스크립트를 사용하여 객체와 구성요소를 찾거나 Unity 편집기를 통해 게임 코드에 수동으로 추가합니다.프로젝트의 기술 요구사항을 준수하는지 확인합니다.
자체 index.html 파일 사용
제공된 index.html
예시를 사용하지 않는 경우 index.html
Unity 생성 스크립트에 두 줄의 코드를 추가해야 합니다.
먼저 프로젝트에서 Unity 컨테이너, 캔버스 등의 변수를 설정하는 동일한 위치에 이 줄을 추가합니다.
var container = document.querySelector("#unity-container");
var canvas = document.querySelector("#unity-canvas");
var unityGameInstance = null; // <-- Add this line >
...
두 번째로 createUnityInstance
함수 내에 다음 줄을 추가합니다.
createUnityInstance(canvas, config, (progress) => {
progressBarFull.style.width = 100 * progress + "%";
}).then((unityInstance) => {
unityGameInstance = unityInstance; // <-- Add this line >
...
예
이 섹션에는 C# 래퍼를 사용하는 방법의 몇 가지 예가 나와 있지만 사용 가능한 API의 전체 목록은 아닙니다. 사용 가능한 API의 전체 목록은 YouTube Playables SDK를 참고하세요.
sendScore
다음은 C#에서 sendScore(int points)
를 구현하는 방법을 보여주는 예입니다.
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
public int battleScore = 0;
...
// Update the total score and send this to the YouTube Game Wrapper.
public void UpdateScores(int scoreAmt)
{
battleScore += scoreAmt;
// ytGameWrapper should be a reference to your YTGameWrapper component.
ytGameWrapper.SendGameScore(battleScore);
}
onPause
다음은 게임이 YT Playables에서 발생하는 Pause
이벤트를 수신 대기하여 필요할 때 엔진을 일시중지하는 방법의 예입니다.
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
public bool gameIsPaused = false;
...
void Start()
{
// Sets the OnPause callback with the YT Playables SDK
ytGameWrapper.SetOnPauseCallback(PauseTheGameCallback);
}
// Pause game callback, will pause the game when called.
public void PauseTheGameCallback()
{
gameIsPaused = true;
}
saveData
다음은 YT Playables SDK에 전송되는 saveData
를 사용하는 방법의 예입니다.
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
...
// Saves the current score of the game and converts it to a JSON format.
public void SaveScore(int scoreAmt)
{
SaveGameData("{\"BestScore\": \"" + scoreAmt.ToString() + "\"}");
}
public void SaveGameData(string saveString)
{
if (string.IsNullOrEmpty(saveString)) return;
// Sends save data to the YT Playables SDK
ytGameWrapper.SendGameSaveData(saveString);
}
loadData
다음은 YT Playables SDK에 전송되는 loadData
를 사용하는 방법의 예입니다.
...
using UnityEngine;
using YTGameSDK;
...
[Serializable]
public class LoadedScores
{
public int BestScore;
public float BestTime;
}
public YTGameWrapper ytGameWrapper;
...
void Start()
{
ytGameWrapper.LoadGameSaveData(LoadSaveGameDataReturned);
}
public void LoadSaveGameDataReturned(string data)
{
if (!string.IsNullOrEmpty(data))
{
LoadedScores loadedScores = JsonUtility.FromJson<LoadedScores>(data);
Debug.Log("LoadSaveGameDataReturned > Score <" + loadedScores.BestScore.ToString()
+ "> Time <" + loadedScores.BestTime.ToString("0.00"));
}
}
requestInterstitialAd
다음은 requestInterstitialAd
를 사용하여 전면 광고를 게재하기에 적절한 시기를 나타내는 방법의 예입니다. 최상의 결과를 얻으려면 게임 플레이 중 휴식 시간(예: 레벨이 끝날 때)에 이 호출을 실행하세요.
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
...
// At the end of a round send a request to show an interstitial Ad, if one is
// available an Ad will be shown and Pause Game Callback should be called.
// EXAMPLE: send and forget
public void RequestInterstitialAd()
{
ytGameWrapper.RequestInterstitialAd();
}
// EXAMPLE: send and react to if an Ad was shown
public void RequestInterstitialAd()
{
int status = ytGameWrapper.RequestInterstitialAd();
if (status == 0)
{
// Ad request was successful, do some action.
}
}
YouTube의 예시 WebGL 템플릿을 사용하는 방법
매우 큰 Unity 프로젝트가 아닌 경우 빌드된 .wasm
및 .data
파일이 개별 파일 크기 한도 미만이어야 합니다. 이 경우 플레이어블 파일 제출 시 자동으로 압축되므로 이러한 파일에 대해 추가 압축을 수행해서는 안 됩니다.
이 자동 압축은 .wasm 파일이 초기 번들 크기 요구사항에 맞는지도 확인합니다. 예를 들어 ~25MiB .wasm
파일은 ~7MiB로 압축됩니다.
어떤 이유로든 파일이 최대 개별 파일 크기 한도를 초과하는 경우 ZIP 압축을 사용하여 이 한도에 맞는지 확인하는 것이 좋습니다. 재생 가능한 압축은 이러한 파일을 다시 압축하지 않습니다.
WebGL 템플릿
- 초기 설정은 위의 Unity 패키지 안내를 따르세요.
Google-WebGLTemplate-only.unitypackage
또는GoogleYTGameWrapper-with-sample.unitypackage
를 사용하고WebGLTemplates/YTGameWrapperTemplate/
폴더 아래의 모든 파일을 가져와야 합니다.- 참고: 아직
YTGameWrapper.cs
및UnityYTGameSDKLib.jslib
를 가져오지 않았다면 이 항목도 가져와야 합니다.
- 참고: 아직
YTGameWrapperTemplate
를 사용하도록 WebGL 템플릿을 설정합니다. 이 설정은Edit
->Project settings
->Player
->WebGL
탭 ->Resolution and Presentation
섹션에 있습니다.- 참고: 기본 캔버스 너비와 높이는 템플릿에서 100% 로 설정되므로 이러한 Unity 설정은 아무것도 조정하지 않습니다.
Compression Format
이 사용 중지로 설정되어 있는지 확인합니다. 이 설정은Project settings
->Player
->WebGL
탭 ->Publishing Settings
섹션에 있습니다.Build Settings
창에서WebGL
를 빌드한 다음 프로젝트 요구사항에 따라 7단계 또는 5단계로 이동합니다.- 압축을 사용하는 경우에만 5단계와 6단계를 따르세요: 프로젝트가 빌드된 후 빌드 폴더 위치로 이동하여
Build
폴더를 엽니다. 개별 파일 크기 한도에 맞게 압축해야 하는 프로젝트.wasm
또는.data
파일을 찾아 이러한 파일을 압축합니다.*.wasm.zip
및*.data.zip
파일을 제출하므로 압축된 원본.wasm
/.data
파일을 삭제해야 합니다.- 참고: Mac을 사용하는 경우 파일을 마우스 오른쪽 버튼으로 클릭하고 '* 압축'을 선택합니다. PC에서는 파일을 마우스 오른쪽 버튼으로 클릭하고 'ZIP 파일로 압축'을 선택합니다.
- 5단계를 실행한 경우에만 따르세요. 압축된 파일을 로드하고 압축을 해제하도록
YTGameWrapperTemplate
에서 빌드된index.html
파일을 업데이트합니다.index.html
파일 끝부분에서Path 1
을 찾아 다음 줄InitUnitySection();
을 주석 처리합니다.index.html
파일 끝부분에서Path 2
을 찾아 다음 줄loadResources(InitUnitySection);
을 주석 처리합니다.
- 인증을 위해 프로젝트를 제출할 때는 Unity에서 빌드된 모든 파일을 4단계의 빌드 위치로 보내야 합니다. 5단계와 6단계를 따른 경우 이러한 파일도 포함합니다.
제공된 샘플을 범용 렌더링 파이프라인 (URP)을 사용하도록 업그레이드
최신 버전의 Unity의 최신 발전 중 하나는 범용 렌더링 파이프라인 (URP)을 사용한다는 것입니다. 모든 항목이 올바르게 렌더링되도록 샘플을 업그레이드합니다.
- 새 프로젝트 또는 기존 프로젝트로
GoogleYTGameWrapper-with-sample.unitypackage
패키지를 가져와 시작합니다. Render Pipeline Converter
창으로 이동합니다(Window
->Rendering
->Render Pipeline Converter
).Rendering Settings
,Material Upgrade
,Readonly Material Converter
를 선택합니다.- 그런 다음
Initialize and Convert
를 선택하고 완료될 때까지 기다리면 샘플이 URP에 준비됩니다.
Unity 프로젝트에서 애셋을 분할하는 방법 (지연 로딩)
Unity를 사용할 때 개발자가 강조한 주요 문제 중 하나는 개별 파일 크기 요구사항과 총 번들 크기 요구사항을 준수하는 것입니다.
애셋의 지연 로딩은 필요할 때 애셋, 레벨, 데이터를 로드할 수 있으므로 프로젝트에 적용할 수 있는 훌륭한 최적화입니다. 전체 게임이 처음부터 로드되지 않고 사용자가 제품을 탐색할 때 로드되므로, 이 작업을 올바르게 수행하면 인증팀에서 전체 파일 크기 제한을 면제해 줄 수 있습니다.
적절한 로딩을 위해 Unity에는 애셋을 분할하는 여러 방법이 있습니다. 개별 애셋 그룹이 크기 제한 미만이고 시간이 지남에 따라 콘텐츠를 로드하는지 확인합니다. Addressables 또는 Asset Bundles를 사용하는 것이 좋습니다.
Addressables
Addressables를 사용하면 함께 로드해야 하는 여러 파일을 식별할 수 있으며 Unity에서 대부분의 패키징을 처리합니다. Unity는 파일 크기를 관리하고 애셋이 중복되지 않도록 하는 데 도움이 되는 몇 가지 도구도 제공합니다.
Addressables를 사용하려면 Unity의 Package Manager를 통해 Addressables 패키지를 가져온 다음 애셋을 Addressable Groups에 태그해야 합니다. 자세한 내용은 Unity 문서를 참고하세요.
애셋 번들
애셋 번들은 프로젝트를 분할하고 요소를 즉시 로드할 수 있으므로 유용합니다. DLC, 레벨 팩, 새 캐릭터 등에 유용합니다. 애셋 번들은 자체 관리 콘텐츠 로드 및 번들링에 적합합니다. 애셋을 특정 번들로 태그한 다음 필요할 때 번들을 로드하여 사용할 수 있습니다. 자세한 내용은 Unity의 애셋 번들 문서를 참고하세요.
전체 YT Playables API 참조를 확인하세요.