質問: 1; void Update() { if (targetRenderer.isVisible) { Debug.Log("画面に表示されてるよ"); } else { Invoke("CameraInvoke", 5f); Debug.Log("画面から消えたよ"); } } public void CameraInvoke() { Camera.main.transform.position += new Vector3(-18f, 0, 0); } } ``` 毎回変に思っていたのが、プレイヤーのオブジェクトがスタート時にデバックログで一度消えたと表示された後に、画面に表示されるみたいです。もしかしたら、その一回の感知だけでカメラが連続的に移動する原因となっているみたいです。 改善を試みた結果。。。以下のスクリプトで以下の問題が発覚しました。![![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/88a038c31d353495ad0386dbbf356e35.png) 肉眼では支障のないレベルですが、ゲーム開始時の2フレームの間にスプライトが表示されていないことがわかりました。 以下のことを試したけど、毎回同じ問題が発生します。 1カメラ判定を利用したほかの関数を利用した。 ➁オブジェクトを再配置 以上のことを試したのですが、変化がないことからもしかしたらUnityの仕様かもしれません。お気づきかもしれませんが、問題を確認するために以下のプログラムを専用メソッドに入れ、Invokeを利用して呼び出しています。そうすると、カメラが指定した時間に-36Fの位置にいることがわかりました。つまり、最初の2フレームを判定してプログラムが実行されたのが原因だと考えられます。 ``` Camera.main.transform.position += new Vector3(-18f, 0, 0);//最初の2フレームで二回も実行された? ``` どうすればいいのかわかりません。
回答: MainCameraにSpriteRendererが無いのにアクセスしようとしてエラーが出ています。 SpriteRendererはMainCameraにアタッチされているコンポーネントで間違いないのでしょうか? プレイヤーオブジェクトにアタッチされているべきコンポーネントではないですか? Start内の処理でMainCameraのSpriteRendererをplayerに設定していますが、その処理は必要ですか? GetComponentの前後にDebug.Logを入れてplayerの変化をご自身で確認してください。 --- 追記 --- ~~Renderer.isVisibleはゲームビューだけではなくシーンビューに写っていてもTrueを返します。 シーンビューにplayerが写っていないか確認してください。~~ 修正内容を取り違えていました。 MainCameraの表示領域とCanvasの領域が合っていないのではないでしょうか? Unity 2D:Canvasをカメラの表示領域に合わせる [ゲーム開始時の2フレームの対策案] プレイヤーオブジェクト側にOnBecameVisible()の処理を追加してはどうでしょうか? OnBecameVisibleはRenderer(SpriteRenderer)コンポーネントがアタッチされたオブジェクトが見えるようになったときに呼び出されます。 Renderer.OnBecameVisible() ``` プレイヤーオブジェクト側の処理。 public class Hoge : MonoBehaviour { public bool isBecameVisible; private void OnBecameVisible() { Debug.Log("OnBecameVisible"); isBecameVisible = true; } } ``` ``` Cam_1の修正 public class Cam_1 : MonoBehaviour { public SpriteRenderer targetRenderer; // 判定したいオブジェクトのrendererへの参照 float x = 1; public Hoge player; // <--- 追加 ---> void Update() { // <--- 追加 ---> if (!player.isBecameVisible) return; // <------------> if (targetRenderer.isVisible) { Debug.Log("画面に表示されてるよ"); } else { Invoke("CameraInvoke", 5f); Debug.Log("画面から消えたよ"); } } public void CameraInvoke() { Camera.main.transform.position += new Vector3(-18f, 0, 0); } } ```