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

Unity开发:点击单个子物体触发所有种植提示框隐藏的实现方法

问题:点击提示框后无法隐藏所有可种植提示框

我正在制作一款小型游戏,其中一个机制是:点击“种花”按钮后,显示所有可种植位置的提示框;当点击其中任意一个提示框时,所有提示框全部隐藏。

场景结构:存在名为Soil的空GameObject,其下包含多个作为行的空GameObject,每个行物体下是单个提示框。

目前遇到的问题:无法实现点击单个提示框后让所有提示框消失的功能。

原挂载在Soil上的Visability脚本如下:

public class Visability : MonoBehaviour
{
    private Select selectScript;
    private Select soilSelectScript;

    public bool isVisible = false;

    //I thought making an array of them all was a good idea, but I'm not sure how what to do with it
    public GameObject[] soilChildren;

    void Start()
    {
        selectScript = GameObject.Find("Slot 1").GetComponent<Select>();
        soilSelectScript = GameObject.Find("Hoe Select 2").GetComponent<Select>();
    }

    void Update()
    {
        // If the "wasClicked" bool = false, make all the squares invisible.
        if (selectScript.wasClicked == false)
        {
            isVisible = false;
        }

        // If "wasClicked" = true, make everything visible.
        else if (selectScript.wasClicked == true)
        {
            isVisible = true;

            if(soilSelectScript.wasClicked == true)
            {
                isVisible = false;
            }
        }

        if (isVisible == true)
        {
            OnTriggerEnter();
        }
        else if (isVisible == false)
        {
            OnTriggerExit();
        }
    }

    [SerializeField]
    LayerMask onMask;

    [SerializeField]
    LayerMask offMask;

    void OnTriggerEnter()
    {
        Camera.main.cullingMask = onMask;
    }

    void OnTriggerExit()
    {
        Camera.main.cullingMask = offMask;
    }
}

所有提示框上都挂载了Select脚本,该脚本仅用于检测鼠标点击并设置wasClicked布尔值为true。


解决方案

直接放弃相机遮罩的方式,改为通过SetActive控制提示框显示,同时让提示框点击时通知管理脚本统一隐藏所有提示框,是最简单可靠的实现方式。

修改后的Visibility脚本(挂载在Soil上)

using UnityEngine;

public class Visibility : MonoBehaviour
{
    private Select plantButtonSelect;
    private GameObject[] allHintBoxes;
    private bool isVisible = false;

    void Start()
    {
        // 获取种花按钮的Select组件
        plantButtonSelect = GameObject.Find("Slot 1").GetComponent<Select>();
        // 递归获取Soil下所有带碰撞体的提示框(根据你的实际情况调整判断条件)
        allHintBoxes = GetComponentsInChildren<GameObject>(true);
        // 初始隐藏所有提示框
        SetAllHintBoxesActive(false);
    }

    void Update()
    {
        if (plantButtonSelect.wasClicked)
        {
            if (!isVisible)
            {
                SetAllHintBoxesActive(true);
                isVisible = true;
                plantButtonSelect.wasClicked = false; // 重置按钮状态避免重复触发
            }
        }
        else if (isVisible)
        {
            SetAllHintBoxesActive(false);
            isVisible = false;
        }
    }

    // 统一设置所有提示框的激活状态
    public void SetAllHintBoxesActive(bool active)
    {
        foreach (var box in allHintBoxes)
        {
            // 这里用碰撞体判断是否是提示框,你也可以换成标签判断:box.CompareTag("HintBox")
            if (box.GetComponent<Collider>() != null)
            {
                box.SetActive(active);
            }
        }
    }

    // 供提示框的Select脚本调用,隐藏所有提示框
    public void HideAllHintBoxes()
    {
        isVisible = false;
        SetAllHintBoxesActive(false);
        plantButtonSelect.wasClicked = false;
    }
}

修改后的Select脚本(挂载在每个提示框上)

using UnityEngine;

public class Select : MonoBehaviour
{
    public bool wasClicked = false;
    private Visibility visibility;

    void Start()
    {
        // 获取Soil上的Visibility管理组件
        visibility = GameObject.Find("Soil").GetComponent<Visibility>();
    }

    void OnMouseDown()
    {
        wasClicked = true;
        // 点击时通知管理脚本隐藏所有提示框
        visibility.HideAllHintBoxes();
    }
}

注意事项

  • 确保所有提示框都添加了碰撞体组件(比如BoxCollider),否则OnMouseDown无法检测到点击。
  • 如果提示框有统一的标签(比如设置为HintBox),可以把SetAllHintBoxesActive里的判断条件改成box.CompareTag("HintBox"),这样筛选更准确。
  • 原代码中的soilSelectScript(Hoe Select 2)如果需要关联功能,可以在HideAllHintBoxes或者Update里补充逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:55:06