using System; using Managers; using UnityEngine; namespace Map { /// /// 表示游戏中的一个维度或场景区域。 /// 实体管理器将根据此维度来组织和管理实体。 /// public class Dimension : MonoBehaviour { [SerializeField] private bool defaultOpen = false; [SerializeField] [Tooltip("此维度的唯一标识符。如果为空,将使用GameObject的名称。")] private string _dimensionId; [SerializeField] public MapGenerator mapGenerator; public Vector3 cameraPosition; /// /// 获取此维度的唯一标识符。 /// public string DimensionId { get { if (string.IsNullOrEmpty(_dimensionId)) { _dimensionId = gameObject.name; // 如果未设置,默认使用GameObject名称 } return _dimensionId; } // 内部设置器,允许在Awake中初始化或编辑器中赋值 private set => _dimensionId = value; } /// /// 此维度下所有实体的根Transform。用于组织场景层级。 /// public Transform DimensionRoot { get; private set; } private void Awake() { // 1. 确保 DimensionId 已初始化,这会触发 DimensionId 属性的 getter 逻辑 var id = DimensionId; // 2. 创建一个用于存放此维度下所有实体的根GameObject,方便管理 var rootObj = new GameObject($"_Entities_{id}"); rootObj.transform.SetParent(this.transform); // 将其作为Dimension对象的子对象 DimensionRoot = rootObj.transform; Program.Instance.RegisterDimension(this); mapGenerator.Init(); var size = mapGenerator.baseMap.GetSize(); cameraPosition = new Vector3(size.x / 2f, size.y / 2f, -10)+transform.position; // 5. 处理 defaultOpen 逻辑,设置Program的焦点维度 // 确保在自身注册到 Program 之后再设置焦点,这样 Program 内部才能找到它 if (defaultOpen) { Program.Instance.SetFocusedDimension(_dimensionId); } } private void OnDestroy() { // 当 Dimension 对象被销毁时(例如,场景卸载),从 Program 和 EntityManage 注销 if (Program.Instance != null) // 检查单例是否仍然存在 { Program.Instance.UnregisterDimension(this); } } } }