我是Unity的新人。我用FPS模式玩游戏,用鼠标移动相机旋转,太阳是定向光。我必须写脚本,检查太阳是否在玩家的视野中。我以为我可以计算2个向量之间的角度然后我决定太阳是否可见。第一个向量是:
var playerSun = light.transform.position - camera.transform.position;
但我对第二个问题有疑问......我不知道应该使用哪个变量,camera.transform.forward总是(0,0,1)...
你能帮帮我吗?我将非常感激。答案 0 :(得分:3)
Vector3 direction = light.position - player.position;
float dot = Vector3.Dot(direction.normalized, player.forward);
if(dot > 0) { Debug.Log("Sun is on the front"); }
当两个向量对齐时,点积返回1,当它们为90度时返回0,当它们相反时返回-1。
该值以弧度为单位,因此如果您需要90度FOV,它将是45度(因为90是45左右),这是适当的。 0.7F。
if(dot > 0.7f) { Debug.Log("Sun is withing 90 degrees");}
答案 1 :(得分:1)
有几种方法可以实现这一点,但我建议使用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意味着玩家可以看到太阳所在区域的任何部分。