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

Unity 2021.3.15f中Canvas两种渲染模式下粒子显示方案咨询

在Unity 2021.3.15f中为不同渲染模式的Canvas添加粒子特效

一、ScreenSpace-Overlay模式下的实现

不需要将粒子的Transform转为RectTransform,也无需使用Camera.ScreenToWorldPosition方法,两种常用方案:

  • 将粒子系统设为Canvas的子物体,修改粒子系统的Render Mode为World Space;在粒子系统的Main模块中,设置Scale Mode为Scale With Screen Size,并填入你的游戏目标参考分辨率,粒子会自动适配屏幕缩放,且始终显示在UI层级之上。
  • 若需要粒子跟随特定UI元素,直接调整粒子系统的Transform位置(相对于Canvas的局部坐标,比如UI元素的位置是(200, 300, 0),粒子位置设为相同值即可)。

二、ScreenSpace-Camera模式下的实现

此模式下Canvas位于渲染相机前方固定距离处,可按需求选择方案:

方案1:粒子嵌入Canvas层级

将粒子系统设为Canvas的子物体,同样把粒子的Render Mode改为World Space,调整Transform位置到目标UI元素的坐标处。粒子会和Canvas处于同一平面,被相机同步拍摄,自然显示在UI层中,无需额外坐标转换。

方案2:世界空间粒子映射到UI位置

如果粒子原本在世界空间,需要将其显示到UI指定位置,可使用Camera.ScreenToWorldPosition计算Canvas平面上的坐标,示例代码:

// 替换为你的Canvas渲染相机和Canvas引用
Camera canvasCamera = GetComponent<Canvas>().worldCamera;
Canvas canvas = GetComponent<Canvas>();

// 以屏幕坐标为例,也可传入UI元素的屏幕坐标
Vector3 screenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, canvasCamera.nearClipPlane + canvas.planeDistance);
Vector3 targetWorldPos = canvasCamera.ScreenToWorldPoint(screenPosition);

// 将粒子移动到计算出的位置
particleSystem.transform.position = targetWorldPos;

关于RectTransform和坐标转换的疑问

  • 不需要将粒子的Transform转为RectTransform,除非你需要让粒子参与UI布局(比如使用LayoutGroup组件),普通Transform完全满足需求。
  • Camera.ScreenToWorldPosition仅在ScreenSpace-Camera模式下,需要将屏幕/世界坐标映射到Canvas平面时有用;ScreenSpace-Overlay模式下无需使用,直接用Canvas局部坐标即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:20:22