-
-
Save todorok1/f41d6f61c8c15726d2c3dbffb61e6d0a to your computer and use it in GitHub Desktop.
シンプルRPGチュートリアル第64回 マップ機能を管理するクラス
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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