2016-11-14 58 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计划中,相机在相机周围的平稳旋转才能将相机重置在后面。 –