始终在玩家面前显示对象

时间:2017-04-10 11:21:43

标签: c# canvas unity3d

我遇到了这个简单的问题,但无法理解为什么我无法控制它。

我有这些代码行在播放器的某个轮换中在我的播放器前面显示我的画布对象( camRotationToWatch 代码中的对象名称)。

if (camRotationToWatch.transform.localEulerAngles.x >= navigationCanvasXMinmumLimit && camRotationToWatch.transform.localEulerAngles.x <= navigationCanvasXMaximumLimit)
        {
            if (!navCanvasHasDisplay) 
            {

                navigationCanvas.SetActive(true);
                //Debug.Log(camRotationToWatch.transform.forward);
                Vector3 navCanvas = camRotationToWatch.transform.position + camRotationToWatch.transform.forward * navCanvasDisplayDistanceFromCam;
                navCanvas = new Vector3(navCanvas.x, 2f, navCanvas.z);
                navigationCanvas.transform.position = new Vector3(navCanvas.x, navCanvas.y, navCanvas.z);

                navigationCanvas.transform.rotation = camRotationToWatch.transform.rotation;

                navCanvasHasDisplay = true;

            }
        }

        else
        {
            //navigationCanvas.SetActive(false);
            if (locationPanel.activeSelf == false && infoPanel.activeSelf == false) {
                navigationCanvas.SetActive(false);
                navCanvasHasDisplay = false;
            }
        }

camRotationToWatch 对象从向下旋转到向上并且Canvas显示在正确的位置但是当我尝试旋转 camRotationToWatch时,此代码实际上工作正常strong>从向上它显示(活动)画布在最高位置。如何限制画布显示在相同位置(无论播放器从上到下旋转还是向上旋转),但显示在播放器对象的前面?

2 个答案:

答案 0 :(得分:2)

有点难以弄清楚你想要做什么。但这就是我认为你想做的事情

public GameObject follow; // The object you want to rotate around
public float distance = 2; // Distance to keep from object

private void Update() {
    Vector3 forward = follow.transform.forward;
    forward.y = 0; // This will result in Vector3.Zero if looking straight up or down. Carefull

    transform.position = follow.transform.position + forward * distance;
    transform.rotation = Quaternion.LookRotation(forward, Vector3.up);
}

我相信你的“意外行为”是由于使用欧拉角,因为它们并不总是完全可预测的。尽可能尝试使用Quaternions或Vector3.Angle()。

如果您想限制角度(例如......如果向下或向上俯视超过45°禁用对象),您可以执行以下操作:

if (Vector3.Angle(forward, follow.transform.forward) > maxAngle) { ... }

答案 1 :(得分:0)

这可能不是一个完整的答案,但可能有所帮助。这一行:

Vector3 navCanvas = camRotationToWatch.transform.position + camRotationToWatch.transform.forward * navCanvasDisplayDistanceFromCam;

您正在距camRotationToWatch固定距离创建一个位置。但是,如果该对象向上或向下看,那么该位置在navCanvasDisplayDistanceFromCam处不是水平。如果它直视,那么这个位置实际上直接位于上方。

所以当你这样做时设置一个固定的垂直高度:

navCanvas = new Vector3(navCanvas.x, 2f, navCanvas.z);

您距离camRotationToWatch的距离是否与您认为的距离不同。 而不是使用camRotationToWatch.transform.forward,从中创建一个向量并将Y组件清零,并在使用它来偏移位置之前进行标准化。 (尽管如此,你需要注意零长度向量)。 无论是否能解决您的问题,它都难以猜测,但它应该有助于改善您的结果。

编辑:这是一个如何避免画布过于接近的问题的示例:

Vector3 camForward = camRotationToWatch.transform.forward;
camForward.y = 0;
if (camForward.magnitude == 0)
{
    //TODO: you'll need to decide how to deal with a straight up or straight down vector
}
camForward.Normalize();
//Note: now you have a vector lying on the horizontal plane, pointing in
//the direction of camRotationToWatch
Vector3 navCanvas = camRotationToWatch.transform.position + camForward * 
    navCanvasDisplayDistanceFromCam;
//Note: if you want the canvas to be at the player's height (or some offset from), 
//use the player's y
navCanvas = new Vector3(navCanvas.x, Player.transform.y, navCanvas.z);
navigationCanvas.transform.position = navCanvas;

同样,这可能无法解决您的所有问题,但有助于确保您的画布位于距离播放器水平的设定距离,并且还会补偿播放器的上下运动