将枚举结果插入到一行代码 C# 中



我正在为我一直在做的游戏制作一个简单的颜色选择脚本。我的问题是我必须为我拥有的每个配色方案重复这三行:

Robot.GetComponent<SpriteRenderer>().sprite = cPicker.Salmon.Chenilles;
Robot.transform.Find("Middle").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Salmon.Cover;
Robot.transform.Find("Corps").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Salmon.Head;

我知道我应该不必重复自己,但是我不知道如何将我的枚举结果插入到这一行中:

Robot.GetComponent<SpriteRenderer>().sprite = cPicker.Slime.Chenilles; 

我想做这样的事情:

Robot.GetComponent((.sprite = cPicker.(颜色单位(。雪尼尔斯;

但显然它不是那样工作的。有谁知道我如何找到一种方法来做到这一点? 提前谢谢你。

using System.Collections.Generic;
using UnityEngine;
using System;
public enum ColorSelection { Slime, Salmon, Marine, Dusk }
[Serializable] public class ColorSet { public ColorSelection unit; }
public class InputManager : MonoBehaviour
{
public ColorPicker cPicker;
public GameObject Robot;
public ColorSet color;
public void Update()
{
switch (color.unit)
{
case ColorSelection.Slime:
Robot.GetComponent<SpriteRenderer>().sprite = cPicker.Slime.Chenilles;
Robot.transform.Find("Middle").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Slime.Cover;
Robot.transform.Find("Corps").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Slime.Head;
break;
case ColorSelection.Salmon:
Robot.GetComponent<SpriteRenderer>().sprite = cPicker.Salmon.Chenilles;
Robot.transform.Find("Middle").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Salmon.Cover;
Robot.transform.Find("Corps").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Salmon.Head;
break;
case ColorSelection.Marine:
Robot.GetComponent<SpriteRenderer>().sprite = cPicker.Marine.Chenilles;
Robot.transform.Find("Middle").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Marine.Cover;
Robot.transform.Find("Corps").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Marine.Head;
break;
case ColorSelection.Dusk:
Robot.GetComponent<SpriteRenderer>().sprite = cPicker.Dusk.Chenilles;
Robot.transform.Find("Middle").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Dusk.Cover;
Robot.transform.Find("Corps").gameObject.GetComponent<SpriteRenderer>().sprite = cPicker.Dusk.Head;
break;
}
}```

可以通过让 switch 表达式返回 then 键入具有带有值的对象以及设置精灵的代码来降低代码的复杂性。这有助于减少大量重复。我无法推断类型,所以我在这里ColorType调用它,请重命名为cPicker.Slime的电流类型:

using System.Collections.Generic;
using UnityEngine;
using System;
public enum ColorSelection { Slime, Salmon, Marine, Dusk }
[Serializable] public class ColorSet { public ColorSelection unit; }
public class InputManager : MonoBehaviour
{
public ColorPicker cPicker;
public GameObject Robot;
public ColorSet color;
private ColorType GetColorType(ColorSelection colorSelection, ColorPicker colorPicker)
{
switch (colorSelection)
{
case ColorSelection.Slime:
return colorPicker.Slime;
case ColorSelection.Salmon:
return colorPicker.Salmon;
case ColorSelection.Marine:
return colorPicker.Marine;
case ColorSelection.Dusk:
return colorPicker.Dusk;
default:
throw new ArgumentOutOfRangeException(nameof(colorSelection), colorSelection, null);
}
}
public void Update()
{
var colorType = GetColorType(color.unit, cPicker);
Robot.GetComponent<SpriteRenderer>().sprite = colorType.Chenilles;
Robot.transform.Find("Middle").gameObject.GetComponent<SpriteRenderer>().sprite = colorType.Cover;
Robot.transform.Find("Corps").gameObject.GetComponent<SpriteRenderer>().sprite = colorType.Head;
}
}

作为奖励,在 C# 8.0 中,这可以简化为 switch 表达式,使其更加简洁:

private ColorType GetColorType(ColorSelection colorSelection, ColorPicker colorPicker) =>
colorSelection switch
{
ColorSelection.Slime => colorPicker.Slime,
ColorSelection.Salmon => colorPicker.Salmon,
ColorSelection.Marine => colorPicker.Marine,
ColorSelection.Dusk => colorPicker.Dusk,
_ => throw new ArgumentOutOfRangeException(nameof(colorSelection), colorSelection, null)
};

最新更新