UNITY3D 如何检查相机的方向矢量?

UNITY3D How check direction vector of my camera?

我是 Unity 新手。我有 FPS 模式的游戏,相机随着鼠标的移动而旋转,太阳是定向光。我必须编写脚本来检查太阳是否在玩家的视野中。我以为我可以计算 2 个向量之间的角度,然后我决定太阳是否可见。第一个向量是:

var playerSun =  light.transform.position - camera.transform.position;

但是我对第二个有问题...我不知道应该使用哪个变量,camera.transform.forward 总是 (0,0,1)...

你能帮帮我吗?我将不胜感激。

Vector3 direction = light.position - player.position;
float dot = Vector3.Dot(direction.normalized, player.forward);
if(dot > 0) { Debug.Log("Sun is on the front"); }

点积returns两个向量对齐时为1,90度时为0,相反时为-1。

该值以弧度为单位,因此如果您需要 90 度的 FOV,它将是 45 度(因为 90 是左右 45),这是近似值。 0.7f.

if(dot > 0.7f) { Debug.Log("Sun is withing 90 degrees");}

有几种方法可以实现,但我建议使用 Raycast。 我想太阳不仅仅是一个点,它还有一些玩家可见的区域,所以即使他看不到太阳的中心点,他仍然可以看到它的一部分区域。如果是这样,我建议向 sun 对象添加一个新脚本,以便以编程方式识别它。然后确保它有附加的对撞机组件,其大小大约等于太阳。 然后在您想要检测太阳对玩家的可见性的脚本中,您可以执行类似的操作:

var ray = Camera.main.ScreenPointToRay(pos);    
RaycastHit hit;

        if (!Physics.Raycast(ray, out hit, 100))
            return false; //sun or any other collider wasnt hit

        var objHit = hit.collider.gameObject.GetComponent<Sun>();

所以 objHit != null 意味着玩家可以看到太阳拥有的任何区域。