2016-10-04 8 views
3

私のシーンに問題があります。私がやっているのは、2つのパネルがあり、どちらのパネルにもメソッド名RotateCamera()OnClick()リスナーを実行するボタンが1つあります。カメラがスムーズに回転を補間しません

Image 1

また階層内のスクリプトを添付MainMenugameobjectがあります。私が場面を再生し、MainCameraよりも​​ボタンをクリックすると、2番目のパネルの方向に90度回転します。スクリプトはうまくいきますが、そのボタンをクリックすると、カメラをそのパネルにスムーズに回転させたいと思います。今すぐ、回転しています。私はこのスクリプトで何が間違っているのか分かりません。

public class CameraSmooth : MonoBehaviour { 

    private bool check = false; 
    private Transform from; 
    private Transform to; 

    void Start(){ 
     from = Camera.main.transform; 
    } 

    void Update(){ 
     if (to != null) { 
      Camera.main.transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, 3 * Time.deltaTime); 
     } 
    } 

    public void RotateCamera(){ 
     if (!check) { 
      Camera.main.transform.Rotate (0,90f,0f); 
      to = Camera.main.transform; 
      check = true; 
     } 
     else if (check) { 
      Camera.main.transform.rotation = Quaternion.identity; 
      to = Camera.main.transform; 
      check = false; 
     } 
    } 
} 
+0

カメラがすぐに回転する問題はありますか?それはあなたのコードが現在行っているように見えるからです。 – Serlite

+0

@Serliteはいすぐに回転します! – hamel123

答えて

3

ここでの主な問題は、あなたがRotateCamera()Camera.main.transform.Rotate()を呼んでいるということです。これにより、回転がカメラに直ちに適用され、あなたが見ている瞬間的な回転が生じます。

別の小さな誤解 - Transformが参照型であるため、fromtoは、常に実際には同じインスタンス(カメラのTransform)を指します!最後に、3 * Time.deltaTimeの値は常に平均約3/60であり、補間を完了するために必要な1に近づくことは決してありません。したがって、次の行:

Camera.main.transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, 3 * Time.deltaTime); 

最初の問題が処理されても何も処理できません。

状況が私の見解では、別のソリューションを求めて:カメラの初期回転のトラックをQuaternion変数にターゲットの回転を保存するのではなくTransformにそれらを直接設定し、維持

  1. 回転の進行を追跡するタイマーを維持する(または、Slerp()を放棄し、増分回転を直接適用することも可能です)。

  2. ここ

はあなたのコードに私の提案の更新です:

public class CameraSmooth : MonoBehaviour { 

    private bool check = false; 
    private float rotationProgress = 1; 
    private Quaternion initial; 
    private Quaternion from; 
    private Quaternion to; 

    void Start(){ 
     // Cache the starting rotation, so we can calculate rotations relative to it 
     initial = Camera.main.transform.rotation; 
    } 

    void Update(){ 
     if (rotationProgress < 1) { 
      rotationProgress += 3 * Time.deltaTime; 
      Camera.main.transform.rotation = Quaternion.Slerp (from, to, rotationProgress); 
     } 
    } 

    public void RotateCamera(){ 
     from = Camera.main.transform.rotation; 
     rotationProgress = 0; 

     if (!check) { 
      to = initial * Quaternion.Euler(0,90f,0f); 
      check = true; 
     } 
     else if (check) { 
      to = initial; 
      check = false; 
     } 
    } 
} 

(このコードをテストしたので、何か問題がある場合は私に知らせてくださいていないことがあります。)これが役に立てば幸い!ご質問がある場合はお知らせください。

関連する問題