Files
gold_dolphin/unity/Assets/camera/YSorter.cs
keshaohong 6cc4f1035d 添加mcp服务器
优化敌人AI,修改成双重规则寻敌
2026-06-28 23:08:20 +08:00

80 lines
2.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
using UnityEngine.Tilemaps;
/// <summary>
/// Y-Sort 排序器 —— 根据物体的Z坐标世界空间动态调整Sprite的sortingOrder。
/// 支持SpriteRenderer和TilemapRenderer。
/// </summary>
public class YSorter : MonoBehaviour
{
[Tooltip("基础排序值,用于区分不同类型的物体(如地面=0角色=1000")]
[SerializeField] private int baseSortingOrder = 0;
[Tooltip("Z坐标到sortingOrder的缩放系数值越大前后物体排序差异越明显")]
[SerializeField] private float scaleFactor = 100f;
[Tooltip("是否每帧更新(关闭则只在移动时更新,性能更好)")]
[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)
{
_tilemapRenderer = GetComponentInChildren<TilemapRenderer>();
if (_tilemapRenderer == null)
{
Debug.LogWarning($"YSorter: 物体 {gameObject.name} 没有找到SpriteRenderer或TilemapRenderer组件");
}
}
_lastPosition = transform.position;
}
private void LateUpdate()
{
// 如果没有任何渲染器,返回
if (_spriteRenderer == null && _tilemapRenderer == null) return;
// 如果设置了不是每帧更新,只在位置改变时更新
if (!updateEveryFrame && transform.position == _lastPosition)
return;
UpdateSortingOrder();
_lastPosition = transform.position;
}
private void UpdateSortingOrder()
{
// 使用物体中心transform.position的Z坐标作为排序依据
float sortZ = transform.position.z;
// Z值越大离相机越远sortingOrder越大
int sortingOrder = baseSortingOrder + Mathf.RoundToInt(sortZ * scaleFactor);
// 更新对应的渲染器
if (_spriteRenderer != null)
{
if (_spriteRenderer.sortingOrder != sortingOrder)
{
_spriteRenderer.sortingOrder = sortingOrder;
}
}
else if (_tilemapRenderer != null)
{
if (_tilemapRenderer.sortingOrder != sortingOrder)
{
_tilemapRenderer.sortingOrder = sortingOrder;
}
}
}
}