何らかのゲームアセットに修正を加えたい場合,実行時に行い,一時的に行うことが望ましい場合が通常です。例えば,もしキャラクターが無敵パワーアップを拾ったとして,プレイヤーキャラクターの Material の Shader を変更して,無敵モードを表現したい場合があります。このアクションは使用しているマテリアルの修正を伴います。この修正は,Play Mode (実行モード)を終了したときに,マテリアルに別のシェーダをもってほしくないため,永続的な変更ではありません。
しかし,Unityで永続的にソースアセットを修正するスクリプトを書くことが可能です。例えば前述のマテリアルの例をスタート地点として使用します。
マテリアルのシェーダを一時的に変更するには, material コンポーネントの shader プロパティを変更します。
private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
renderer.material.shader = invincibleShader;
}
スクリプトを使用して, 実行モードを終了したとき, material の 状態 は実行モードに入る前の値にリセットされます。これは renderer.material がアクセスされるときはつねに,マテリアルが自動的にインスタンス化されて,インスタンスが返されるためです。このインスタンスは同時に,かつ,自動的にレンダラに適用されます。このため永続的に反映されることを心配せずに変更を行うことができます。
以下で示す手法はUnityの中での実際のソース アセット ファイルを修正します。これらの変更は元に戻すことが出来ないため,注意深く使用して下さい。
次に実行モードを終了したときに,マテリアルをリセットしたくないとします。このためには renderer.sharedMaterial を使用できます。sharedMaterial プロパティはレンダラにより使用される実際のアセットを(および場合によっては他も)返します。
以下のコードによりマテリアルが鏡面シェーダを使用するように永続的に変更を行います。実行モードに入る前の状況にマテリアルをリセットしません。
private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
renderer.sharedMaterial.shader = invincibleShader;
}
見てのとおり,sharedMaterial への変更を行うことは便利でありリスクも伴うものです。sharedMaterial への変更は永続的であり,元に戻すことが出来ません。
この同じ法則はマテリアル以外でも適用が出来ます。このルールにしたがう全てのアセットの一覧は次のとおりです。
もし上記のクラスのどれか(Material, Mesh, または Physic Material)でパブリック変数を宣言して,関連するクラスメンバではなく変数によりアセットに変更を加えた場合,修正が適用される前の自動インスタンス化による恩恵は受けられません。
修正したときに必ず自動的にインスタンス化されない2つの異なるアセットがあります。
スクリプティングを通してこれらのアセットに行った変更は常に永続的であり,元に戻すことが出来ません。このためもしTerrain(地形)のHeight Map(高さ)をスクリプティングを通して変更する場合,インスタンス化および値の割り当てをカスタムで検討する必要があります。同様のことがテクスチャでもいえます。もしテクスチャファイルのピクセルを変更した場合,変更は永続的です。
Texture2D アセットは修正したときに自動的にインスタンス化されることはありません。これらのアセットに行った修正はつねに永続的であり,元に戻すことが出来ません。もしテクスチャファイルのピクセルを変更した場合,変更は永続的です。