背景
写背包系统时点击物品格子,出现详情页,详情页的选项按钮根据物品种类、所属容器动态生成。这里生成选项按钮取决于的"键"有多个:物品种类、所属容器,执行的操作是生成几个按钮,写入名称、添加回调。按常规思路会写成2层判断,一个长度恐怖的函数。
改进
经过豆包的启发:
- 双键可以使用Tuple<>;
- switch可以用硬编码字典;
- 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); } } } }
};
}