Unity C#代码优化:无需大量if语句实现数组单bool为true
优化方案
先修复原代码中的明显错误
Start方法循环逻辑错误:原代码会把FaceTalkers数组的所有元素都赋值为同一个GetComponentInChildren结果,应该用GetComponentsInChildren一次性获取所有子组件:
private void Start() { foreach (var group in backgrounddotlingGroups) { group.FaceTalkers = GetComponentsInChildren<DotlingFaceTalker>(); } }
IsCheckingifTalking方法逻辑错误:原代码遍历数组索引j后判断j是否等于组长度(2/3/4),逻辑完全不成立,应该直接根据每个组的FaceTalkers长度统一处理,无需拆分GroupsOf2/3/4方法。
核心优化:提取通用逻辑,消除重复代码
将判断说话状态、设置状态的逻辑封装成通用方法,对所有组用同一套逻辑处理,彻底去掉大量嵌套if和重复方法:
using System.Collections.Generic; using UnityEngine; [System.Serializable] public class tableClass { public DotlingFaceTalker[] FaceTalkers; } public class WillTheyTalk : MonoBehaviour { [Header("List from Table class: ")] public List<tableClass> backgrounddotlingGroups; private void Start() { foreach (var group in backgrounddotlingGroups) { group.FaceTalkers = GetComponentsInChildren<DotlingFaceTalker>(); } } public void IsCheckingifTalking() { foreach (var group in backgrounddotlingGroups) { // 找到组内当前处于说话状态的对象 DotlingFaceTalker activeTalker = FindActiveTalker(group.FaceTalkers); // 遍历组内所有对象,仅保留活跃对象的状态为true,其余设为false foreach (var talker in group.FaceTalkers) { bool isActive = talker == activeTalker; SetTalkerState(talker, isActive); } } } // 判断单个对象是否处于说话状态 private bool IsTalkerActive(DotlingFaceTalker talker) { return talker.conversationRunning == talker._sentenceTimer.UpdateState() && talker.mouthOpen == talker._wordTimer.UpdateState(); } // 查找组内第一个活跃的说话对象 private DotlingFaceTalker FindActiveTalker(DotlingFaceTalker[] talkers) { foreach (var talker in talkers) { if (IsTalkerActive(talker)) { return talker; } } return null; // 无活跃对象时返回null,此时所有对象状态都会被设为false } // 设置对象的说话状态 private void SetTalkerState(DotlingFaceTalker talker, bool isActive) { talker.conversationRunning = isActive ? talker._sentenceTimer.UpdateState() : false; talker.mouthOpen = isActive ? talker._wordTimer.UpdateState() : false; } }
优化点说明
- 消除冗余代码:把原本分散在GroupsOf2/3/4中的判断和设置逻辑,封装成通用方法,不管组内有2、3还是4个对象,都能用同一套逻辑处理。
- 逻辑更清晰:先定位活跃对象,再统一遍历设置状态,彻底去掉大量嵌套if和switch分支。
- 易维护性提升:后续修改说话状态判断条件或状态设置逻辑时,只需修改对应通用方法即可,无需改动多处代码。
- 修复原逻辑漏洞:解决了Start方法赋值错误、IsCheckingifTalking中索引判断错误的问题。
内容的提问来源于stack exchange,提问作者WarlockGames
相关产品推荐
相关产品推荐

