UnityのCube(オブジェクト)を1ループにつきy軸で1度ずつCubeが回転するような動きを描画させています.そして10度毎にカメラ側のClear FlagsをDon't Clearの状態として深度バッファを更新させず,1度ずつの軌跡が上書きされていくような状態にしようとしています.そして10度移動すると今度はClear FlagsをSolid Colorの状態に一度切り替えて10度分の軌跡を消し,次の10度のループに入ると再び軌跡の描画が始まるようなものを想定しています.
現在,カメラ側のClear FlagsをCube側のScriptから変更する処理(BufferNotClear()やBufferClear()の呼び出し)は動作していることを個別に確認できました.
しかし,BufferNotClear()とBufferClear()をCube側のUpdate内の頭と終わりで切り替えようとしても終わり側に呼び出した関数側のClear Flagsのみが反映される状況です.例えば,以下のようにUpdate()の最後にBufferClear()を呼び出すとCubeの軌跡は残らずに表示されてしまいます.反対に,BufferNotClear()を最後に呼び出した場合は軌跡が10度ずつリフレッシュされることなく,何回転しても常に軌跡が消えない状態になります.
Debug.Log("bufferの更新中断");とDebug.Log("bufferの更新");は角度10度分がconsoleに表示される前後に表示されているので,いずれも呼び出し自体は出来ていそうなのですが,思うような描画の挙動になっていないため解決策に悩んでいます.
以下はCubeとカメラに取り付けているスクリプトです.
C#
1//オブジェクトのScript 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7public class TestObj : MonoBehaviour 8{ 9 10 GameObject MainCamera; //変数宣言 11 Camera cam; 12 13 void Start() 14 { 15 Application.targetFrameRate =10; //動作確認用に10fpsに固定 16 17 //ゲームオブジェクトMainCameraを見つけてMainCameraに格納 18 MainCamera = GameObject.FindGameObjectWithTag("MainCamera"); 19 cam = MainCamera.GetComponent<Camera>(); 20 } 21 22 void Update() 23 { 24 //Cambuffer.csのBufferNotClear関数を実行 25 MainCamera.GetComponent<Cambuffer>().BufferNotClear(); 26 27 for (float y = 1; y <= 10; ++y) 28 { 29 transform.Rotate(new Vector3(0, 1.0F, 0)); 30 float nowRotate = transform.localEulerAngles.y; 31 Debug.Log("今の角度は" + nowRotate); 32 } 33 34 //Cambuffer.csのBufferNotClear関数を実行 35 MainCamera.GetComponent<Cambuffer>().BufferClear(); 36 } 37 38} 39
C#
1//Main CameraのScript 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7public class Cambuffer : MonoBehaviour 8{ 9 10 Camera cam; 11 float color; 12 13 void Awake() 14 { 15 cam = GetComponent<Camera>(); 16 cam.clearFlags = CameraClearFlags.Nothing; 17 } 18 19 public void BufferNotClear() 20 { 21 //bufferの更新を止める 22 cam.clearFlags = CameraClearFlags.Nothing; 23 Debug.Log("bufferの更新中断"); 24 } 25 26 public void BufferClear() 27 { 28 //bufferの更新(SolidColorモードに一度戻すことで,オブジェクトの描画が更新の位置のものだけになることを期待) 29 cam.clearFlags = CameraClearFlags.SolidColor; 30 Debug.Log("bufferの更新"); 31 } 32}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/30 04:40