简体   繁体   English

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

[英]Inserting an enum result into a line of code C#

I'm making a simple color picking script for a game that I've been working on.我正在为我一直在开发的游戏制作一个简单的颜色选择脚本。 My problem is that I have to repeat these three lines for every color scheme that I have:我的问题是我必须为我拥有的每个配色方案重复这三行:

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;

I know that I should be able to not have to repeat myself, but I can't figure out how to insert my enum result into this line:我知道我应该不必重复自己,但我不知道如何将我的枚举结果插入到这一行中:

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

I'd like to do something like this:我想做这样的事情:

Robot.GetComponent().sprite = cPicker.(color.unit).Chenilles; Robot.GetComponent().sprite = cPicker.(color.unit).Chenilles;

But obviously it doesn't work like that.但显然它不是那样工作的。 Does anyone know how I could find a way to do this?有谁知道我怎么能找到办法做到这一点? Thank you in advance.先感谢您。

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;

        }

    }```

You can reduce the complexity of the code by having the switch expression return then type that has the object with the values on it, and the code that sets the sprites.您可以通过让 switch 表达式返回然后键入具有其上的值的对象以及设置精灵的代码来降低代码的复杂性。 This helps reduce a good amount of duplication.这有助于减少大量的重复。 I could not infer the type, so I've called it ColorType here, please rename to the type current of cPicker.Slime :我无法推断类型,所以我在这里称它为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;
    }
}

as a bonus, in C# 8.0 this can be reduced to a switch expression, making it even more concise:作为奖励,在 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)
    };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM