2015年12月11日金曜日

Cities: SkylinesのmonoランタイムにはSystem.Type.op_Equalityメソッドがない

ようやくロード・セーブの方式も確立して、多言語化もほぼサポートして、基本的な雛形が完成したので、さあこれからだ!というところでいきなり躓きました。

データ保持用のクラスに項目を追加しただけで急に動かなくなりました。

Cities: Skylinesでのデバッグは仮に例外が発生していても本体側で握りつぶしてしまうのでどこで起きているかわかりません。
そのうえ、Unityの仕様だと思いますが、プロセスにアタッチしてもソースレベルではデバッグが不可能。
デバッグコンソールか自力でエラーログをファイルに吐くしかなくて、さらにスタックトレースを出そうとしても、トレース情報がランタイムによって消去されてしまって表示不可能ときた。

提供されているクラスライブラリのドキュメントがどこにもない(どう探しても見つからない!!)ので試行錯誤や諸先輩方の公開されているソースだけに頼っている上に、いまどきprintfデバッグが必要というとんでもない代物なのでなかなか進みませんが、ただメンバを追加しただけなのに急に動かなるとかいったいどういうことが起きているのかさっぱりわかりませんでした。

とりあえず怪しそうなところをprintfデバッグで絞り込んでcatchしてみると
MissingMethodException: Method not found: 'System.Type.op_Equality'
なる例外が。

このエラーは追加したクラスのメソッドを呼び出す際に発生していることが分かりました。
呼び出されるメソッドはただコンストラクタから呼び出されて変数の初期化をするだけの変哲もないもので、そもそもこんなメソッドを呼んだこともないし見たこともないので面喰いました。

調べてみると、これは.Net Framework v4で追加されたものだそうですが、monoはv4に対応しているものの、Cities: Skylinesの採用するミドルウェア(Unity)が古いmonoを採用しているため、v3.5相当の機能しか使えないことがやっとわかりました。

VisualStudio2015でビルドまでしてしまっていたので、v4.6がターゲットになっていたため、このトラブルに見舞われました。

最初からきちんと調べるか、ビルドはCities: Skylines側が提供するバイナリで行えばこのようなトラブルは起きえないのですが、自分の粗忽さから招いた自業自得でした。

また一つ、恥をかいてしまいました。

0 件のコメント:

コメントを投稿