(client) feat:实现热重载,实现多维度,实现武器,实现掉落物,实现状态UI,实现攻击AI (#44)
Co-authored-by: zzdxxz <2079238449@qq.com> Co-committed-by: zzdxxz <2079238449@qq.com>
This commit is contained in:
90
Client/Assets/Scripts/Map/Dimension.cs
Normal file
90
Client/Assets/Scripts/Map/Dimension.cs
Normal file
@ -0,0 +1,90 @@
|
||||
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;
|
||||
// 3. 注册此维度到 Program
|
||||
if (Program.Instance != null) // 检查单例是否仍然存在
|
||||
{
|
||||
Program.Instance.RegisterDimension(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError(
|
||||
"[Dimension] Program.Instance is null during Dimension Awake. Cannot register dimension.", this);
|
||||
}
|
||||
|
||||
|
||||
// 5. 处理 defaultOpen 逻辑,设置Program的焦点维度
|
||||
// 确保在自身注册到 Program 之后再设置焦点,这样 Program 内部才能找到它
|
||||
if (defaultOpen && Program.Instance != null)
|
||||
{
|
||||
Program.Instance.SetFocusedDimension(_dimensionId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
var size = mapGenerator.baseMap.GetSize();
|
||||
cameraPosition = new Vector3(size.x / 2f, size.y / 2f, -10)+transform.position;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
// 当 Dimension 对象被销毁时(例如,场景卸载),从 Program 和 EntityManage 注销
|
||||
if (Program.Instance != null) // 检查单例是否仍然存在
|
||||
{
|
||||
Program.Instance.UnregisterDimension(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
3
Client/Assets/Scripts/Map/Dimension.cs.meta
Normal file
3
Client/Assets/Scripts/Map/Dimension.cs.meta
Normal file
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1cf2b22a0f934c5b852b5cdd588d82fa
|
||||
timeCreated: 1756014704
|
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Data;
|
||||
@ -9,23 +10,27 @@ namespace Map
|
||||
{
|
||||
public class DoubleMap : MonoBehaviour
|
||||
{
|
||||
public List<List<int>> mapData = new List<List<int>>();
|
||||
public List<List<int>> mapData = new();
|
||||
public Tilemap textureLevel;
|
||||
public Vector2Int dataOffset = Vector2Int.zero; // 数据起始点偏移变量
|
||||
// public Vector2Int dataOffset = Vector2Int.zero; // 数据起始点偏移变量 - 已删除
|
||||
|
||||
|
||||
// 初始化地图数据大小
|
||||
public void InitializeData(int width, int height, int defaultValue = 0)
|
||||
{
|
||||
mapData.Clear();
|
||||
for (int x = 0; x < width; x++)
|
||||
for (var x = 0; x < width; x++)
|
||||
{
|
||||
List<int> column = new List<int>();
|
||||
for (int y = 0; y < height; y++)
|
||||
var column = new List<int>();
|
||||
for (var y = 0; y < height; y++)
|
||||
{
|
||||
column.Add(defaultValue);
|
||||
}
|
||||
|
||||
mapData.Add(column);
|
||||
}
|
||||
}
|
||||
|
||||
// 设置指定数据坐标的瓦片值并刷新相关瓦片
|
||||
public void SetTile(int dataX, int dataY, int value)
|
||||
{
|
||||
@ -59,7 +64,7 @@ namespace Map
|
||||
public void RefreshTile(int dataX, int dataY)
|
||||
{
|
||||
// 计算该数据点影响的四个瓦片位置(该点作为四个角)
|
||||
Vector2Int[] affectedTiles = new Vector2Int[]
|
||||
var affectedTiles = new Vector2Int[]
|
||||
{
|
||||
new Vector2Int(dataX - 1, dataY - 1), // 作为右下角
|
||||
new Vector2Int(dataX - 1, dataY), // 作为右上角
|
||||
@ -79,15 +84,15 @@ namespace Map
|
||||
if (mapData.Count == 0 || mapData[0].Count == 0) return;
|
||||
|
||||
// 计算瓦片地图的有效范围(考虑偏移)
|
||||
int startX = dataOffset.x;
|
||||
int startY = dataOffset.y;
|
||||
int endX = startX + mapData.Count - 1;
|
||||
int endY = startY + mapData[0].Count - 1;
|
||||
var startX = 0; // dataOffset.x 已删除
|
||||
var startY = 0; // dataOffset.y 已删除
|
||||
var endX = startX + mapData.Count - 1;
|
||||
var endY = startY + mapData[0].Count - 1;
|
||||
|
||||
// 遍历所有瓦片位置
|
||||
for (int x = startX; x <= endX; x++)
|
||||
for (var x = startX; x <= endX; x++)
|
||||
{
|
||||
for (int y = startY; y <= endY; y++)
|
||||
for (var y = startY; y <= endY; y++)
|
||||
{
|
||||
UpdateTileAtTilemapPosition(x, y);
|
||||
}
|
||||
@ -98,30 +103,30 @@ namespace Map
|
||||
private void UpdateTileAtTilemapPosition(int tileX, int tileY)
|
||||
{
|
||||
// 计算对应的数据坐标(考虑偏移)
|
||||
int dataX = tileX - dataOffset.x;
|
||||
int dataY = tileY - dataOffset.y;
|
||||
var dataX = tileX; // - dataOffset.x 已删除
|
||||
var dataY = tileY; // - dataOffset.y 已删除
|
||||
|
||||
// 获取四个角的数据坐标
|
||||
int topLeftX = dataX;
|
||||
int topLeftY = dataY;
|
||||
int topRightX = dataX + 1;
|
||||
int topRightY = dataY;
|
||||
int bottomLeftX = dataX;
|
||||
int bottomLeftY = dataY + 1;
|
||||
int bottomRightX = dataX + 1;
|
||||
int bottomRightY = dataY + 1;
|
||||
var topLeftX = dataX;
|
||||
var topLeftY = dataY + 1;
|
||||
var topRightX = dataX + 1;
|
||||
var topRightY = dataY + 1;
|
||||
var bottomLeftX = dataX;
|
||||
var bottomLeftY = dataY;
|
||||
var bottomRightX = dataX + 1;
|
||||
var bottomRightY = dataY;
|
||||
|
||||
// 检查边界并获取值
|
||||
int topLeft = GetDataValue(topLeftX, topLeftY);
|
||||
int topRight = GetDataValue(topRightX, topRightY);
|
||||
int bottomLeft = GetDataValue(bottomLeftX, bottomLeftY);
|
||||
int bottomRight = GetDataValue(bottomRightX, bottomRightY);
|
||||
var topLeft = GetDataValue(topLeftX, topLeftY);
|
||||
var topRight = GetDataValue(topRightX, topRightY);
|
||||
var bottomLeft = GetDataValue(bottomLeftX, bottomLeftY);
|
||||
var bottomRight = GetDataValue(bottomRightX, bottomRightY);
|
||||
|
||||
// 获取对应的瓦片
|
||||
TileBase tile = GetTileFromManager(topLeft, topRight, bottomLeft, bottomRight);
|
||||
var tile = GetTileFromManager(topLeft, topRight, bottomLeft, bottomRight);
|
||||
|
||||
// 设置到瓦片地图
|
||||
Vector3Int position = new Vector3Int(tileX, tileY, 0);
|
||||
var position = new Vector3Int(tileX, tileY, 0);
|
||||
textureLevel.SetTile(position, tile);
|
||||
}
|
||||
|
||||
@ -136,7 +141,7 @@ namespace Map
|
||||
// 从TileManager获取对应瓦片
|
||||
private TileBase GetTileFromManager(int topLeft, int topRight, int bottomLeft, int bottomRight)
|
||||
{
|
||||
TileManager manager = TileManager.Instance;
|
||||
var manager = TileManager.Instance;
|
||||
if (manager == null)
|
||||
{
|
||||
Debug.LogError("TileManager实例未找到");
|
||||
@ -145,13 +150,13 @@ namespace Map
|
||||
|
||||
// 尝试获取组合键对应的瓦片
|
||||
var key = (topLeft, topRight, bottomLeft, bottomRight);
|
||||
if (manager.tileToTileBaseMapping.TryGetValue(key, out TileBase tile))
|
||||
if (manager.tileToTileBaseMapping.TryGetValue(key, out var tile))
|
||||
{
|
||||
return tile;
|
||||
}
|
||||
|
||||
// 备用方案:尝试获取默认瓦片
|
||||
if (manager.tileBaseMapping.TryGetValue("Default", out TileBase defaultTile))
|
||||
if (manager.tileBaseMapping.TryGetValue("Default", out var defaultTile))
|
||||
{
|
||||
return defaultTile;
|
||||
}
|
||||
@ -159,5 +164,16 @@ namespace Map
|
||||
Debug.LogError($"未找到对应瓦片: {key}");
|
||||
return null;
|
||||
}
|
||||
|
||||
public Vector2Int GetSize()
|
||||
{
|
||||
if (!mapData.Any() || mapData[0].Count == 0)
|
||||
{
|
||||
return new Vector2Int(0, 0);
|
||||
}
|
||||
|
||||
return new Vector2Int(mapData.Count, mapData[0].Count);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -4,37 +4,31 @@ using UnityEngine.Tilemaps;
|
||||
|
||||
namespace Map
|
||||
{
|
||||
public class MapGenerator:Utils.MonoSingleton<MapGenerator>
|
||||
public class MapGenerator:MonoBehaviour
|
||||
{
|
||||
public DoubleMap baseLevel;
|
||||
public Tilemap buildLevel;
|
||||
public Tilemap plantLevel;
|
||||
public DoubleMap baseMap;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
Managers.DefineManager.Instance.Init();
|
||||
Managers.PackagesImageManager.Instance.Init();
|
||||
Managers.TileManager.Instance.Init();
|
||||
|
||||
var size = 100;
|
||||
baseMap.InitializeData(size, size);
|
||||
for (var i = 0; i < size; i++)
|
||||
{
|
||||
for (var j = 0; j < size; j++)
|
||||
{
|
||||
var dx = i - size / 2;
|
||||
var dy = j - size / 2;
|
||||
baseMap.mapData[i][j] = (int)(Math.Sqrt(dx * dx + dy * dy) / 5) & 1;
|
||||
}
|
||||
}
|
||||
|
||||
baseMap.RefreshAllTiles();
|
||||
CameraControl.CameraControl.Instance.SetPosition(new Vector3(size * 0.5f, size * 0.5f, -10));
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
var perline= Utils.PerlinNoise.Instance;
|
||||
int size = 100;
|
||||
baseLevel.InitializeData(size, size);
|
||||
baseLevel.RefreshAllTiles();
|
||||
}
|
||||
|
||||
public bool CanPassThrough(int x, int y)
|
||||
{
|
||||
return GetTilePassCost(x, y) < 1;
|
||||
}
|
||||
public float GetTilePassCost(int x, int y)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
public float GetTileBulletCover(int x, int y)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected override void OnStart()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
24
Client/Assets/Scripts/Map/MiniMap.cs
Normal file
24
Client/Assets/Scripts/Map/MiniMap.cs
Normal file
@ -0,0 +1,24 @@
|
||||
using Base;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Map
|
||||
{
|
||||
public class MiniMap : MonoBehaviour,ITickUI
|
||||
{
|
||||
public Image background;
|
||||
public RawImage texture;
|
||||
private bool _show = true;
|
||||
|
||||
|
||||
public void TickUI()
|
||||
{
|
||||
if (_show != Setting.Instance.CurrentSettings.showMiniMap)
|
||||
{
|
||||
_show = Setting.Instance.CurrentSettings.showMiniMap;
|
||||
texture.gameObject.SetActive(_show);
|
||||
background.enabled = _show;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
3
Client/Assets/Scripts/Map/MiniMap.cs.meta
Normal file
3
Client/Assets/Scripts/Map/MiniMap.cs.meta
Normal file
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: feb227be5c204aaea27e09f754dc05b8
|
||||
timeCreated: 1756172116
|
Reference in New Issue
Block a user