我有一个AimBot脚本来检查水平上有多少敌人,如果他们在一个特定的范围内,现在他们是否可以从摄像机中看到。我找到了这两个密码,但都说墙后面的敌人是看得见的。对不起英语不好^^
Code1
//https://answers.unity.com/questions/8003/how-can-i-know-if-a-gameobject-is-seen-by-a-partic.html
bool IsTargetVisibleV1(Camera c, GameObject go)
{
var planes = GeometryUtility.CalculateFrustumPlanes(c);
var point = go.transform.position;
foreach (var plane in planes)
{
if (plane.GetDistanceToPoint(point) < 0)
return false;
}
return true;
}
代码2
bool IsTargetVisibleV2(Camera cam,Renderer[] ren)
{
foreach (Renderer renderer in ren)
{
if (renderer.isVisible)
{
return true;
}
}
return false;
}
发布于 2020-02-21 08:13:18
需要注意的是,除了直接可见性之外,Renderer.isVisible还可能返回true。阴影。在Unity3D docs:https://docs.unity3d.com/ScriptReference/Renderer-isVisible.html中有注释。
您所做的现有代码可以进行良好的第一次检查,以筛选出可以快速确定为不可见的对象(特别是结果检查)。但是,当这些检查返回可见时,您可能需要执行额外的检查,以确保对象是真正可见的。为此,您可能要执行一系列的光线投射。
但是,你不能仅仅在每个角色的中心直接进行射线投射,因为一个角色可能会被部分屏蔽。根据您程序的需要,我建议对对象的包围框的中心和所有8个角落进行光线投射。(如果您的字符被包装在盒对撞机中,您可以将其用于您的角。)如果您需要通过小窗口或其他方法检测可见性,则可能需要做更多的工作。
RaycastHit hit;
//Do we hit any geometry?
Physics.Raycast(cameraOrigin, targetPoint, out hit, maxDistance, layermask);
如果您有一个完全包含您的字符的collider
,那么使用hit.collider
很容易进行检查。
https://docs.unity3d.com/ScriptReference/Physics.Raycast.html
发布于 2020-02-21 07:49:56
在第一个代码示例中,您将检查游戏对象是否与任一视图平面之间的距离小于0单位。这只会检查物体是否在飞机的“后面”。
如果需要呈现renderer.isVisible
,则MeshRender将返回true。在您的示例中,敌人并不是完全由墙壁覆盖的,因此它们确实需要渲染。但是,在完全模糊的情况下,这种方法应该有效。
我认为您应该检查isVisible
,以确定该对象是否处于摄像机视图中。然后,如果将部分覆盖计算为覆盖,则执行射线转换以检查呈现为但部分覆盖的对象。
https://stackoverflow.com/questions/60327456
复制相似问题