添加mcp服务器

优化敌人AI,修改成双重规则寻敌
This commit is contained in:
2026-06-28 23:08:20 +08:00
parent 3da879f58d
commit 6cc4f1035d
9 changed files with 473 additions and 116 deletions

View File

@@ -1,20 +1,9 @@
using UnityEngine;
using UnityEngine.Tilemaps;
/// <summary>
/// Y-Sort 排序器 —— 根据物体的Z坐标世界空间动态调整Sprite的sortingOrder。
///
/// 原理:
/// 在2.5D等距视角游戏中摄像机从斜上方45°俯视Z坐标代表"前后"关系。
/// Z值越大离相机越远=越靠前sortingOrder越大会遮挡Z值小的物体。
///
/// 用法:
/// 1. 挂到所有需要参与排序的Sprite物体上玩家、敌人、树木、石头等
/// 2. 设置 baseSortingOrder 区分不同类型的物体(如地面=0角色=1000
/// 3. 确保所有参与排序的Sprite在同一个Sorting Layer上
///
/// 注意:
/// - 本脚本假设摄像机从斜上方俯视Z轴代表前后
/// - 所有参与排序的物体必须在同一个Sorting Layer
/// 支持SpriteRenderer和TilemapRenderer。
/// </summary>
public class YSorter : MonoBehaviour
{
@@ -28,21 +17,32 @@ public class YSorter : MonoBehaviour
[SerializeField] private bool updateEveryFrame = true;
private SpriteRenderer _spriteRenderer;
private TilemapRenderer _tilemapRenderer;
private Vector3 _lastPosition;
private void Awake()
{
// 尝试获取SpriteRenderer
_spriteRenderer = GetComponentInChildren<SpriteRenderer>();
// 如果没有SpriteRenderer尝试获取TilemapRenderer
if (_spriteRenderer == null)
{
Debug.LogWarning($"YSorter: 物体 {gameObject.name} 没有找到SpriteRenderer组件");
_tilemapRenderer = GetComponentInChildren<TilemapRenderer>();
if (_tilemapRenderer == null)
{
Debug.LogWarning($"YSorter: 物体 {gameObject.name} 没有找到SpriteRenderer或TilemapRenderer组件");
}
}
_lastPosition = transform.position;
}
private void LateUpdate()
{
if (_spriteRenderer == null) return;
// 如果没有任何渲染器,返回
if (_spriteRenderer == null && _tilemapRenderer == null) return;
// 如果设置了不是每帧更新,只在位置改变时更新
if (!updateEveryFrame && transform.position == _lastPosition)
@@ -55,15 +55,25 @@ public class YSorter : MonoBehaviour
private void UpdateSortingOrder()
{
// 使用物体中心transform.position的Z坐标作为排序依据
// 这样物品中心在地面上方时,会正确遮挡地面
float sortZ = transform.position.z;
// Z值越大离相机越远sortingOrder越大
int sortingOrder = baseSortingOrder + Mathf.RoundToInt(sortZ * scaleFactor);
if (_spriteRenderer.sortingOrder != sortingOrder)
// 更新对应的渲染器
if (_spriteRenderer != null)
{
_spriteRenderer.sortingOrder = sortingOrder;
if (_spriteRenderer.sortingOrder != sortingOrder)
{
_spriteRenderer.sortingOrder = sortingOrder;
}
}
else if (_tilemapRenderer != null)
{
if (_tilemapRenderer.sortingOrder != sortingOrder)
{
_tilemapRenderer.sortingOrder = sortingOrder;
}
}
}
}