C#のGenericsのオーバーロードが便利だった話
C#の技術記事。コード内容はUnity寄り。
コルーチンをまとめたクラスを設計していて、
AddRoutine (Func<IEnumerator> routine)
みたいなコードを書いた。
これは、たとえば
IEnumerator RoutineA () { ... } void Main () { var routines = CoroutineContainer(); routines.AddRoutine(RoutineA); }
みたいなのを書けるようにするためのコード。
で、この場合RoutineAが引数を持ってないからいいんだけど、
IEnumerator RoutineB (int arg) { ... }
とか
IEnumerator RoutineC (string arg) { ... }
とかの
引数ありのコルーチンって結構ある。
で、じゃあ
AddRoutine (Func<int,IEnumerator> routine, int arg)
と
AddRoutine (Func<string,IEnumerator> routine, string arg)
の
2つを定義しておけば、intとstringは対応できる。
でも、他の型でも対応したい。型指定しないで使えるようにしたいって思った。
そんなときのためにGenericsという仕組みがあったのだった。
AddRoutine<T> (Func<T,IEnumerator> routine, T arg)
こいつを定義しておけば、さっきの2つのオーバーロードは必要なくなる。
こいつを使ってRoutineBをAddRoutineしたいときは、
routines.AddRoutine<int>(RoutineB, x);
みたいに書けばいい。
しかしGenericsの良さはとどまるところを知らなかった。
C#は型推論の仕組みがあり、Genericsの指定も省略できる。
つまり、一つ上の例では、x
がintなら、このように書ける。
routines.AddRoutine(RoutineB, x);
リンク集
主にゲーム開発について、参考になると思ったページのリンクをまとめておくための記事。
ゲームブックの基本構造 - アドベンチャーゲームエンジン Wiki - SourceForge.JP
ゲームのメニュー画面に頻出する単語の英訳
Word of the Day suggestion list - LLTVG
攻撃が持っているパラメーターの一覧
64スマブラの攻撃の例。参考として。
AssetBundleとNGUIについて
AssetBundleのビルド方法について色々調べてみたが、結局分からないことがあった。
NGUIのUISpriteをアタッチされたprefabをAssetBundleにビルドしようとすると、AssetBundleにUISpriteが含まれることになるが、
UISpriteを含まないようにしつつ、ロードしてInstantiateしたらちゃんと表示されるようにするというのが出来なかった。
UISpriteを含めてビルドすれば正しく動作したが、すべてのAssetBundleにUISpriteが含まれることになってしまうため、効率がよろしくない。
公式の説明では、PushDependenciesなどを使うよう説明されているが、UISpriteに関してはAssetsに含めたままで、AssetBundleにする予定はない。
色々試してみたが、結局、どうすれば期待した動作をするのかが分からなかった。
ビルドする際にUISpriteを、プロパティを保持しつつ別のScriptに置き換え、そのScriptをPushDependenciesしつつAssetBundleにするようにすればいいんだろうか?
だが、そんなことはできるんだろうか?
頭が痛い。
ZonBear,ZonBunny
UnityのAssetStoreで掘り出しものを見つけたので記事にする。
Modelではなく、projectとしてAssetStoreに登録してある。
Unity Technologiesの「Survival Shooter」というやつ。
Unity - Project: Survival shooter
ゲーム制作チュートリアルとしてProjectが用意されてるパターンで、中のモデルが可愛くて何かに使えそうだと思った。
ライセンスはApache License 2.0なので、それを明記しておけば再利用可能なはず。
(ちょっと中身を全部見れていないのでライセンスがこれであってるかどうかは要調査。)
個人的にはこういうSD系でこわかわいいキャラクターは大好きなので何かしらで使いたいところ。