(client) feat:支持定义实体的碰撞体大小和偏移;建筑支持定义实体建筑和瓦片建筑,建筑支持指定按钮回调;添加存档管理器;Dev支持设置是否暂停;实体允许定义事件组;添加基地界面 (#57)

Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com>
Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/57
This commit is contained in:
2025-09-28 15:02:57 +08:00
parent 87a8abe86c
commit aff747be17
232 changed files with 39203 additions and 4161 deletions

View File

@@ -0,0 +1,159 @@
using UnityEngine;
using UnityEngine.Tilemaps;
using Data; // For TileDef
using System.Collections.Generic;
using Managers; // For Dictionary
namespace Map
{
public class Landform : MonoBehaviour
{
public Tilemap baseTilemap;
public Tilemap buildingTilemap;
public Tilemap plantTilemap;
public Dimension dimension;
// 定义瓦片状态结构体
public struct TileState
{
public Vector3Int position; // 瓦片的世界坐标
public Tile.ColliderType colliderType;
public float travelCost;
public TileState(Vector3Int pos, Tile.ColliderType collider, float cost)
{
position = pos;
colliderType = collider;
travelCost = cost;
}
}
public void Init()
{
}
public string GetDimensionID()
{
return dimension.DimensionId;
}
public Vector3Int GetSize()
{
return baseTilemap.size;
}
public Vector3 GetWorldCoordinates(Vector3Int coord)
{
return baseTilemap.CellToWorld(coord);
}
public void Clear()
{
baseTilemap.ClearAllTiles();
buildingTilemap.ClearAllTiles();
plantTilemap.ClearAllTiles();
}
/// <summary>
/// 获取指定格子坐标上的瓦片状态,包括碰撞体类型和通行成本。
/// 优先级buildingTilemap > plantTilemap > baseTilemap。
/// </summary>
/// <param name="cellPosition">要查询的格子坐标。</param>
/// <returns>包含瓦片碰撞体类型和通行成本的TileState结构。</returns>
public TileState GetTileState(Vector3Int cellPosition)
{
Tile.ColliderType finalColliderType = Tile.ColliderType.None;
float finalTravelCost = 0f; // 默认通行成本
// 瓦片层级优先级Building > Plant > Base
// 存储查询到的瓦片定义及其所属Tilemap用于后续决定通行成本
Dictionary<Tilemap, (TileBase tile, TileDef def)> activeTiles = new Dictionary<Tilemap, (TileBase, TileDef)>();
// 1. 尝试从 Building 层获取瓦片信息
TileBase buildingTile = buildingTilemap.GetTile(cellPosition);
if (buildingTile != null && DefineManager.Instance != null) // 确保DefineManager已实例化
{
TileDef buildingTileDef = DefineManager.Instance.FindDefine<TileDef>(buildingTile.name);
if (buildingTileDef != null)
{
activeTiles[buildingTilemap] = (buildingTile, buildingTileDef);
if (buildingTileDef.collider != Tile.ColliderType.None)
{
finalColliderType = buildingTileDef.collider; // Building层的碰撞体优先级最高
}
}
}
// 2. 尝试从 Plant 层获取瓦片信息 (只有当 Building 层没有提供碰撞体时才考虑)
if (finalColliderType == Tile.ColliderType.None)
{
TileBase plantTile = plantTilemap.GetTile(cellPosition);
if (plantTile != null && DefineManager.Instance != null)
{
TileDef plantTileDef = DefineManager.Instance.FindDefine<TileDef>(plantTile.name);
if (plantTileDef != null)
{
activeTiles[plantTilemap] = (plantTile, plantTileDef);
if (plantTileDef.collider != Tile.ColliderType.None)
{
finalColliderType = plantTileDef.collider; // Plant层的碰撞体优先级次之
}
}
}
}
// 3. 尝试从 Base 层获取瓦片信息 (只有当 Building 和 Plant 层都没有提供碰撞体时才考虑)
if (finalColliderType == Tile.ColliderType.None)
{
TileBase baseTile = baseTilemap.GetTile(cellPosition);
if (baseTile != null && DefineManager.Instance != null)
{
TileDef baseTileDef = DefineManager.Instance.FindDefine<TileDef>(baseTile.name);
if (baseTileDef != null)
{
activeTiles[baseTilemap] = (baseTile, baseTileDef);
if (baseTileDef.collider != Tile.ColliderType.None)
{
finalColliderType = baseTileDef.collider; // Base层的碰撞体优先级最低
}
}
}
}
// 根据最终碰撞体类型确定通行成本
if (finalColliderType != Tile.ColliderType.None)
{
finalTravelCost = 1f; // 有碰撞体时通行成本为1不可通过
}
else
{
// 如果没有碰撞体则取优先级最高的瓦片的tileCost作为最终通行成本。
// 优先级 Building > Plant > Base
TileDef highestPriorityDefWithCost = null;
if (activeTiles.ContainsKey(buildingTilemap))
{
highestPriorityDefWithCost = activeTiles[buildingTilemap].def;
}
else if (activeTiles.ContainsKey(plantTilemap))
{
highestPriorityDefWithCost = activeTiles[plantTilemap].def;
}
else if (activeTiles.ContainsKey(baseTilemap))
{
highestPriorityDefWithCost = activeTiles[baseTilemap].def;
}
if (highestPriorityDefWithCost != null)
{
finalTravelCost = highestPriorityDefWithCost.tileCost;
}
// 如果任何层都没有有效瓦片或DefineManager未实例化则保持 finalTravelCost 为默认值 0f
}
return new TileState(cellPosition, finalColliderType, finalTravelCost);
}
}
}