2016-07-20 6 views
-1

zu bevölkern Ich mache ein Spiel in Einheit, die sich hauptsächlich um Crafting dreht. Elemente sind nur enum-Werte. Ich habe es so gemacht, dass es zur Laufzeit alle Rezepte aus einer CSV-Datei lädt. Ich hatte gehofft, es so zu machen, dass das Spiel hauptsächlich durch Aktualisieren der CSV-Datei und Hinzufügen von Bilddateien mit dem passenden Namen zum Bilderordner entwickelt werden kann, weil das sehr praktisch ist und die Tabellenkalkulation für meine Augen einfach ist.Faulste Art, Enum aus der Tabelle C#

Ich würde es vorziehen, wenn ich nicht jedes Mal, wenn ich eine CSV-Datei aus meiner Tabelle exportiere, Werte manuell aus der Tabelle in meine Enum-Definition kopieren oder einfügen musste.

Beachten Sie, dass die Enum mindestens teilweise fest codiert sein muss, da es mindestens einige fest codierte Verweise auf bestimmte Enum-Werte gibt.

Jemand erwähnte Kompilierzeitcode, aber ich kompiliere nie in Visual Studio, weil es ein Unity-Projekt ist und in der Tat, die Art, wie das Projekt eingerichtet wird, wenn ich versehentlich aus Visual Studio kompilieren, bricht das Unity-Projekt für einige Grund, bis ich alle kompilierten Dateien gelöscht habe.

Was wäre der beste Weg, um fortzufahren?

+0

Ich dachte, vielleicht auch nur eine externe ausführbar machen, die eine CS-Datei enthält, die Enum schreibt. Oder vielleicht ein Skript, das ausgeführt wird, wenn Unity das kompiliert, schreibt eine .CS-Datei. –

Antwort

0

Sie nähern sich dem Problem aus einer falschen Richtung. Die Verwendung eines enum zum Definieren der Elemente ist nicht der beste Weg.

Ich würde nicht empfehlen, eine csv-Datei zu verwenden, um das Rezept zu speichern. Da wäre es schwierig, Rezepte zu verwalten, die mehrere Materialien zusammensetzen. Es kann jedoch immer noch gemacht werden, indem die Daten normalizing.

Im Idealfall sollten Sie Ihre Datenstruktur sieht wie folgt aus:

public class Item 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 
public class Recipe 
{ 
    public int ProductID { get; set; } 
    public List<Material> Materials { get; set; } 
} 
public class Material 
{ 
    public int ItemID { get; set; } 
    public int Count { get; set; } 
} 

Und, können Sie sie durch ein Format füllen können, die Hierarchie wie XML unterstützen, Json, etc:

<Items> 
<Item ID="1">Paper</Item> 
<Item ID="2">Ink</Item> 
<Item ID="3">Book</Item> 
</Items> 

<Recipes> 
<Recipe> 
    <ProductID>3</ProductID> 
    <Materials> 
    <Material ItemID="1" Count="100" /> 
    <Material ItemID="2" Count="5" /> 
    </Materials> 
</Recipe> 
</Recipes> 
+0

Das Ausfüllen von XML vereitelt den Zweck vollständig. Wenn ich das machen würde, könnte ich auch einfach den tatsächlichen C# -Code eingeben. Der Punkt einer Tabellenkalkulation ist, dass Sie nur Zellen ausfüllen und nicht den gesamten Quellcode zwischen den Werten betrachten müssen, und dass die Dinge in einem 2-dimensionalen Gitter anstatt einer weitläufigen Liste verschachtelter Objekte zusammengehalten werden. Außerdem ist Ihr XML-Beispiel nicht lesbar, da es sich auf Artikel nach Nummer bezieht. –

+0

Wie ich schon sagte, können Sie die hierarchischen Daten immer verflachen, indem Sie sie normalisieren. Die ID muss keine Nummer sein, Sie können sie durch den Artikelnamen ersetzen. Es dient nur zur Veranschaulichung. – Xiaoy312

0

Sie können ein erstellen benutzerdefinierte AssetImporter in Unity.

Das bedeutet im Grunde, dass Sie Ihrem Projekt eine Editor-Erweiterung hinzufügen würden, die jede CSV-Datei im gesamten Projekt verarbeitet. Unity steuert, wann das Importer ausgeführt wird.

Hier ist eine schnelle, die ich für Sie gemacht habe. Sie würden den Inhalt der CSV-Datei drehen und einfach eine große Zeichenfolge generieren, die die Datei darstellt, die Sie erstellen möchten, und dann einfach File.WriteAllText, um die Ausgabe zu generieren.

using UnityEngine; 
using System.Collections; 
using UnityEngine; 
using System.Collections; 
using UnityEditor; 
using System; 
using System.IO; 

public class Testing : AssetPostprocessor 
{ 
    static string extension = ".csv";  // Our custom extension 
    static string newExtension = ".cs";  // Extension of newly created asset - it MUST be ".asset", nothing else is allowed... 

    public static bool HasExtension(string asset) 
    { 
     return asset.EndsWith(extension, System.StringComparison.OrdinalIgnoreCase); 
    } 

    public static string ConvertToInternalPath(string asset) 
    { 
     string left = asset.Substring(0, asset.Length - extension.Length); 
     return left + newExtension; 
    } 

    // This is called always when importing something 
    static void OnPostprocessAllAssets(
     string[] importedAssets, 
     string[] deletedAssets, 
     string[] movedAssets, 
     string[] movedFromAssetPaths) 
    { 
     foreach (string asset in importedAssets) 
     { 
      // This is our detection of file - by extension 
      if (HasExtension(asset)) 
      { 
       ImportMyAsset(asset); 
      } 
     } 
    } 

    // Imports my asset from the file 
    static void ImportMyAsset(string asset) 
    { 
     // Path to out new asset 
     string newPath = ConvertToInternalPath(asset); 

     File.WriteAllText(newPath, "// works!"); 
    } 
} 
+0

Ihr Codebeispiel erstellt daher eine CS-Datei für jede CSV-Datei, die sich irgendwo im Unity-Projektordner befindet, unmittelbar bevor Einheit den Code kompiliert? –

+0

Ja, oder theoretisch könnten Sie sie alle in eine einzige CS-Datei zusammenrollen, aber das ist es, was sie tut. –

+0

Ich muss wahrscheinlich nur ein Skript vor dem Kompilieren ausführen, da ich gerade versuche, eine CS-Datei zu erstellen. Wie machst du das? –