using UnityEngine; using System.Collections.Generic; namespace SLSUtilities.Map { // 将类声明为 abstract,表示它不能直接挂载使用,必须被继承 public abstract class MapGeneratorBase : MonoBehaviour { [Header("基础配置")] public MapNodeData defaultNodeData; // 存储生成的地图数据 (protected 使得子类可以访问) [Header("生成结果 (Debug)")] [SerializeField] // 加上这个是为了在Inspector里能看到,方便调试 protected List allNodes = new List(); [SerializeField] protected List allEdges = new List(); // 抽象方法:强制子类必须实现这个方法 public abstract void GenerateMap(); [ContextMenu("Clear Map")] public virtual void ClearMap() { allNodes.Clear(); allEdges.Clear(); } // 通用的清理与重置逻辑 protected void ResetIDs() { // 如果需要重新整理ID,可以在这里写 } // 通用的 Gizmos 绘制逻辑 protected virtual void OnDrawGizmos() { if (allNodes == null) return; // 画边 Gizmos.color = Color.gray; if (allEdges != null) { foreach (var edge in allEdges) { if (edge.fromNode != null && edge.toNode != null) Gizmos.DrawLine(edge.fromNode.position, edge.toNode.position); } } // 画节点 foreach (var node in allNodes) { Gizmos.color = node.data != null ? node.data.debugColor : Color.white; Gizmos.DrawSphere(node.position, 0.5f); } } } [System.Serializable] public class MapNode { public int id; // 唯一ID public Vector2 position; // 在地图上的坐标 public MapNodeData data; // 引用上面的ScriptableObject数据 // 构造函数 public MapNode(int id, Vector2 pos, MapNodeData data) { this.id = id; this.position = pos; this.data = data; } } [System.Serializable] public class MapEdge { public MapNode fromNode; public MapNode toNode; public bool isBidirectional; // 是否双向 public MapEdge(MapNode from, MapNode to, bool bidirectional) { this.fromNode = from; this.toNode = to; this.isBidirectional = bidirectional; } } }