posita33 / PositiveUEFNUtility

This is a useful tool created for UEFN.
MIT License
4 stars 0 forks source link

CSVファイルを渡すとツール上で定義した構造体の形式でVerseコードを生成してくれるツール #8

Open YuyaShiotani opened 1 month ago

YuyaShiotani commented 1 month ago

表題の通りでして、現在のUEFNではDatatableが無いため大量のテキストデータなどをVerseファイル上に定数として定義するか、Verseにて公開した変数に対してレベル上で入力するしかない状況です。

後者はVerseファイル側の定義が変わるなどした際に設定した数値が消えてしまう可能性が高く利用はさけたい所です。 選択肢としては現状は前者を利用するというのが吉なのですが、Verseファイルをレベルデザイナーなどエンジニア以外の人間が触ることになるため、なるべくヒューマンエラーによるビルドエラーを避ける手法が必要になります。(Google Spreadsheetでそれっぽいコードに出力してくれるように関数を組む、GASを組むなどありますが、構造体の定義が変わるたびに作り変えるコストも発生する点がネックです。)

そこで、外部ツール上にて指定した構造体の構成に対してCSVファイル(Google Spreadsheetから出力)を渡すとVerseコードに変換するツールがあると便利なのかなと思いました。

こちらご検討いただけますと幸いです!

posita33 commented 1 month ago

プリミティブな変数だけが使用されているDataTableのCSVデータをコードに変換するのはできそうです。 DataTable内に構造体が使われてしまっているJSON形式になってしまうようなCSVファイルだと少し難しいかもしれません。

まだVerseを触ったことがないため、サンプルのCSV情報とCSV情報がどのようにVerseコードに反映されるかのユースケースをいただけると対応しやすいです。

CSVは使い慣れているので、なんとかなりそうです。

YuyaShiotani commented 1 month ago

ご確認いただきありがとうございます!

なるほどです。 現在、書いている該当ケースにおけるコードですと、構造体を使ってしまっているので中々厳しいのかもしれないですね...

また現時点ではまだ、私の方ではCSVファイルからの変換までは作っていない状況になりますので、「CSV情報がどのようにVerseコードに反映されるか」という点において以下にNPCの会話リストをVerse上で定数として定義した際のコードを共有いたします。

以下のコードは読み取り用のClassを用意して、状況に応じた会話データの抽選を行うために用意した構造体になります。

    NPC_01_TextLists : []Str_TalkTextList = array:
        Str_TalkTextList:
            NPC_Name := ENPC_names.NPC_01
            Language_Type := 0
            TargetQuestProgress := Str_QuestProgress{QuestID := 0, QuestProgress := 0}
            Priority := 0
            Sound_TalkStart := 0
            Sound_TalkEnd := 0
            TextDatas := array:
                Str_TextData:
                    Title_Text := "Cuddle King",
                    Description_Text := ("QuestID := 0, QuestProgress := 0, EN"),
                    Button_Text := "I see...",
                    Sound_NextPage := 0
                Str_TextData:
                    Title_Text := "Cuddle King",
                    Description_Text := ("QuestID := 0, QuestProgress := 0, EN"),
                    Button_Text := "Um... No Thank you...",
                    Sound_NextPage := 1
        Str_TalkTextList:
            NPC_Name := ENPC_names.NPC_01
            Language_Type := 1
            TargetQuestProgress := Str_QuestProgress{QuestID := 0, QuestProgress := 0}
            Priority := 0
            Sound_TalkStart := 4
            Sound_TalkEnd := 4
            TextDatas := array:
                Str_TextData:
                    Title_Text := "Cuddle King",
                    Description_Text := ("QuestID := 0, QuestProgress := 0, JA"),
                    Button_Text := "え...?",
                    Sound_NextPage := 4
                Str_TextData:
                    Title_Text := "Cuddle King",
                    Description_Text := ("QuestID := 0, QuestProgress := 0, JA"),
                    Button_Text := "あー、結構です...",
                    Sound_NextPage := 1

image