始终在播放器前显示对象

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

我有这些代码行在播放器的某个旋转处在我的播放器前面显示我的canvas对象(代码中的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从上到下旋转时,它显示(活动)Canvas在最顶部位置。 如何限制canvas显示在相同位置( 无论播放器从上到下旋转还是向下旋转 ),但显示在播放器对象的前面?

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

 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) { ... } 

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

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

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

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

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

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

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

 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; 

同样,这可能无法解决您的所有问题,但有助于确保您的canvas位于与玩家水平的设定距离,并且还将补偿玩家的上下运动。