2016-08-09 8 views
0

My Unityアプリケーションは、時間の経過とともに(オーディオに基づいて)シーンのSkybox Material Exposureプロパティをアニメーション化します。プロジェクトファイルのMaterialアセットにExposure = 1(初期値)が設定されています。これは素晴らしいです。プレイモードを終了しても、スクリプトがSkyboxの素材に変更されないのはなぜですか?

私はユニティ内部アプリプレイするとき:プレイする前に

  1. を、私は( は何が起こっているか確認するために)プロジェクトに素材を選択し、
  2. とすぐに
  3. 、ユニティでPlayアプリアプリが起動すると、マテリアルの露出は、 値(予想通り)、
  4. に設定されています。Skybox Exposureは期待どおりにアニメートされます(つまり、 は音楽に変わります)。
  5. 開始時(#3)、再生中(奇数の場合)、
  6. 再生中にExposure(Inspector)が設定されていると、露出値(Inspector内)はではなくに変更されます。再生中の最後の 値(実行中はインスペクタに表示されません)。

==>終了後、マテリアルがプレプレイの値に戻ることが予想されました。

重要:私は球の半径は(なしのスクリプトが)言って、私は(予想通り)、それはリセットのプレイモードを終了すると、再生しながら、私は手動での球の半径を変更して、この同じ実験をしようとした場合、元の前に再生値。

明らかに、私はUnityに非常にコアなものを紛失しています。私は&がまだ失われているすべてを読んだ。 skybox.material.exposure各フレームを変更する(問題がシーンのスカイボックスまたは類似した何かにデフォルトHideflagsであれば疑問に思う。)

シーンコントローラスクリプト:

public class AnimateSkyboxFromAudio : BaseAnimateFromAudio { 
    protected override void Start() { 
     base.Start(); 
    } 

    protected override void MyUpdate() { 
     float rms = GetAttrByName (AudioAnalyzer.RMS); 
     RenderSettings.skybox.SetFloat ("_Exposure", rms * 5); 
    } 
} 

答えて

2

私は素材に復帰することが期待 終了後のプレ演奏値。

RenderSettings.skyboxは、他のゲームオブジェクトとは異なる動作をします。マテリアルプロパティにアクセスするときにRenderer.materialによって返されるユニークなマテリアルとは異なり、の共有マテリアル参照を返します。

したがって、修正する前に材料のバックアップを作成する必要があります。停止をクリックすると、バックアップ素材がRenderSettings.skyboxに割り当てられます。これらの両方は、Start()OnDisable()の機能で実行できます。 MaterialクラスのコンストラクタをMaterialパラメータ(Material newMat = new Material(RenderSettings.skybox))で呼び出すことによってバックアップ材料を作成します。

_Exposureのプロパティを変更している場合、マテリアルバックアップを作成する必要はありません。ただ_ExposureプロパティをRenderSettings.skybox.GetFloat("_Exposure");でバックアップし、停止ボタンをクリックしたときに再割り当てしてください。あなたは材料の値を変更した後(インスペクタ)

露出値は、(#3)、プレイ中に(奇妙に思える)開始時に最初 変更後

コールDynamicGI.UpdateEnvironment();は変更されません。 。すでにskybox設定の元のコピーを変更したので

public Slider slider; 
Material backUpMaterial; 

void Start() 
{ 
    slider.minValue = 0f; 
    slider.maxValue = 3f; 
    slider.value = 1.3f; 


    //Get Material Backup 
    backUpMaterial = makeSkyboxBackUp(); 

    slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); }); 
} 

void sliderCallBack(float value) 
{ 
    RenderSettings.skybox.SetFloat("_Exposure", value); 
    DynamicGI.UpdateEnvironment(); 
} 

Material makeSkyboxBackUp() 
{ 
    return new Material(RenderSettings.skybox); 
} 


//Restore skybox material back to the Default values 
void OnDisable() 
{ 
    RenderSettings.skybox = backUpMaterial; 
    DynamicGI.UpdateEnvironment(); 
    slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); }); 
} 

が、私はあなたがある1.3_Exposureプロパティを設定することによって、それをリセット勧め:UI Sliderでスカイボックス_Exposureプロパティを変更する

例上記の解決策を試してください。

+0

ありがとうございます! skybox.materialが共有参照であったことは、どうしてあなたは知っていましたか?私はUnityのすべてを読んだことがあり、それはどこにも見られませんでした。 –

+0

私はあなたがその文書を読むとは思わない。私が答えた2番目の質問については、** "プレイモードでスカイボックスを変更した場合、DynamicGI.UpdateEnvironment関数呼び出しを使用してアンビエントプローブを更新する必要があります。** [documentation](https: /docs.unity3d.com/ScriptReference/RenderSettings-skybox.html)。 – Programmer

+0

最初の質問とあなたのコメントのために、Unityは 'RenderSettings.skybox' [documentation](https://docs.unity3d.com/ScriptReference/RenderSettings-skybox.html)でこれを言及しませんでした。代わりに' Skybox .material' [documentation](https://docs.unity3d.com/ScriptReference/Skybox-material.html)**は「スカイボックスで使用される素材」 'Renderer.material'とは異なり、これはaを返しますユニークな複製ではなく、共有されたマテリアルの参照です。 – Programmer

関連する問題