Unity拖拽脚本:如何让filled在至少一个对象位置匹配时设为true?
问题出在LateUpdate的覆盖逻辑!看这里解决
嘿,你的问题核心很明确:现在的代码会因为LateUpdate里的循环覆盖掉Update设置的正确状态,导致多个物品时filled永远是false。
先拆解你的代码问题
看你当前的实现:
private void Update() { foreach (GameObject g in Updater.barred) { if (g.transform.position == this.transform.position) { this.filled = true; } } } private void LateUpdate() { foreach (GameObject g in Updater.barred) if (this.transform.position != g.transform.position) { this.filled = false; } }
- Update里的逻辑其实没问题:只要找到一个和槽位位置匹配的物品,就把
filled设为true。 - 但LateUpdate的逻辑完全搞反了:只要有一个物品的位置不匹配,就把
filled改成false。举个例子:如果数组里有2个物品,一个匹配、一个不匹配,Update把filled设为true,LateUpdate循环到第二个不匹配的物品时,直接把filled打回false,最终结果自然不对。
正确的实现方案
我们只需要每一帧先默认设filled为false,再检查是否有匹配的物品,有就改成true,这样就能保证“至少一个匹配就为true”的逻辑,而且不需要分开用Update和LateUpdate,放在一个函数里就行:
private void Update() { // 先默认标记为未填充 filled = false; foreach (GameObject g in Updater.barred) { // 检查位置是否匹配(注意后面的精度优化提示) if (g.transform.position == transform.position) { filled = true; // 找到第一个匹配的就跳出循环,省点性能 break; } } }
额外的实用优化
- 提前跳出循环:一旦找到第一个匹配的物品,用
break终止循环,不用遍历整个数组,提升运行效率。 - 处理浮点精度问题:直接用
==比较Vector3可能会因为微小的位置偏移(比如拖拽时的精度误差)导致判断错误,建议换成带容差的比较:// 用0.01作为容差值,可根据你的需求调整 if (Vector3.Distance(g.transform.position, transform.position) < 0.01f)
为什么单个物品时正常?
当数组里只有一个物品时,刚好“蒙对”了:
- 如果物品匹配:Update设为true,LateUpdate里循环到这个物品时,
!=不成立,所以不会修改filled,最终保持true。 - 如果物品不匹配:Update里不会修改
filled(假设之前是true),但LateUpdate会把它改成false,刚好符合预期。但多个物品时,只要有一个不匹配就会覆盖,问题就暴露了。
内容的提问来源于stack exchange,提问作者Zeelkra
相关产品推荐
相关产品推荐

