我正在通过操纵杆制作第三人称手机游戏。我设置了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
但这会导致无限旋转,因为我不知道如何检查是否已达到所需位置。
我希望有人能提供帮助。这是一个很长的帖子。 :(
答案 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的经验,效果很好,您希望获得平滑的过渡,或者寻找两点之间的平滑过渡,即插值,在这种情况下为线性插值。