我正在制作一款具有2D和3D元素一起放置在一个世界中的功能的游戏。在这里,您对可以在我的游戏中看到的混合方式有所了解。
我通过将相机放置在名为cameraHolder的游戏对象中并简单地沿其z轴旋转cameraHolder来实现此目的。这样,安装在支架上的摄像机始终与地面成41度角。现在您可以想象我需要旋转精灵以匹配2个值。首先是camera的z轴;第二,我必须在精灵上放置一个角度,以使其不“躺在”地面上,而始终面向相机。这是问题出现的地方。
这里有一个摄影机旋转的示例(chracter的sprite在z轴上旋转以匹配cameraHolder并保持其在x轴上的旋转,因此它始终面向摄影机。)
现在您会认为一切都很好,因为这实际上是我想要的外观。但是,偶尔地,我无法弄清是什么原因造成的,所有的精灵都会恢复为沿着地板躺下,从而打破了幻觉。尝试解决此问题时,我意识到我并没有真正理解它最初为什么起作用,也许我能永久解决此问题。
组织精灵旋转的脚本如下。
public class FaceCamera : MonoBehaviour {
public Transform target;
void Start()
{
target = GameObject.Find("MainCamera").GetComponent<Transform>();
}
void Update()
{
if (target != null)
{
this.transform.rotation = target.rotation;
}
}
}
我知道为了优化起见,我应该添加Mathf.roximately并比较这两个值,并且只有在其值更改后才执行此操作。但这是出于测试目的。
所以我的问题是。 为什么首先将我的精灵旋转设置为等于摄影机旋转。摄像机以欧拉角旋转为(-41,0,0)?
我尝试过的事情:
参考:
https://answers.unity.com/questions/48609/whats-the-difference-between-rotation-eulerangles.html
更新1
Transform cam;
[SerializeField] float threshold;
public static bool FastApproximately(float a, float b, float threshold)
{
return ((a - b) < 0 ? ((a - b) * -1) : (a - b)) <= threshold;
}
void Start()
{
cam = Camera.main.transform;
transform.rotation = cam.rotation;
}
void OnWillRenderObject()
{
if (!FastApproximately(cam.rotation.x, transform.rotation.x, 0.0001f))
{
transform.rotation = cam.rotation;
}
}