コード ```~~今unityのカメラの扱いで様々な移動方法について、勉強しているときに。昔のゲームでAtari2600にH.E.R.Oというゲームがあったのですが、あのようにプレイヤーがカメラ外から移動したら、カメラを移動するプログラムを作成しました。 以下がそのコードです。~~
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Camera : MonoBehaviour
{
public SpriteRenderer player;
void Start() { player = GetComponent<SpriteRenderer>(); //レンダー取得 } void Update() { if (!player.isVisible) { transform.position += new Vector3(-18f, 0,transform.position.z); } }
}
テストということなので、プレイヤーが画面の左に移動したときだけの処理を書きました。 このまま実行すると以下のエラーが発生します。 There is no 'SpriteRenderer' attached to the "MainCamera" game object, but a script is trying to access it. You probably need to add a SpriteRenderer to the game object "MainCamera". Or your script needs to check if the component is attached before using it. ~~対象のレンダーがアタッチされていないとのことなので、ああ。なぁんだ。と思い、プレイヤーオブジェクトをカメラのスクリプトの欄にアタッチしても、変わりません。あれ?と思い、アタッチしているか再確認したら、ゲームを開始するとなしになってアタッチされていないと表示されることがわかったのです。プログラム自体にミスがあるのか確認するために、ゲーム起動中にアタッチすると、カメラがレンダーの対象を認識してくれて、プレイヤーが画面外に移動すると、しっかりとカメラが指定した座標を毎回移動してくれます。ただ、開始時にはこれが実現できません。これを何とかする方法がないのか、調べても全く分かりません。スクリプトから、アタッチする方法があるのかないのか、そもそも他の方法があるのかわかる方がいましたら教えてください。~~ 今修正したところ、以下のようなコードになり。画面にオブジェクトがいるのにもかかわらず、アップデートがずっとこのメソッドを呼び出し、カメラが変数の最大値の座標まで移動してしまいます。
using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Camera : MonoBehaviour
{
public SpriteRenderer player ;
void Update() { if (!player.isVisible) { transform.position += new Vector3(-18f, 0,transform.position.z); } }
}
いろいろと試行錯誤を加えた結果、様々な関数を試しても、同じ挙動になることがわかりました。なお今は、以下のプログラムを組んである状態です。 ```ここに言語を入力 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Cam_1 : MonoBehaviour { public SpriteRenderer targetRenderer; // 判定したいオブジェクトのrendererへの参照 float x = 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); } }
毎回変に思っていたのが、プレイヤーのオブジェクトがスタート時にデバックログで一度消えたと表示された後に、画面に表示されるみたいです。もしかしたら、その一回の感知だけでカメラが連続的に移動する原因となっているみたいです。
改善を試みた結果。。。以下のスクリプトで以下の問題が発覚しました。![
肉眼では支障のないレベルですが、ゲーム開始時の2フレームの間にスプライトが表示されていないことがわかりました。
以下のことを試したけど、毎回同じ問題が発生します。
①カメラ判定を利用したほかの関数を利用した。
➁オブジェクトを再配置
以上のことを試したのですが、変化がないことからもしかしたらUnityの仕様かもしれません。お気づきかもしれませんが、問題を確認するために以下のプログラムを専用メソッドに入れ、Invokeを利用して呼び出しています。そうすると、カメラが指定した時間に-36Fの位置にいることがわかりました。つまり、最初の2フレームを判定してプログラムが実行されたのが原因だと考えられます。
Camera.main.transform.position += new Vector3(-18f, 0, 0);//最初の2フレームで二回も実行された?
どうすればいいのかわかりません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/26 14:09 編集
2020/08/26 15:22 編集
2020/08/26 15:32
2020/08/26 16:48
2020/08/26 17:54 編集
2020/08/27 06:49
2020/08/27 07:55 編集
2020/08/27 08:11
2020/08/27 10:20
2020/08/27 11:00
2020/08/27 11:25
2020/08/27 11:55 編集
2020/08/28 00:14
2020/08/28 15:50