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

Unity 2D:触发碰撞时显示平台组的实现问题

问题分析与解决方案

嘿,作为Unity新手遇到这种问题太正常了,咱们一步步拆解问题根源,再搞定它:

核心问题:脚本挂载位置错了!

你把AppearTrigger脚本挂在了StarPlatforms物体上,但Unity有个关键规则:当一个GameObject处于非激活状态(Inspector里没勾选)时,它上面挂载的所有脚本都不会运行。这就导致:

  1. 如果你一开始把StarPlatforms设为隐藏,脚本的Start()方法根本不会执行,StarPlatforms.SetActive(true)等于白写;
  2. 就算你手动激活了它,用SetActive(false)关掉后,脚本的OnTriggerStay2D()也会停止工作,再也检测不到玩家碰撞了。

正确解决步骤

  1. 重新挂载脚本:新建一个空GameObject(比如命名为AppearTriggerZone),把它放在你想要触发平台显示的区域,然后把AppearTrigger脚本挂在这个空物体上(这个空物体要始终保持激活状态)。
  2. 配置触发器:给这个空物体加一个Collider2D(比如Box Collider 2D),勾选Is Trigger选项,调整碰撞框大小到你想要的触发范围。
  3. 修改脚本逻辑:咱们把逻辑改成玩家进入触发器时显示平台,同时优化代码(用OnTriggerEnter2D代替OnTriggerStay2D,只触发一次更高效):
public class AppearTrigger : MonoBehaviour 
{ 
    private GameObject _starPlatforms; 

    void Start() 
    {
        // 找到目标平台物体,确保它初始是隐藏状态(Inspector里取消勾选)
        _starPlatforms = GameObject.Find("StarPlatforms");
        // 可选:强制设置初始隐藏,避免忘改Inspector
        _starPlatforms.SetActive(false);
    } 

    void OnTriggerEnter2D(Collider2D col) 
    {
        // 用CompareTag比直接访问tag更高效,还能避免拼写错误提示
        if (col.CompareTag("Player")) 
        {
            // 激活平台,显示所有子物体
            _starPlatforms.SetActive(true);
            // 可选:如果只需要触发一次,就把触发器关掉,防止重复触发
            GetComponent<Collider2D>().enabled = false;
        }
    } 
}

额外注意事项

  • 玩家物体必须带有Rigidbody2D组件(2D触发器检测要求碰撞双方至少一个带刚体,别设为Kinematic除非你开了对应检测选项);
  • 玩家物体的标签一定要是**"Player"**(Unity标签区分大小写,别拼错);
  • 确保StarPlatforms的子物体初始状态都是激活的(如果子物体自己是隐藏的,父物体激活了也不会显示)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:57:02