88 lines
2.6 KiB
C#
88 lines
2.6 KiB
C#
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<MapNode> allNodes = new List<MapNode>();
|
||
|
||
[SerializeField] protected List<MapEdge> allEdges = new List<MapEdge>();
|
||
|
||
// 抽象方法:强制子类必须实现这个方法
|
||
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;
|
||
}
|
||
}
|
||
} |