2016-05-07 7 views
0

これは私が本当にしたいことを達成しません。基本的には、最大値に達するまで空の周りを回転します。このコードを使用すると、うまく動きます。 「最大」角度は、最初に移動する方法に基づいて変化します。最大回転角度を設定する方法はありますか?UnityでRotateAroundの最大角度を設定できますか?

using UnityEngine; 
using System.Collections; 

public class CameraMovement : MonoBehaviour { 
    Transform rotAround; 
    public float maxRotation = 0; 
    // Use this for initialization 
    void Start() { 
     rotAround = GameObject.Find ("CamRotation").GetComponent <Transform>(); 
    } 

    // Update is called once per frame 
    void Update() { 
     if (Input.GetKey (KeyCode.D) && maxRotation < 52.0f) { 
      transform.RotateAround (rotAround.position, Vector3.down, 100 * Time.deltaTime); 
      maxRotation += 1; 
     } 
     if (Input.GetKey (KeyCode.A) && maxRotation > -52.0f) { 
      transform.RotateAround (rotAround.position, Vector3.up, 100 * Time.deltaTime); 
      maxRotation -= 1; 
     } 
    } 
} 
+0

100 * Time.deltaTimeは1に等しくありません。間違った仮定です。事実、Time.deltaTimeが次のフレームになるのは決してわかりませんが、おおよそ1/60だから、0.016667です。 – yes

+0

@MikeSmithあなたは定数である 'Time.deltaTime'を決してカウントしてはいけません。これは、現在のフレームと最後のフレームの間を経過した時間だけです。これにより、不規則なフレームレートで計算を規制するのに便利です。 –

+0

@yes Mm、申し訳ありませんが、私はしませんでした。私はフレームレートの時間だと思っていましたが、それは変わる可能性があります。オリジナルの50で、カメラの動きが遅すぎたので、私は100を使用しました。あなたが他の誰かにコメントしていない限り。 –

答えて

0

各フレームに1〜maxRotationを追加しています。 Time.deltaTimeを追加する必要があります。それ以外の場合は、フレームレートに応じて異なる時刻にmaxRotationにアクセスします。これを変更するだけで、GameObjectがどのように回転しても同じ角度で停止するはずです。

これはすばやく簡単な方法です。もう一つは数学をすることです。 rotateAroundtransform.positionとカメラの開始transform.positionの差のarctan(Mathf.Atan2を使用)を見つけて、カメラの現在のtransform.positionからrotateAround位置を引いたものを減算すると、現在の角度(以下の例)が得られます。この値を使用して、ローテーションを続行するかどうかを確認できます。 Atan2の動作の詳細については、this answerを参照してください。

Mathf.Atan2は、渡されたベクトルとX軸の間の角度(ラジアン単位)を返します(おそらくこれは望ましくありません)。私はfind the angle between three vectors(あなたが望むと思う)と思う。それぞれのarctansの違いを取らなければならない(私はこれをチェックしていないし、簡潔さのために擬似コードだ)。これと同じように:

float angle = 
Atan2(cameraStartPos.y - rotatePointPos.y, cameraStartPos.x - rotatePointPos.x) - 
Atan2(cameraCurrentPos.y - rotatePointPos.y, cameraStartPos.x - rotatePointPos.x); 

よりもさらに良いことには、団結を持っているあなたのためのすべてのことを行います!使用Vector3.Angle:角度は、それが180に到達したときに「フリップ」ので、あなたがいずれかにあなたの最大角度を設定することができますVector3.Angleから返されたことを

public class CameraMovement : MonoBehaviour { 

    Transform rotAround; 
    private Vector3 startPosition; 
    public float maxRotation = 0; // set this to the maximum angle in degrees 

    void Start() 
    { 
     rotAround = GameObject.Find ("CamRotation").GetComponent <Transform>(); 
     startPosition = transform.position; 
    } 


    void Update() 
    { 

     float currentAngle = Vector3.Angle(rotAround.position - startPosition, 
              rotAround.position - transform.position)); 

     if (Input.GetKey (KeyCode.D) && maxRotation < currentAngle) 
     { 
      transform.RotateAround (rotAround.position, Vector3.down, 100 * Time.deltaTime); 
     } 

     if (Input.GetKey (KeyCode.A) && maxRotation < currentAngle) 
     { 
      transform.RotateAround (rotAround.position, Vector3.up, 100 * Time.deltaTime); 
     } 
    } 
} 

注:

float angle = Vector3.Angle(rotateAround.position - cameraStart.position, 
          rotateAround.position - cameraEnd.position)); 

あなたの最終的なコードのようなものを見ることができます値は180より低く、両側の同じ点で停止します。

-1

最大値と最小値の範囲でRandom.Range(最小値、最大値)を使用して、その角度を回転に割り当てないのはなぜですか。

+0

上記のコードは現在、おそらく一見無作為な挙動を示しているにもかかわらず、OPはランダムな境界を求めていないので、どのようにランダムに役立つでしょうか? – yes

+0

F/o reyan、良い試み... – Gammer

関連する問題