実現したいこと
playerオブジェクトを中心にカメラを動かしたい。
発生している問題・分からないこと
全方向回るが、決められた範囲で移動してほしい。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class カメラ操作 : MonoBehaviour 6{ 7 [SerializeField] GameObject player;//プレイヤーのオブジェクト 8 private Vector3 playerPos;//プレイヤーの位置 9 private float speed = 500f;//カメラの移動速度 10 private float mouseInputX;//マウスのX軸入力 11 private float mouseInputY;//マウスのY軸入力 12 void Start() 13 { 14 playerPos = player.transform.position; 15 } 16 void Update() 17 { 18 transform.position += player.transform.position - playerPos; 19 playerPos = player.transform.position; 20 //マウス位置取得 21 mouseInputX = Input.GetAxis("Mouse X"); 22 mouseInputY = Input.GetAxis("Mouse Y"); 23 //transform.localEulerAngles.x カメラの回転取得 24 if (transform.localEulerAngles.x <= 40 && transform.localEulerAngles.x >= 10) 25 { 26 transform.RotateAround(playerPos, transform.right, mouseInputY * Time.deltaTime * speed); 27 Debug.Log("if1"); 28 } 29 else if (transform.localEulerAngles.x < 10) 30 { 31 Debug.Log("if2"); 32 if (mouseInputY > 0) 33 { 34 Debug.Log("if2-1"); 35 transform.RotateAround(playerPos, transform.right, Time.deltaTime * speed); 36 } 37 } 38 else if (transform.localEulerAngles.x > 40) 39 { 40 Debug.Log("if3"); 41 if (mouseInputY < 0) 42 { 43 Debug.Log("if3-1"); 44 transform.RotateAround(playerPos, transform.right,Time.deltaTime * speed); 45 } 46 } 47 48 49 transform.RotateAround(playerPos, Vector3.up,mouseInputX * Time.deltaTime * speed);
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
座標指定でするしかないのかと思います。ですが、各月ます
補足
指定した範囲内できちんと動くのですが、決められた範囲以上に出てしまうことがあります。多分スピードの問題で、決められた範囲以上に瞬間的に飛んでしまっています。
私はUnityも知りませんし,(そのせいなのかなんなのか)
> 各月ます
みたいな言葉(Unity固有の専門用語??)の意味もさっぱりわからないのですが……
それはそれとして
> Debug.Log
というので何らかのデバッグ目的の表示を行うことができるのであれば,
それをふんだんに用いるなどして,実際に何が起こっているのかを観測し,原因を追究することを行うべきではないのでしょうか.
ちょっとした確認作業を実施すれば
> 決められた範囲以上に出てしまう
という問題の現象が起こったタイミング前後の各変数の具体的な内容をあなたは知ることができるのではないのですか? ということです.
「この値がこうなっているときに,この実装ではその値を用いてこんな演算をしているから,結果としてこんな(想定外の)状態を生じるのだなぁ」
というのを把握してください.
> 多分…
とか言わずに.具体的に.
そもそもの話として
> 指定した範囲内できちんと動くのですが、決められた範囲以上に出てしまう
の「範囲」とは何の範囲のことなのですか?
> transform.localEulerAngles.x <= 40
みたいな不等式っぽい記述のことを指しているのでしょうか?
もしそうであれば……例えるならば
if( x<=40 ){ x+=7; }
みたいな実装があるときに「 x の値が 40 を超えることがあるのは何故なのか」みたいなことを言っている??
もしもそんな話なのであれば……(Unityを知らない人だからこその考えとなるでしょうが)
【範囲を限定したい量というのをその「カメラ操作」クラスのデータとして保持し,そのデータ値の更新は (Unity が用意しているメソッドで行うのではなくて)自身で実装した演算処理で更新していく】というのがとりあえず明瞭であり,手っ取り早い ……と思います.
自身で更新処理を書くなら「更新演算の結果か範囲を超えちゃう場合には,強制的に範囲の境界値にしてやる」みたいなことは極めて容易ですよね.
(コードの雰囲気的には,「上下(仰角)」と「左右(方角)」の2自由度を扱いたい程度の話にも見えるので,その2つの角度というのを直接管理しちゃえば何の悩みも無いということにならないのだろうか? っていう)
「更新演算の結果か範囲を超えちゃう場合には,強制的に範囲の境界値にしてやる」が(transform.localEulerAngles.x < 10)と(transform.localEulerAngles.x > 40)です。マウスの移動距離×フルーム時間が、想定してる値を急遽超えるため、超えた後に移動出来なくなるというものでした。なので、先にマウスの移動距離×フレーム時間の処理を現在のカメラの値に入力して超えるかどうかを見たうえで実際に反映するように変更しました。
あと上下と左右の角度の直接管理するというお話ですが、冒頭に書いている通り、特定のオブジェクトを中心にするとある通り上下の位置のコントロールとは少し違います。
ありがとうございました。