switch和硬编码字典的等效性

背景

写背包系统时点击物品格子,出现详情页,详情页的选项按钮根据物品种类、所属容器动态生成。这里生成选项按钮取决于的"键"有多个:物品种类、所属容器,执行的操作是生成几个按钮,写入名称、添加回调。按常规思路会写成2层判断,一个长度恐怖的函数。

改进

经过豆包的启发:

  1. 双键可以使用Tuple<>;
  2. switch可以用硬编码字典;
  3. case后面的操作可以用委托存放;

变成了这样一个硬编码字典:虽然还是很长,但是比原来的写法(200多行)已经好多了,而且更整齐了。

cs 复制代码
public class ButtonConfig
{
    public string hint;
    public UnityAction callback;
}
Dictionary<(CellLocation, Props_Type), List<ButtonConfig>> buttonConfigs;
void InitOptionConfigs()
{
    buttonConfigs = new() {
        //场景内物品选项
        {(CellLocation.Scene,Props_Type.Gun),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ TakeGunFromGround(cellSelected);} } } },
        {(CellLocation.Scene, Props_Type.Mag),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ PickMagFromScene(cellSelected);} } }},
        {(CellLocation.Scene, Props_Type.Medicine),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ PickFromScene(cellSelected);} } }},
        {(CellLocation.Scene, Props_Type.Grenade),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ PickFromScene(cellSelected);} } }},
        //玩家背包内物品选项
        {(CellLocation.PlayerPack, Props_Type.Mag),
        new (){new ButtonConfig {hint="放下",callback=()=> { if (putIn){PutMagInCrate(cellSelected);
            }else{DropMag(cellSelected);} } } }},
        {(CellLocation.PlayerPack, Props_Type.Medicine),
        new (){new ButtonConfig {hint="放下",callback=PutItem},
            new ButtonConfig{hint="使用",callback=TryUseMedicine} } },
        {(CellLocation.PlayerPack, Props_Type.Grenade),
        new(){ new ButtonConfig {hint="放下",callback= PutItem },
        new ButtonConfig{hint="使用",callback=TryUseGrenade } } },
        //其他容器内物品选项
        {(CellLocation.OtherPack, Props_Type.Mag),
        new(){ new ButtonConfig {hint="拾取",callback=()=>{PickMagFromCrate(cellSelected);} }}},
        {(CellLocation.OtherPack, Props_Type.Medicine),
        new(){new ButtonConfig {hint="拾取",callback=()=>{PickFromCrate(cellSelected);} } } },
        {(CellLocation.OtherPack, Props_Type.Grenade),
        new(){new ButtonConfig {hint="拾取",callback=()=>{PickFromCrate(cellSelected);} } } },
        {(CellLocation.OtherPack, Props_Type.Gun),
        new(){ new ButtonConfig {hint="拾取",callback=()=> { TakeGunFromCrate(cellSelected); } } } }
    };
}
相关推荐
郝学胜-神的一滴9 小时前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal
宝桥南山13 小时前
GitHub Models - 尝试一下使用GitHub Models
microsoft·ai·微软·c#·github·.netcore
hixiong12316 小时前
C# OpenvinoSharp部署INSID3
开发语言·人工智能·ai·c#·openvinosharp
田鸡_17 小时前
Unity新输入系统(Input System)教学篇
unity·游戏引擎·游戏程序
EQ-雪梨蛋花汤17 小时前
【Unity笔记】Unity 音游模板与免费资源:高效构建节奏游戏开发全指南
笔记·unity·游戏引擎
星辰徐哥17 小时前
Unity基础:游戏对象的激活与隐藏:SetActive方法详解
游戏·unity·lucene
微莱羽墨17 小时前
零、0基础入门Unity 安装详细教程(2026最新版教程,安装Unity看这一篇就够了!)
unity·游戏引擎·unity安装
星辰徐哥17 小时前
Unity C#入门:变量的定义与访问权限(public/private)
unity·c#·lucene
leoufung17 小时前
LeetCode 30:Substring with Concatenation of All Words 题解(含 C 语言 uthash 实现)
c语言·leetcode·c#
hacker70717 小时前
Visual Studio安装教程(C#开发版)
ide·c#·visual studio