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;
}
}
}
}
我相信您的问题是“如何将字符串转换为枚举值?”。如果是这样,枚举有 Parse
和 TryParse
方法,它们接受一个字符串并尝试将其转换为枚举值。
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");
}
我需要从 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;
}
}
}
}
我相信您的问题是“如何将字符串转换为枚举值?”。如果是这样,枚举有 Parse
和 TryParse
方法,它们接受一个字符串并尝试将其转换为枚举值。
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");
}