728x90
- 주제
>> WebGL 게임 상태 저장 메서드 작성
>> Unity WebGL과 JavaScript의 상호작용 코드 추가
>> 게임 저장 클래스(GameState)와 데이터 저장 구현
- 공부내용
1. WebGL 게임 상태 저장 메서드 작성
Unity에서 WebGL 빌드를 사용할 경우, 웹 브라우저 새로고침이나 페이지 닫기 시 데이터가 손실되지 않도록 게임 상태를 저장해야 한다.
이를 위해 Unity의 SendMessage 메서드를 활용하여 JavaScript와 통신할 수 있다.
아래는 Unity에서 게임 상태를 저장하는 메서드의 예제이다.
GameManager.cs
// Web에서 호출
public void OnWebGLQuit()
{
SaveGameState();
}
public void SaveGameState()
{
GameState state = new GameState
{
Score = Score, // 현재 점수 저장
Money = Money // 현재 소지금 저장
};
DataManager.Instance.SaveGame(state); // 데이터 저장
}
GameState.cs
// 게임 상태 클래스
public class GameState
{
public int Score; // 점수
public int Money; // 소지금
}
2. WebGL 빌드 파일의 JavaScript 코드 수정
Unity WebGL에서 JavaScript를 사용해 Unity 스크립트의 메서드를 호출할 수 있다.
빌드 후 생성된 index.html 파일의 <script> 내부에 관련 코드를 추가한다.
<기본>
var script = document.createElement("script");
script.src = loaderUrl;
script.onload = () => {
createUnityInstance(canvas, config, (progress) => {
document.querySelector("#unity-progress-bar-full").style.width = 100 * progress + "%";
}).then((unityInstance) => {
document.querySelector("#unity-loading-bar").style.display = "none";
document.querySelector("#unity-fullscreen-button").onclick = () => {
unityInstance.SetFullscreen(1);
};
}).catch((message) => {
alert(message);
});
};
document.body.appendChild(script);
</script>
<추가 후>
var unityInstance; //추가
var script = document.createElement("script");
script.src = loaderUrl;
script.onload = () => {
createUnityInstance(canvas, config, (progress) => {
document.querySelector("#unity-progress-bar-full").style.width = 100 * progress + "%";
}).then((instance) => { //변경(unityInstance -> instance)
unityInstance = instance; //추가
document.querySelector("#unity-loading-bar").style.display = "none";
document.querySelector("#unity-fullscreen-button").onclick = () => {
unityInstance.SetFullscreen(1);
};
}).catch((message) => {
alert(message);
});
};
document.body.appendChild(script);
//아래 코드 추가
window.onbeforeunload = function () {
if (unityInstance) {
unityInstance.SendMessage('GameManager', 'OnWebGLQuit');
}
}
</script>
위 코드는 브라우저의 새로고침이나 닫기 이벤트(onbeforeunload) 발생 시 Unity의 GameManager 객체에 정의된 OnWebGLQuit 메서드를 호출한다.
3. 데이터 저장 방식과 활용
Unity의 DataManager는 상태 데이터를 JSON 또는 PlayerPrefs로 저장하도록 설계할 수 있다.
게임 데이터를 안전하게 저장하고 불러오기 위해 JSON 파일로 변환하는 방식을 추천한다.
아래는 간단한 JSON 저장 예제이다.
public class DataManager : MonoBehaviour
{
private static DataManager instance;
public static DataManager Instance => instance ??= new DataManager();
public void SaveGame(GameState state)
{
string json = JsonUtility.ToJson(state); // 게임 상태를 JSON으로 변환
PlayerPrefs.SetString("GameState", json); // JSON을 PlayerPrefs에 저장
PlayerPrefs.Save();
}
public GameState LoadGame()
{
string json = PlayerPrefs.GetString("GameState", "{}");
return JsonUtility.FromJson<GameState>(json); // JSON을 GameState로 변환
}
}
<결과>
- 브라우저 새로고침 시 게임 데이터를 자동 저장한다.
- 브라우저 닫기 전 Unity 메서드가 호출된다.
- PlayerPrefs 또는 JSON 파일로 저장된 데이터를 복원할 수 있다.
<주의사항>
- 출시 후 게임을 플레이하다가, itch.io에서 zip 파일을 업데이트 하면 기존에 저장되어있던 데이터는 지워진다.
728x90
반응형
'유니티' 카테고리의 다른 글
Day 43 - 구글 스프레드시트와 유니티 연동 및 다국어 데이터 관리 (1부) (2) | 2024.12.06 |
---|---|
Day 42 - Object Pooling을 활용한 특정 위치 아이템 드랍 (2) | 2024.12.06 |
Day 40 - 상태머신(3D 방치형 게임 만들기 中) (0) | 2024.06.18 |
Day 39 - SoundManager(오브젝트 풀에서 사운드 소스를 가져와 재생) (0) | 2024.06.12 |
Day 38 - SaveManager.cs 생성(정보 저장) (2) | 2024.06.11 |