Question by
bbrooks987 · Jun 28, 2020 at 03:04 PM ·
prefabsparse
Parsing a .csv into a .prefab
How do I properly parse data to a prefab created from code, here is what I'm working with
using System; using System.IO; using System.Collections; using UnityEngine; using UnityEditor;
public static class JobParser {
[MenuItem("Pre Production/ParseJobs")]
public static void Parse()
{
CreateDirectories();
ParseStartingStats();
ParseGrowthStats();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
static void CreateDirectories()
{
if (!AssetDatabase.IsValidFolder("Assets/Resources/Jobs"))
AssetDatabase.CreateFolder("Assests/Resources", "Jobs");
}
static void ParseStartingStats()
{
string readPath = string.Format("{0}/Settings/ClassStartingStats.csv", Application.dataPath);
string[] readText = File.ReadAllLines(readPath);
for (int i = 1; i < readText.Length; ++i)
PartsStartingStats(readText[i]);
}
static void PartsStartingStats(string line)
{
string[] elements = line.Split(',');
GameObject obj = GetOrCreate(elements[0]);
Job job = obj.GetComponent<Job>();
for (int i = 1; i < Job.statOrder.Length + 1; ++i)
job.baseStats[i - 1] = Convert.ToInt32(elements[i]);
StatModifierFeature move = GetFeature(obj, StatTypes.SPD);
move.amount = Convert.ToInt32(elements[9]);
StatModifierFeature jump = GetFeature(obj, StatTypes.JMP);
jump.amount = Convert.ToInt32(elements[10]);
}
static void ParseGrowthStats()
{
string readPath = string.Format("{0}/Settings/ClassGrowthStats.csv", Application.dataPath);
string[] readText = File.ReadAllLines(readPath);
for (int i = 1; i < readText.Length; ++i)
ParseGrowthStats(readText[i]);
}
static void ParseGrowthStats(string line)
{
string[] elements = line.Split(',');
GameObject obj = GetOrCreate(elements[0]);
Job job = obj.GetComponent<Job>();
for (int i = 1; i < elements.Length; ++i)
job.growStats[i - 1] = Convert.ToSingle(elements[i]);
}
static StatModifierFeature GetFeature(GameObject obj,StatTypes type)
{
StatModifierFeature[] smf = obj.GetComponents<StatModifierFeature>();
for (int i = 0; i < smf.Length; ++i)
{
if (smf[i].type == type)
return smf[i];
}
StatModifierFeature feature = obj.AddComponent<StatModifierFeature>();
feature.type = type;
return feature;
}
static GameObject GetOrCreate(string jobName)
{
string fullPath = string.Format("Assets/Resources/Jobs/{0}.prefab", jobName);
GameObject obj = AssetDatabase.LoadAssetAtPath<GameObject>(fullPath);
if (obj == null)
obj = Create(fullPath);
return obj;
}
static GameObject Create(string fullPath)
{
GameObject instance = (GameObject)AssetDatabase.LoadMainAssetAtPath(fullPath);
instance.AddComponent<Job>();
GameObject instanceRoot = (GameObject)PrefabUtility.InstantiatePrefab(instance);
GameObject pvariant = PrefabUtility.SaveAsPrefabAsset(instance, fullPath);
GameObject.DestroyImmediate(instanceRoot);
return pvariant;
}
}
Comment
Your answer
Follow this Question
Related Questions
Cant parse all elements of XML to C#? 0 Answers
GameObject Cannot select model after breaking prefab link. 0 Answers
Use Grid Layout to set GameObjects position 0 Answers
Is there a quick way to convert a sprite sheet of sprites to a bunch of prefabs? 0 Answers
How to create several prefabs witch do not touch each other 0 Answers