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

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;
        }
    }
}

额外的实用优化

  1. 提前跳出循环:一旦找到第一个匹配的物品,用break终止循环,不用遍历整个数组,提升运行效率。
  2. 处理浮点精度问题:直接用==比较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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:17:38