テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Unity4で書いたコードをUnity5向けに変換する「Script Updater」

f:id:tsubaki_t1:20151126014700j:plain

Unity 4とUnity 5はAPIが幾つか異なる

Unity 4からUnity 5になるにあたり、幾つかのAPIが変更になりました。
例えばUnity 4ではthis.camera.enabled = falseのように記述することが出来ましたが、Unity 5よりGetComponent<Camera>.enabled = falseのように記述する形に変更となりました。

なのでUnity 4のコードはUnity 5と互換性が無い…という訳ではなく、この変更点の多くの部分はScript Updaterによるソースコード改変により互換性を維持しています。

 

このため「コードに誤り・Typoが無ければ」概ねUnity 4向けのドキュメントに書かれている書籍でも何とかなったりします。Unity 5向けでやった方が入力保管が効くので楽ですが。

Script UpdaterによるUnity 5対応

Script UpdaterはUnity 5に導入されたUnity 4…多分最終的にはもっと広い範囲に適応される、ソースコードで使用している古いAPI最新のAPIへ置換するプログラムです。

ソースコードがインポートされたタイミングでソースコードを検証し、古いAPIを発見すると下のようなダイアログを表示します。

あとは「I Made a backup. Go Ahead!(やってやるぜ)」を押すとコンバートが走ります。

f:id:tsubaki_t1:20151126021411j:plain

この手のシステムの宿命として、バージョンを上げる事は出来ても下げる事は出来ないので、必ずバックアップを取って置く事をお勧めです。

アセットのインポート以外でもお目にかかるケース

ソースコードのインポートのタイミング…ということで、Unityでソースコードに「camera.enabled = true」とか書いてエディタに戻ると、見事にScript Updaterに検知されて変換を促されます。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	void Start () {
		camera.enabled = false;
	}
}

とはいえ、ローカル変数やフィールド変数として定義されている場合は呼ばれません。あくまで、Monobehaviourの変数として呼び出してる場合に呼ばれるみたいです。つまり下のようなコードはOK(コード的に良いかは別)

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	[SerializeField] new Camera camera = null;
	void Start () {
		camera.enabled = false;
	}
}

Script Updateに頼らない

自分で修正する場合はNo Thanksを選択し、コンパイルエラーを自分で何とかします。

f:id:tsubaki_t1:20151126020351j:plain

f:id:tsubaki_t1:20151126020433j:plain

No Thanksした後でScriptUpdaterを起動したい

No Thanksを選択した場合でも、後からAssets/Run API Updater...を選択してScript Updaterを起動する事も出来ます。

f:id:tsubaki_t1:20151126020704j:plain

Assembly UpdaterでDLLをUnity5向けに変換

名前が「Script」Updaterなのでスクリプトに限定されているように思われますが、実はアセンブリも対応しているみたいです。

f:id:tsubaki_t1:20151126030930j:plain

例えばUnity 4向けに作成したDLLをUnity 5のプロジェクトにインポートすると、いつものダイアログが表示され、I made backup , Go AheardでDLLが更新されます。

f:id:tsubaki_t1:20151126014700j:plain

ScriptUpdater.exeと同じフォルダ(Editor/Data/Tools/ScriptUpdater)にAssemblyUpdater.exeとかあったのでまさかと思いましたが、本当に変換できるとは。

Script Updaterの限界

Script Updaterも完全な技術ではなく、少し問題を抱えています。それは「対応しているのがpublicなAPI群である」という事です。

例えばReflectionで取得した文字列ベースのAPIに対してScriptUpdaterは効果がありません。そのため、Reflectionを使用してUnity内部のAPIへアクセスしているタイプのエディタ拡張は、上手く動作しないケースがあります。

また、InternalなAPI群(Internalな名前空間に所属するAPI群)は、更新されてもScript Updaterが対応していないケースが多い印象です。
他にもAnimator(Mecanim)はUnity4時代に本当に貧弱なAPIしか提供されておらず、Unity 5へ持ってきた際に手直しが必要になるケースが多い印象です。他のマイナーなAPI群も似たような感じではあります。

その場合は同等のAPIを探して置換、もしくは機能を諦めて削除となります。ちなみにバグレポートすると対応してくれたります。

AssetStoreとScript UpdaterとUnity5対応

Script Updaterで最もお世話になりそうなUnity 5でのAsset Store利用ですが、最近はAsset Storeのアセットは「コンパチビリティ対応(Unity 4向けとは別にUnity 5向けのアセットを提出)」をお願いしているらしく、更新が比較的新しいものであれば、大抵Script Updater無しでも動作するみたいです。

ちなみに、変換が走るであろうプロジェクトを購入する際、下のようなダイアログが表示され、変換が発生する要素を一覧に表示します。
(Possible Incompatibility with unity 5:Unity 5で動かないかもよ)

f:id:tsubaki_t1:20151126024455j:plain

(ちなみに上の図で紹介されてるShapes Boadは完璧に動作しました)

関連

blogs.unity3d.com

docs.unity3d.com

kenjin.unity3d.jp