2016-11-14 21 views
2

嗨,我正在製作一個像zelda/mario64這樣的播放器控制器的小型3D平臺遊戲。
我想添加重置播放器後面相機的可能性。好吧,不是很難,但我想順利地做到這一點,相機在播放器周圍旋轉。
我發現了Vector3Slerp方法幾乎做我想要的。但是我不知道是否有可能迫使Slerp方法只在x,z方案上做出軌跡。我不想讓相機走到播放器的上方,而是轉過身。Unity Vector3 Slerp在想要的軸上

  • 有人知道僅在某些軸上纔有可能Vector3.Slerp()
  • 或者也許Vector3.Slerp()不是解決方案,那麼我該怎麼辦?

回答

1

我的猜測是你找的Transform.localEulerAngles(你可以找到更多關於它here)。我會做你的情況是讓你不想在這個其他移動和使用球面線性插值的軸(S):

Vector3 currentLocalEulerAngles = transform.localEulerAngles; 
Vector3 targetLocalEulerAngles = /*What you want*/ Vector3.zero; 
float slerpSpeed; 
transform.localEulerAngles = Vector3.Slerp(transform.localEulerAngles, new Vector3(currentLocalEulerAngles.x, targetLocalEulerAngles.y, targetLocalEulerAngles.z), slerpSpeed * Time.deltaTime); 

編輯:要清楚,我建議做有事情的這種方式記住在這種情況下,相機經常被放置爲的GameObject位於玩家。這樣,你只需要旋轉什麼可以稱爲CameraHolder球員(做你想要什麼)>CameraHolder(沿着局部軸旋轉)>相機(固定或得到振盪或者你想要的):)

EDIT2:這裏有一個小腳本,將你在尋找什麼(希望):你只需要設置你的相機爲您球員的孩子,把它,所以它「看起來」你球員與理想的距離/角度,最後加入這個CameraHolder腳本您相機

using UnityEngine; 

[RequireComponent(typeof(Camera))] 
public class CameraHolder : MonoBehaviour 
{ 
    [Range(0.0f, 10.0f)] 
    [SerializeField] 
    private float m_CameraResetSpeed = 4.0f; 

    [Range(0.0f, 10.0f)] 
    [SerializeField] 
    private float m_MinAngleToStopReseting = 2.0f; 

    private Transform m_CameraHolderTransform; 
    private Vector3 m_CameraHolderWorldEulerAngles; 
    private bool m_ResetingCamera; 

    void Start() 
    { 
     GameObject cameraHolder = new GameObject("CameraHolder"); 
     m_CameraHolderTransform = cameraHolder.transform; 
     m_CameraHolderTransform.SetParent(transform.parent); 
     m_CameraHolderTransform.localPosition = Vector3.zero; 
     m_CameraHolderTransform.localRotation = Quaternion.identity; 
     m_CameraHolderTransform.localScale = Vector3.one; 

     transform.SetParent(cameraHolder.transform); 

     m_CameraHolderWorldEulerAngles = m_CameraHolderTransform.eulerAngles; 

     m_ResetingCamera = false; 
    } 

    void LateUpdate() 
    { 
     if(m_ResetingCamera) 
     { 
      m_CameraHolderTransform.localEulerAngles = new Vector3(0.0f, 
       Mathf.LerpAngle(m_CameraHolderTransform.localEulerAngles.y, 0.0f, m_CameraResetSpeed * Time.deltaTime), 0.0f); 

      if(Mathf.Abs(m_CameraHolderTransform.localEulerAngles.y) < m_MinAngleToStopReseting) 
      { 
       Debug.Log("Reset done..."); 
       m_ResetingCamera = false; 
       m_CameraHolderWorldEulerAngles = m_CameraHolderTransform.eulerAngles; 
      } 
     } 
     else 
     { 
      m_CameraHolderTransform.eulerAngles = m_CameraHolderWorldEulerAngles; 
     } 
    } 

    public void ResetCamera() 
    { 
     Debug.Log("Reseting camera..."); 
     m_ResetingCamera = true; 
    } 
} 
+0

我懷疑你可能已經在這錯估了OP的意圖 - 它聽起來像願望是旋轉的攝像頭周圍的點(玩家位置),而不是僅僅在原地繞自身軸線。 – Serlite

+0

@Serlite你指出了我忘了添加到我的答案...(在我的腦海裏,它非常清楚,但我忘了添加它)。我會編輯我的答案。 – Kardux

+0

@Kardux我想要的行爲就是:[demo gif](http://gph.is/2gVkmZe)。只有在xz計劃中,相機在相機周圍的平穩旋轉才能將相機重置在後面。 –