Unity中如何在单个if语句中使用多个布尔条件?
问题解决与代码优化
核心错误修复
你的OpenDoor方法里的if语句存在两个关键错误:
- 使用**赋值运算符
=**替代了判断逻辑:trigger_1 = true是将true赋值给变量,而非判断变量是否为true。布尔变量可直接作为条件,无需额外写== true。 - 使用逗号运算符导致逻辑失效:C#中逗号会依次执行表达式,最终仅返回最后一个表达式的结果,这使得你的条件实际只判断
trigger_2 = true的结果,完全忽略了trigger_1的状态。
正确的条件写法应使用逻辑与运算符&&,表示两个条件必须同时满足:
public void OpenDoor() { if (trigger_1 && trigger_2) { UsedButton(); } }
后续扩展更多trigger时,直接用&&拼接即可:
if (trigger_1 && trigger_2 && trigger_3 && trigger_4 && trigger_5 && trigger_6)
代码优化建议
1. 用数据结构消除重复代码
当前每个按钮和巨石都是单独变量,后续扩展会非常繁琐。可以用自定义结构体+列表来管理配对,大幅简化代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TriggerAllButtons : UsedOnceFieldButton { // 定义配对结构体,存储标签与触发状态 [System.Serializable] public class BoulderButtonPair { public string buttonTag; public string boulderTag; public bool isTriggered; } // 在Unity编辑器中直接添加/编辑配对 public List<BoulderButtonPair> boulderButtonPairs = new List<BoulderButtonPair>(); public void OnTriggerEnter(Collider other) { foreach (var pair in boulderButtonPairs) { // 修正原逻辑漏洞:一个物体不能同时有两个标签,需根据挂载对象调整 // 例:脚本挂在按钮上时,判断碰撞的是对应巨石 if (other.CompareTag(pair.boulderTag)) { pair.isTriggered = true; } } } public void OpenDoor() { bool allTriggered = true; foreach (var pair in boulderButtonPairs) { if (!pair.isTriggered) { allTriggered = false; break; } } if (allTriggered) { UsedButton(); } } }
2. 修复OnTriggerEnter的逻辑漏洞
原代码中other.CompareTag(button_1) && other.CompareTag(boulder_1)不成立,因为Unity中一个物体只能有一个标签。需根据脚本挂载对象调整逻辑:
- 若脚本挂在按钮上:判断碰撞进来的是对应巨石,即
other.CompareTag(pair.boulderTag) - 若脚本挂在巨石上:判断碰撞的是对应按钮,即
other.CompareTag(pair.buttonTag)
3. 用编辑器配置替代硬编码
通过结构体列表,你可以直接在Unity Inspector面板中添加按钮与巨石的配对,无需修改代码,扩展性和维护性更强。
内容的提问来源于stack exchange,提问作者Kenny Yuhan
相关产品推荐
相关产品推荐

