![](/img/trans.png)
[英]How to get sprite following mouse position when camera is rotated 30 degree on X axys on UNITY3D?
[英]How to create a 180 degree camera orbit over X seconds in Unity?
我有一个围绕屏幕上一个点运行的相机。 单击并左右拖动鼠标将围绕焦点运行,释放鼠标将使相机保持在该角度。
我正在尝试创建一个功能,可以平滑地将相机旋转 180 度。 因此,例如,如果相机在“玩家”的后面并且这个函数被调用,相机将在 X 秒的过程中绕到玩家的前面,并停在它开始位置的完全相反的位置。
这是我目前用于基于鼠标单击和拖动进行相机旋转的代码:
Quaternion camTurnAngle =
Quaternion.AngleAxis(Input.GetAxis("Mouse X") * rotationSpeed, Vector3.up);
this.cameraOffset = camTurnAngle * this.cameraOffset;
Vector3 newPos = this.currentFocusPoint + this.cameraOffset;
transform.position = Vector3.Slerp(transform.position, newPos, smoothFactor);
transform.LookAt(this.currentFocusPoint);
我试图用一个 UI 按钮(又名,单个函数调用)替换这个基于鼠标拖动的相机旋转,该按钮将在短时间内完全围绕相机旋转 180 度,然后如果再次按下它会向后旋转。 这是一张 MS 绘画图,以防我的解释令人困惑:
我不确定如何处理这样的事情。 这听起来类似于使用Vector3.Slerp
,但我找不到有效的解决方案。 我离解决方案还很远,我真的没有任何合理的代码可以发布。 我只想说到目前为止我已经尝试了两种方法:
1)我试过使用transform.RotateAround
,我传入的角度是rotateSpeed * Time.deltaTime
。 我的问题是我不知道如何检查结束条件,如果没有,我的相机将永远旋转。
2)我试过搞乱Quaternion.Slerp
,但看到的结果不是我所期望的。
我怎样才能实现平滑的 180 度相机轨道,这需要预定的时间才能完成?
这是协程的教科书用法。 基本上,启动跟踪有多少时间在轨道上留下,然后可以更新协程cameraOffset
基于剩下的时间或Time.deltaTime
,不管是短。
private IEnumerator RotateCam(float rotateDuration)
{
float timeLeft = rotateDuration;
// possibly - disable control of camera here
while (timeLeft > 0)
{
yield return null;
float elapsedRotationTime = Mathf.Min(timeLeft, Time.deltaTime);
float angleThisFrame = 180f * elapsedRotationTime / rotateDuration;
Quaternion camTurnAngle = Quaternion.AngleAxis(angleThisFrame, Vector3.up);
this.cameraOffset = camTurnAngle * this.cameraOffset;
transform.position = this.currentFocusPoint + this.cameraOffset;
transform.LookAt(this.currentFocusPoint);
timeLeft -= Time.deltaTime;
}
// possibly - re-enable control of camera here
}
然后,当您要开始旋转时:
// private Coroutine rotateCoroutine
this.rotateCoroutine = StartCoroutine(RotateCam(2f));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.