Files
Gen_Hack-and-Slash-Roguelite/Client/Assets/Scripts/Map/Dimension.cs

78 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using Managers;
using UnityEngine;
namespace Map
{
/// <summary>
/// 表示游戏中的一个维度或场景区域。
/// 实体管理器将根据此维度来组织和管理实体。
/// </summary>
public class Dimension : MonoBehaviour
{
[SerializeField] private bool defaultOpen = false;
[SerializeField] [Tooltip("此维度的唯一标识符。如果为空将使用GameObject的名称。")]
private string _dimensionId;
[SerializeField] public MapGenerator mapGenerator;
public Vector3 cameraPosition;
/// <summary>
/// 获取此维度的唯一标识符。
/// </summary>
public string DimensionId
{
get
{
if (string.IsNullOrEmpty(_dimensionId))
{
_dimensionId = gameObject.name; // 如果未设置默认使用GameObject名称
}
return _dimensionId;
}
// 内部设置器允许在Awake中初始化或编辑器中赋值
private set => _dimensionId = value;
}
/// <summary>
/// 此维度下所有实体的根Transform。用于组织场景层级。
/// </summary>
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);
}
}
}
}