主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity

2016年4月18日月曜日

NPOIを用いてExcelファイルのデータをScriptableObjectに書き込む(処理の分岐)

前回作成したスクリプトでは一つのScriptableObjectのアセットファイルしか作れない。Excelファイルをインポートして開くまでの共通処理は使いまわしつつ、ScriptableObjectを作成する処理を分岐させるにはどうしたら良いか?

当初はクラス継承をしようとしたが、staticなメソッドはオーバーライド不能のようだったので断念した。そこで次のような方法をとった。

■変更前



変更後


using UnityEngine;
using UnityEditor;
using System.Collections;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
public class ForCategoryDB : MonoBehaviour {
static public void ReadBook(string exportPath, IWorkbook book){
//.assetをloadしてみる
CategoryDB data = (CategoryDB)AssetDatabase.LoadAssetAtPath (exportPath, typeof(CategoryDB));
//.assetがまだ無ければcreateする
if (data == null) {
data = ScriptableObject.CreateInstance<CategoryDB> ();
AssetDatabase.CreateAsset ((ScriptableObject)data, exportPath);
}
//古いリストを破棄
data.list.Clear ();
//ScriptableObjectに記入
WriteSO(book, data);
}
static private void WriteSO(IWorkbook book, CategoryDB data){
//シートの指定
ISheet sheet = book.GetSheetAt (0);
Debug.Log (sheet.LastRowNum);
//各列を探索
for(int i=1; i<= sheet.LastRowNum; i++){
CategoryDB.CategoryData cDB = new CategoryDB.CategoryData ();
IRow row = sheet.GetRow (i);
if (row == null) {
Debug.Log (i + 1 + "行目のデータは存在しませんでした。作成を完了しました。(ForCategoryDB.cs)");
break;
} else {
cDB.id = (int)row.GetCell(0).NumericCellValue;
cDB.name = (string)row.GetCell(1).StringCellValue;
data.list.Add (cDB);
}
}
}
}


〜解説〜

 前回作成したReadBookとWriteSOの部分を、各クラスに持たせた。このメソッドをstatic publicとすることで、前回作成したImporter側で処理を呼び出すことができる。

やや強引ではあるが、思いついた手段では期待した処理をしてくれた。これにより、Importerが肥大化して分かりにくくなるのを避けることができ、処理を拡張するのも楽になる。

0 件のコメント:

コメントを投稿