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
相关产品推荐
相关产品推荐

