通常は、どんなゲームアセットに修正を加えたい場合でも、実行時に一時的に行うことが望ましいといえます。例えば、もしキャラクターが無敵なほどパワーアップしたとしたら、プレイヤーキャラクターの Material の Shader を変更して、視覚的に無敵のステートを実際に示したいかもしれません。これには、使用されるマテリアルを修正する必要があります。プレイモード を終了するときに、マテリアルに別のシェーダーを設定したくないため、この修正は永続的ではありません。
しかし、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 アセットは修正したときに自動的にインスタンス化されることはありません。これらのアセットに行った修正はつねに永続的であり、元に戻すことができません。もしテクスチャファイルのピクセルを変更した場合、変更は永続的です。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.