Skip to content

Instantly share code, notes, and snippets.

@todorok1
Created April 8, 2025 07:31
Show Gist options
  • Select an option

  • Save todorok1/f41d6f61c8c15726d2c3dbffb61e6d0a to your computer and use it in GitHub Desktop.

Select an option

Save todorok1/f41d6f61c8c15726d2c3dbffb61e6d0a to your computer and use it in GitHub Desktop.
シンプルRPGチュートリアル第64回 マップ機能を管理するクラス
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace SimpleRpg
{
/// <summary>
/// マップ機能を管理するクラスです。
/// </summary>
public class MapManager : MonoBehaviour
{
/// <summary>
/// ゲーム開始時に読み込むマップです。
/// </summary>
[SerializeField]
int _gameStartMapId = 1;
/// <summary>
/// マップ用ゲームオブジェクトの親オブジェクトです。
/// </summary>
[SerializeField]
Transform _mapParent;
/// <summary>
/// 敵キャラクターとのエンカウントを管理するクラスへの参照です。
/// </summary>
[SerializeField]
EncounterManager _encounterManager;
[Header("テスト用設定")]
/// <summary>
/// テスト用に表示するマップのIDです。
/// </summary>
[SerializeField]
int _debugTargetMapId = 1;
/// <summary>
/// テスト用に表示するマップのPrefabをロードするかどうかのフラグです。
/// </summary>
[SerializeField]
bool _debugLoadTargetMap;
/// <summary>
/// 現在表示中のマップの制御クラスです。
/// </summary>
MapController _currentMapController;
/// <summary>
/// インスタンス化済みのマップの制御クラスのリストです。
/// </summary>
List<MapController> _mapControllers = new();
/// <summary>
/// 読み込んだマップのPrefabデータの一覧です。
/// </summary>
List<GameObject> _mapPrefabs = new();
/// <summary>
/// Map用Prefabのファイル名の接頭辞です。
/// </summary>
readonly string MapNamePrefix = "Map_";
void Start()
{
LoadMapPrefab();
}
/// <summary>
/// マップ用Prefabをロードします。
/// </summary>
public async void LoadMapPrefab()
{
AsyncOperationHandle<IList<GameObject>> handle = Addressables.LoadAssetsAsync<GameObject>(AddressablesLabels.Map, null);
await handle.Task;
_mapPrefabs = new List<GameObject>(handle.Result);
handle.Release();
ShowStartMap();
}
/// <summary>
/// ゲーム開始時のマップを表示します。
/// </summary>
void ShowStartMap()
{
// ゲーム開始時のマップを表示します。
ShowMap(_gameStartMapId);
}
void Update()
{
ShowDebugMap();
}
/// <summary>
/// デバッグ用にマップを表示します。
/// </summary>
void ShowDebugMap()
{
if (!_debugLoadTargetMap)
{
return;
}
_debugLoadTargetMap = false;
ShowMap(_debugTargetMapId);
}
/// <summary>
/// IDからマップのPrefabデータを取得します。
/// </summary>
public GameObject GetMapPrefabById(int mapId)
{
// 0000のように4桁のID文字列に変換します。
string mapNamePrefix = MapNamePrefix + mapId.ToString("D4");
var mapPrefab = _mapPrefabs.Find(prefab => prefab.name.StartsWith(mapNamePrefix));
return mapPrefab;
}
/// <summary>
/// マップIDに対応するマップを表示します。
/// </summary>
void ShowMap(int mapId)
{
_currentMapController = GetTargetMap(mapId);
if (_currentMapController == null)
{
// マップが見つからない場合は、AddressablesからPrefabを取得してインスタンス化します。
_currentMapController = InstantiateMap(mapId);
}
if (_currentMapController != null)
{
HideAllMap();
_currentMapController.gameObject.SetActive(true);
_currentMapController.SetEncounterData(_encounterManager);
SimpleLogger.Instance.Log($"マップを表示します。 ID: {mapId} Name: {_currentMapController.MapName}");
}
}
/// <summary>
/// リスト内のマップを全て非表示にします。
/// </summary>
void HideAllMap()
{
foreach (var mapController in _mapControllers)
{
mapController.gameObject.SetActive(false);
}
}
/// <summary>
/// マップIDに対応するマップを取得します。
/// </summary>
MapController GetTargetMap(int mapId)
{
MapController mapController = _mapControllers.Find(map => map.MapId == mapId);
return mapController;
}
/// <summary>
/// マップIDに対応するPrefabをインスタンス化します。
/// 制御用のMapControllerを返します。
/// </summary>
MapController InstantiateMap(int mapId)
{
var mapPrefab = GetMapPrefabById(mapId);
if (mapPrefab != null)
{
var mapObject = Instantiate(mapPrefab, Vector3.zero, Quaternion.identity, _mapParent);
var mapController = mapObject.GetComponent<MapController>();
_mapControllers.Add(mapController);
return mapController;
}
else
{
SimpleLogger.Instance.LogError($"指定したIDのPrefabデータが見つかりませんでした。 ID: {mapId}");
return null;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment