You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity2D自动阴影生成器在CompositeCollider2D路径闭合TileMap失效问题求助

Unity2D闭合TileMap(CompositeCollider2D Path)阴影生成失效解决方案

我在制作Unity2D肉鸽游戏时,使用视频中的自动阴影生成器处理随机生成的TileMap,但对于通过CompositeCollider2D的Path形成的闭合TileMap,生成器无法正常工作,生成的阴影形状不符合预期:

生成的阴影形状(外部):
生成的阴影形状(外部)

生成的阴影形状(内部):
生成的阴影形状(内部)

以下是针对性的解决方法:

  • 统一CompositeCollider2D的路径方向
    CompositeCollider2D的路径方向(顺时针/逆时针)会直接影响轮廓工具的识别,闭合路径必须保证方向统一。可以通过脚本批量调整:

    using UnityEngine;
    
    public class ColliderPathFixer : MonoBehaviour
    {
        [ContextMenu("统一路径为顺时针方向")]
        public void StandardizePathDirection()
        {
            var composite = GetComponent<CompositeCollider2D>();
            if (composite == null) return;
    
            for (int i = 0; i < composite.pathCount; i++)
            {
                Vector2[] points = new Vector2[composite.GetPathPointCount(i)];
                composite.GetPath(i, points);
                // 判断路径是否为逆时针,是则反转
                if (CalculatePathWinding(points) < 0)
                {
                    System.Array.Reverse(points);
                    composite.SetPath(i, points);
                }
            }
        }
    
        private float CalculatePathWinding(Vector2[] points)
        {
            float windingSum = 0;
            for (int i = 0; i < points.Length; i++)
            {
                int nextIndex = (i + 1) % points.Length;
                windingSum += (points[nextIndex].x - points[i].x) * (points[nextIndex].y + points[i].y);
            }
            return windingSum;
        }
    }
    

    挂载该脚本到带CompositeCollider2D的对象上,右键执行菜单命令即可统一路径方向。

  • 修改阴影生成器的轮廓处理逻辑
    原生成器可能未区分闭合路径的外部轮廓与内部孔洞,需要调整代码:

    1. 获取CompositeCollider2D的所有路径后,通过路径的面积符号判断(负面积通常代表内部孔洞)
    2. 对外部轮廓生成阴影遮挡,对内部孔洞区域排除阴影,或者单独生成反向遮罩
  • 切换为TileMap单元格采样的阴影生成方式
    放弃基于Collider的轮廓提取,直接遍历TileMap的非空单元格生成阴影:

    • 遍历TileMap的所有单元格坐标,检查是否有Tile存在
    • 将存在Tile的区域标记为阴影遮挡,以此生成遮罩,这种方式适配所有随机生成的TileMap结构,不受Collider路径影响
  • 检查CompositeCollider2D基础设置
    确保组件的Geometry Type设为Outlines,所有子Collider都勾选了Used By Composite,同时调整Edge Radius避免路径出现异常顶点,防止轮廓识别出错

内容的提问来源于stack exchange,提问作者user19645687

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:24:21