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

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

优化点说明

  1. 消除冗余代码:把原本分散在GroupsOf2/3/4中的判断和设置逻辑,封装成通用方法,不管组内有2、3还是4个对象,都能用同一套逻辑处理。
  2. 逻辑更清晰:先定位活跃对象,再统一遍历设置状态,彻底去掉大量嵌套if和switch分支。
  3. 易维护性提升:后续修改说话状态判断条件或状态设置逻辑时,只需修改对应通用方法即可,无需改动多处代码。
  4. 修复原逻辑漏洞:解决了Start方法赋值错误、IsCheckingifTalking中索引判断错误的问题。

内容的提问来源于stack exchange,提问作者WarlockGames

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:55:30