Unityを久しぶりに使って

あすかです。

大学以来、久しぶりにUnityを使ってみました。

Unityには、いろいろあって苦手意識がありましたが、Unityを使っていくうちになんかいろいろ見えてきたものがあったので
かなり初歩的なことばかりだと思いますが、メモします。

Unityで苦手だと思っていたこと

C#5、C#6、C#7の文法が使えない?

これ、短いコードを書くためには厄介ですよね。
特に

var result = this.Cell?.Load();    // C# 6

とか

public bool IsEnabled => true;    // C# 6

とか

public string Description
{
    get => this._description;    // C# 7
    set => this._description = value ?? throw new ArgumentException();    // C# 7
}

とか

Action act = async () =>    // C# 5
{
    await this.turn.NextTurnAsync();    // C# 5
};

とか、
普段使っている書き方が使えないと調子狂います。

Unityは、Unity 2017でC# 6が使えるようになりますとか、.NET Frameworkが4.6に上がりますとか、そういう話もありますし、ベータ版もすでに用意されていますが、
今はとかくすぐに使いたいという感じだったので、

ufcpp.net

ビジネスロジックを外部DLLに分離することで乗り切ってみました。
ついでにロジックの中に入れてるAIの動作確認も、UnityではなくWPFとかでできるのでデバッグが楽になりました。

それでもUnity本体の画面をいじるコードは書くの面倒です。ここでもC# 6使えるようになる方法はありますが、記述コード量とそれに対するC#6・7の文法が使えないことによるロス時間の短さを考えると20~30分程度の準備時間も惜しかったので我慢することにしました。

実際のプロジェクト構成ですが、

f:id:kmynews:20170709100942p:plain

DLLプロジェクト本体はMulierLib、AIの動作確認をするためのプロジェクトはMulierLib.WPFで、ビジネスロジック本体はMulierLib.Sharedにまとめています。
また、MulierLibのプロジェクト設定で、DLLの出力先をUnityプロジェクトフォルダのAssetsフォルダ内に向けています。

f:id:kmynews:20170709101116p:plain

こうすると、DLLビルドしただけでUnityプロジェクト内のDLLが更新されるので楽といえば楽です。

デメリットは、DLLの中にバグがあったときにデバッグが難しいことあたりかなーと思います。
もしDLLにバグがあった時、Unityで表示されるエラーのスタックトレースの中には、DLL内のクラスやメソッド、どのファイルの何行目か、という情報が含まれていますので、それをもとにコード探して修正するなり。変数の中身は、VisualStudioのイミディエイトウィンドウが使えるので、大抵の場合はなんとかなります。候補に表示されないだけでprivateなメンバも参照できますよあれ。

Unityのオブジェクトのプロパティ値を変更するたび、いちいちネットで調べなければいけない?

これ、どういうことかといいますと、例えばスプライトの画像を変更したいってなりますよね。
そのとき、

var sprite = this.gameObject.GetComponent<SpriteRenderer>();
sprite.sprite = Sprite.Create(this.texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);

というコードをわざわざネットで検索してコピペするわけです。
こういうものはいちいち検索して覚えないと分からないものだと思っていました。そりゃ労力かかりますよね。

でも、私、見つけました。
世間から見たら「リンゴの色は赤だった!」レベルの発見だと思いますが、
Unityエディタでなにかオブジェクトを選択すると、右側にこういうの出てきますよね。

f:id:kmynews:20170709102224p:plain

それの、

f:id:kmynews:20170709102311p:plain

この部分を、

var sprite = this.gameObject.GetComponent<SpriteRenderer>();

の、SpriteRendererの部分に使えるわけです。
同じように、

f:id:kmynews:20170709102423p:plain

ここも、

sprite.sprite = this.GetSprite();

のように、プロパティの名前として使えるわけです。
もちろん例外もありますし、そのあたりはネットで調べなければいけないのですが、Unityの基礎操作さえ理解できていれば、ネットで調べなくてもある程度スクリプトは書けるんだなと、今更ですがわかりました。
あとは、どのコンポーネントがどういう働きをするか一通り知っておくだけでいい感じです―。

プロパティの名前が先頭小文字になってるのはちょっと慣れないですが・・・

Unityには他にも苦手だなーと思うところはあるのですが、とりあえずこの2つで当分は乗り切れると思います。