Unity 4.0 ではGameObjectのアクティブ(active)状態の操作の仕方が変わりました。GameObjectのアクティブ状態は親子構造の子のGameObjectへ引き継がれるので,非アクティブのGameObjectの子は全て非アクティブになります。新しい挙動は古いものよりも役に立つと思いますし,いつもこの方法にすべきです。また今後実装予定の新しいGUIシステムではこの新しい挙動に依存し,それなしでは実現が不可能です。残念なことですが,新しいUnity 4.0の挙動のせいで今まで作っていたプロジェクトを修正するためにいくつか作業が発生してしまいます。下記がその作業項目です:
3つのGameObjectA,B,Cがあり,BとCはAの子であるとします。
これらの変化を可視化するために,Unity 4.0のエディタでは,非アクティブのGameObjectは,Hierarchyで暗く表示されます(それ自身が.activeSelfプロパティがfalse,またはその親がそうなっていれば)。Inspectorでもアイコンは暗く表示されます。GameObjectの自身の.activeSelf プロパティはactiveチェックボックスをオンにすると反映されます。親状態に関係なく切り替えることができます(ただし,すべての親がアクティブである場合,このチェックだけでそのGameObjectをアクティブになります)。
4.0の開発の過程で,当社のアセットインポートパイプラインは,パフォーマンス,メモリ使用量,安定性を向上させるために,内部のいくつかの重要な工程が変更されました。これらの変更はほとんどの部分については影響はありません。以下の例外を除いて:アセット内のオブジェクトは,インポートパイプラインの最後の最後まで以前にインポートされたバージョンのものが存続し,最後に完全に置き換えられます。
最初のパートでは,ポストプロセス時には,アセット内のオブジェクトへ正しい参照を取得することはできないことを意味し,次のパートでは,ポストプロセス中の変更を保存している間,前のインポートしたバージョンへ参照を使う場合,それらの変更が失うことを意味します。
次の短いコード例でみてみます:
public class ModelPostprocessor : AssetPostprocessor
{
public void OnPostprocessModel(GameObject go)
{
PrefabUtility.CreatePrefab("Prefabs/" + go.name, go);
}
}
Unity3.5では,これはメッシュ等の正しい参照を持ったプレハブが生成されるでしょう。これは全てのメッシュが既に永続化されているからです。しかし,Unity4.0の場合ではそうならないので,同じポストプロセサーでもメッシュへの参照が切れたプレハブを作成します。それは,Unity4.0のはまだ元のモデルプレハブ内のオブジェクトへの参照を解決する方法を知らないという単純な理由です。正しくmodelprefabをコピーするには,すべてのアセットのインポートをやり過ごすOnPostProcessAllAssetsを使うべきです。そうするとmodelprefabをみつけて,上記のように新しいプレハブを作成します。
二番目の例は少し複雑ですが,実際にあった,3.5で正常に動いたものが4.0で動かなくなったケースです。ここではScriptableObjectは簡単なメッシュへの参照を持っているとします。
public class Referencer : ScriptableObject
{
public Mesh myMesh;
}
モデル内のメッシュへの参照を持つアセットを作成するために,このScriptableObjectを使います。その後ポストプロセッサで,その参照を持ってきて,別の名前を付け,モデルを再インポートした際にメッシュの名前は最終的な結果はポストプロセッサが決定します。
public class Postprocess : AssetPostprocessor
{
public void OnPostprocessModel(GameObject go)
{
Referencer myRef = (Referencer)AssetDatabase.LoadAssetAtPath("Assets/MyRef.asset", typeof(Referencer));
myRef.myMesh.name = "AwesomeMesh";
}
}
これはUnity3.5でうまくいきましたが,Unity4.0で既にインポートされたモデルを完全に置き換えられますので,前回のインポートからメッシュの名前を変更しても影響はありません。ここでの解決策は,何か他の手段によってメッシュを見つけて,その名前を変更することです。注意するべき最も重要なことは,Unity 4.0ではポストプロセッサに与えられた入力を修正する「だけ」にするべきで,同じアセットの以前にインポートされたバージョンをあてにしないことです。
Unity 4.0では Mesh のImport Settingsに “Read/Write Enabled” オプションが追加されました。このオプションがオフにすると,Unityはゲーム内でのメッシュデータのコピーをアンロードすることができるので,メモリを節約できます。
ただし,あなたは単にスケーリングしたり,や非線形なスケールを使用して実行時にメッシュをインスタンス化したりしている場合は,あなたはそれらのインポート設定で “Read/Write Enabled” を有効にする必要があります。その理由は,非線形なスケーリングはメッシュデータをメモリ内に保持する必要があるからです。通常,ビルド時にこれを検出しますが,メッシュは,実行時にスケーリングやインスタンス化されるときには,これを手動で設定する必要があります。そうしないと,ビルドされたゲームの中で正しくレンダリングされない場合があります。
Unity 4.0のModel Importerは,メッシュの最適化が改善されました。Unity 4.0ではModel Importer の “Mesh Optimization” チェックボックスがデフォルトで有効になっており,最適なパフォーマンスを出すためにメッシュ内の頂点の順序を変更します。あなたのプロジェクト用の,メッシュの頂点の順序に依存するポストプロセスのコードや効果は,この変更によって壊れる可能性があります。その場合には,Mesh Importerの “Mesh Optimization”はオフにしてください。SkinnedClothコンポーネントを使用している場合は特に,このメッシュの最適化は,あなたの頂点ウェイトのマッピングが変更されることがあります。あなたが3.5から引き継いだプロジェクトでSkinnedClothを使用しているのであれば,影響を受けるメッシュの “Mesh Optimization”をオフにするか,新しい頂点の順序と一致するように頂点ウェイトを再構成する必要があります。
Unity 4.0 によりモバイル センサー入力はプラットフォーム間の整合性が改善され,具体的にはモバイルプラットフォームで典型的な入力をハンドリングする場合にコードの記述する量が少なくなっています。改善により加速度センサーおよびジャイロセンサー入力は iOS および Android で同じように画面の向きに従います。この変更を活用するには,入力に関わるコードのリファクタリングを行い,加速度センサーおよびジャイロセンサー入力のハンドリングを行う際のプラットフォームおよび画面の向きに固有のコードを削除します。iOSで従前の仕様をそのまま使用したい場合は Input.compensateSensors を false に指定します。