top of page
執筆者の写真Reo

便利なStringBuilderのおはなし①

こんにちは.レオです.

Unity開発者のみなさん,今日も頑張っておられますか?それとも息抜きにゲームとかされていますか?

私はTGS申込期限が7/31ということで寝る時間削る勢いでラストスパートかけてます. 

もうちょっと余裕のあるスケジュールを組みたかった・・・苦笑



今回は作業効率化に関するお話です.

StringBuilderって聞いたことありますか?

超ざっくり,私が使ったときの役割を説明すると


「自動でリソースのパスをスクリプトに書いて更新してくれる」

「自動でスキルについてのスクリプトのテンプレートを作成してくれる」

etc...

これ,ボタン一つですべて自動でやってくれるようになります.

夢みたいですよね,知らなかった私はかなり感動しました. 笑






 





どうやって?


たとえば

public enum Unit

{

Unit0,

Unit1,

.

.

.

}


とenumを宣言したいとしましょう.ユニットの種類を後で増やせば増やすほど

ここにきて書き換えなきゃならない.

Prefabを作っているのであれば,ユニットの種類が増えれば増えるほど

Prefabの数も多くなるし作り忘れもでてくるかもしれない.

パス(Resources.Loadとかする時に参照するPath)もいちいち書き足さなきゃいけない.

面倒くさい...



CSVファイルはこんな感じだとする

図鑑番号,ユニット名,
1,Unit0,
2,Unit1,
3,Unit2,


★こういうスクリプトを書いてみましょう.(まずはenum宣言を自動で!他は省略)

*注意:Editorフォルダを作成してその中に保存してください.



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

public static class UnitEnumCreator
{
 //CSVファイルの読み込みは省略
 //ユニット名を読み取ったリストがこれとする
 static List<string> itemList 
      = new List<string>(){"Unit0", "Unit1", "Unit2",};
 
 //Defineを作成する場所
 static string DEFINE_FILE_PATH 
      = "Assets/Scripts/Defines/UnitDefine.cs";
 
 [MenuItem("Enum作成!", true)]
 public static void Create()
 {
   if(CanCreate() == true)
   {
      //Define作成
      CreateDefine();
   }
 }
 
 public static bool CanCreate()
 {
    //シーン実行中とかコンパイル中とかには作成させないようにする
    return !EditorApplication.isPlaying 
    && !Application.isPlaying 
    && !EditorApplication.isCompiling; 
 }
        
  //Defineを作ってそこにUnitのEnumを書く
  public static void CreateDefine()
  {
   //↓これに何を書きたいか設定していく.******************
   var enumBuilder = new StringBuilder();
   enumBuilder.AppendLine("public static class Define");
   enumBuilder.AppendLine("{");
   enumBuilder.AppendLine("\tpublic enum Unit");
   enumBuilder.AppendLine("{");
   foreach(var item in itemList)
   {
      enumBuilder.Append("\t\t").AppendFormat("{0},", item)
      .AppendLine();
   }
   enumBuilder.AppendLine("\t}");
   enumBuilder.AppendLine("}");
   //↑ここまでが書き出すスクリプトの中身******************
   
   //作成しようとするファイルが既に存在しているかのチェック.
   var directoryName = Path.GetDirectoryName(DEFINE_FILE_PATH);
   if(Directory.Exist(directoryName) == false)
   {
     Directory.CreateDirectory(directoryName);
   }
   //書き込み!
   File.WriteAllText(DEFINE_FILE_PATH, enumBuilder.ToString(), 
        Encoding.UTF8);
   //保存,反映!
   AssetDatabase.ImportAsset(DEFINE_FILE_PATH);
  }
}    



自動作成させるとこういうスクリプトが指定したパスの場所に出来上がる.

public static class UnitDefine
{
    public enum Unit
    {
        Unit0,
        Unit1,
        Unit2,
    }
}

一度作ったあとは,List<string>の中身を変えて再度ボタンを押すたびに中身が書き換わると思います.

これで他のどのスクリプトからもUnitDefine.Unit.でユニットの種類を指定できますね!

(何度も使うものはusingに書いてしまいましょう)


この要領でPrefabや他のスクリプトを自動で作成させれば,csvファイル一つ更新するだけでいろいろ変えられて便利でした.

(上書きしたくないやつとかはファイルの存在しない場合のみとか制限をかけてあげたりして工夫する必要はあります.)



StringBuilderの詳しい説明は書きません.私も決して詳しいわけではないので.

この使い方をする分には

 Append,   (文字結合)

 AppendLine, (文字結合後改行)

 AppendFormat(文字結合,変数有)

がわかれば十分なので

こいつらだけ覚えてしまえば後は実践あるのみです!





私はこの数日で初めて使ったところなのでおかしなところがあったりしたら

やさしく教えていただけると嬉しいです.

自分好みのシステムを作る感じはエディタ拡張に似てますね.

それで今回はこの辺で.


閲覧数:316回0件のコメント

最新記事

すべて表示

Komentar


bottom of page