使用transform.RotateAround()

时间:2018-10-05 10:16:50

标签: unity3d

我正在通过操纵杆制作第三人称手机游戏。我设置了joystick.vertical,根据他所处的位置将字符向前或向后移动,joystick.horizontal则将字符转向。由于相机是角色的父代,因此相机始终位于角色的后面。

使用Camera.main.transform.RotateAround()功能,通过触摸屏在屏幕上滑动相机,使摄像机围绕播放器旋转,而transform.LookAt()确保我一直在看角色。

我的问题:我希望在滑动时放开相机,使其回到角色后面的原始位置,但要以平稳的动作或以设定的速度在玩家周围移动

我的解决方案1 ​​:要为角色加上一个空白的gameObject,并将其放置在我希望相机还原到的位置,并在鼠标移到该位置时调用此位置放手。

float spanCamera = -Joystick.Horizontal;

Camera.main.transform.LookAt(rb.transform.position);
if (spanCamera != 0)
    Camera.main.transform.RotateAround(rb.position, Vector3.up, spanCamera * Time.fixedDeltaTime * spanSpeed);

else if (Input.touchCount <= 1)
{
    float var6 = var5 * Time.deltaTime;

    Camera.main.transform.position = camPos.transform.position;

    Camera.main.transform.LookAt(camLookAt.transform.position);
}

这段代码可将相机立即移回起始位置,而无需进行平滑处理。

解决方案2 :改为使用Vector3.MoveTowards()

// Camera.main.transform.position = camPos.transform.position;

Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, camPos.transform.position, var6);

此代码使我可以平滑地直线移动到起始位置 。我希望它绕过播放器。

因此,我尝试了另一种方法,在该方法中,如果摄像机向右转,则分配一个浮点值1,并检查旋转按钮是否被松开,以及在{{1}内该值是否为1 }块。

if

但这会导致无限旋转,因为我不知道如何检查是否已达到所需位置。

我希望有人能提供帮助。这是一个很长的帖子。 :(

2 个答案:

答案 0 :(得分:1)

您可以将假人gameObject作为播放器的子代,将相机作为假人的子代。

这样,相机便看着gameObject的中心:播放器所在的位置。相机也会随着播放器旋转,因此它始终位于播放器后面。

现在,您知道当Mathf.Approximately(dummy.transform.localEulerAngles.y, 0.0f)时,相机位于播放器后面。 [1] [2]

知道了这一点,您可以检查播放器何时停止滑动并开始慢慢旋转回去。

// If the player let go and camera is not behind the player
if (!playerIsSwiping && !Mathf.Approximately(dummy.transform.localEulerAngles.y, 0.0f))
{
    // Slowly rotate until the camera is behind the player
    dummy.transform.RotateAround(Vector3.zero, Vector3.up, rotationSpeed * Time.deltaTime);
}

答案 1 :(得分:0)

尝试这个伙伴:

// Maximum turn rate in degrees per second.
 public float turningRate = 30f; 
 // Rotation we should blend towards.
 private Quaternion _targetRotation = Quaternion.identity;
 // Call this when you want to turn the object smoothly.
 public void SetBlendedEulerAngles(Vector3 angles)
 {
   _targetRotation = Quaternion.Euler(angles);
 }

 private void Update()
 {
    // Turn towards our target rotation.
    transform.rotation = Quaternion.RotateTowards(transform.rotation, _targetRotation, turningRate * Time.deltaTime);
 }

我找到了here

根据我自己使用LERP的经验,效果很好,您希望获得平滑的过渡,或者寻找两点之间的平滑过渡,即插值,在这种情况下为线性插值。