Unity - 可编写脚本的对象自动化

Unity - Scriptable object automation

我需要从 CSV 文件自动创建 X 数量的可编写脚本的对象,下图中是手动完成的示例,为此我需要的最小自动化量是 name/description/stat修饰符。

下面的 CSVtoSO class 成功创建了一个名称和描述作为字符串传入的 SO,调用的简单方法在基础 Inventoryitem class 中,如下所示,我遇到的问题在于我需要公开 class 统计数据,它是一个枚举,几乎将其转换为从 CSV

中读入的字符串

我已经将 statsEquippableItem Class 放在底部和这里,我想我需要一个等效的 setter 方法,但几乎传递一个字符串作为参数转换为统计数据 class我不认为这是可能的,希望我已经解释得足够好 post,任何提示都会很棒!

    public enum Stat
    {
        Mana,
        Stamina,
        Spirit,
        Intellect,
        Strength,
        Agility
    }

此方法存在于 InventoryItem

     public void SetDescription(string Description)

        {
            this.description = Description;
        }

using UnityEngine;
using UnityEditor;
using System.IO;

public class CSVToSO 
{
    private static string EquipCSVLocation = "/Inventories/TestItemCSV.csv"; 
    [MenuItem("Utilities/generate equipment")]
    public static void GenerateEquip()
    {
        string[] allLines = File.ReadAllLines(Application.dataPath + EquipCSVLocation); 

        foreach (string s in allLines)
        {
            string[] splitData = s.Split(',');

            

            StatsEquipableItem NewItem = ScriptableObject.CreateInstance<StatsEquipableItem>();
            NewItem.SetDisplayName(splitData[0]); 
            NewItem.SetDescription(splitData[1]); 

            AssetDatabase.CreateAsset(NewItem,$"Assets/Game/EquippableItems/Resources/Rare/{NewItem.GetDisplayName()}.asset"); 
        }
        AssetDatabase.SaveAssets(); 

    }
 
}

StatsEquipableItem Class

using System.Collections.Generic;
using UnityEngine;

      public class StatsEquipableItem : EquipableItem, IModifierProvider
    {
        [SerializeField]
        Modifier[] additiveModifiers;
        [SerializeField]
        Modifier[] percentageModifiers;

        [System.Serializable]
        struct Modifier
        {
            public Stat stat;
            public float value;
        }   

        public IEnumerable<float> GetAdditiveModifiers(Stat stat)
        {
            foreach (var modifier in additiveModifiers)
            {
                if (modifier.stat == stat)
                {
                    yield return modifier.value;
                }
            }
        }


        public IEnumerable<float> GetPercentageModifiers(Stat stat)
        {
            foreach (var modifier in percentageModifiers)
            {
                if (modifier.stat == stat)
                {
                    yield return modifier.value;
                }
            }
        }
    }

我相信您的问题是“如何将字符串转换为枚举值?”。如果是这样,枚举有 ParseTryParse 方法,它们接受一个字符串并尝试将其转换为枚举值。

if (System.Enum.TryParse(statStringValue, out Stat statValue))
{
    Debug.Log($"Converted {statStringValue} to Stat value {statValue}");
}
else
{
    Debug.Log($"Unable to convert {statStringValue} to Stat value");
}