【问题标题】:Unity keep the player centered on the screenUnity 让玩家在屏幕上居中
【发布时间】:2017-08-04 05:03:37
【问题描述】:

我从一个小游戏开始,想在开始游戏时计算相机变换。

相机没有设置为 90 度,应该是 70 度左右。旋转它时,我需要计算 Z 上的差异,以使播放器保持在屏幕中间。

public Transform player; // player object
float offsetY = 30; // distance on y
float rotationAngleX = 70; // rotation when looking down

private void Start()
{
    player = Globals.GetPlayerObject().transform; // reference
    transform.Rotate(rotationAngleX, transform.rotation.y, transform.rotation.z); // rotate the camera down
    transform.position = new Vector3(player.position.x, player.position.y + offsetY, player.position.z); // move it to the player
}

那么我需要在这里计算什么,让玩家在中间?它应该总是有效的,所以如果我改变 y 的高度或将相机旋转 80 或 60 度,计算也应该有效。

谢谢!

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    看起来你需要在这里做一点三角函数。 如果相机是 70 度,而不是 90 度,这实际上意味着您在垂直轴和相机的投影中心之间有一个(90 度到 70 度)的角度。 既然我们知道tan(angle) = opposite/adjacent,我们可以推敲这个公式来找到在Z轴上偏移相机所需的“相反”距离。

    这给我们留下了类似的东西:offsetZ = offsetY*Mathf.Tan(Mathf.Deg2Rad(90f-70f));
    或者在您的通用情况下:offsetZ = offsetY*Mathf.Tan(Mathf.Deg2Rad*(90f-rotationAngleX));

    因此,如果您将相机向后移动偏移量,则播放器将居中。 下面美丽的 MS Paint 图片应该解释一下。

    transform.position = new Vector3(player.position.x, player.position.y + offsetY, player.position.z - offsetZ);
    

    【讨论】:

    • 嘿,这看起来不错。在编写float offsetZ = offsetY * Mathf.Tan(Mathf.Deg2Rad(90f - rotationAngleX)); 时,编译器说,Mathf.Deg2Rad 不能像方法一样使用。这是一个价值。所以我尝试写float offsetZ = offsetY * Mathf.Tan(Mathf.Deg2Rad * (90f - rotationAngleX));,但这不起作用,播放器停留在屏幕底部。
    • 哎呀,已修复。如果你做Debug.Log(offsetZ);,你在旋转 70 度和 30 度时得到 offsetZ 的值是多少?它应该与数学一致(~10.9f)。您是否将偏移应用到相机 z 位置?
    • 你可以在开始时使用光线投射。
    • @ryemoss 抱歉,我在后期更新功能中出现了错误。我写了transform.position = new Vector3(player.position.x, transform.position.y, player.position.z);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多