Unity C# Проверьте, не виден ли GameObject для камеры ПРОБЛЕМА - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть скрипт AimBot, который проверяет, сколько врагов на уровне, находятся ли они в диапазоне спецификаций и теперь, если они видны с камеры. Я нашел эти два кода, но оба говорят, что враг за стеной виден. Извините за плохой английский sh ^^

Код1

    //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;
    }

Player_Cam Minimap_Cam

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Важно отметить, что Renderer.isVisible может возвращать true по причинам, отличным от прямой видимости, ie. тень. Это прокомментировано в документах Unity3D: https://docs.unity3d.com/ScriptReference/Renderer-isVisible.html

Существующий код, который вы используете для хорошей первой проверки, чтобы отфильтровать объекты, которые могут быть быстро определены как невидимые (особенно проверка Frustum). Но когда эти проверки возвращаются видимыми, вам может потребоваться выполнить дополнительные проверки, чтобы убедиться, что объект действительно виден. Для этого вы, вероятно, захотите выполнить серию лучевых трансляций.

Однако вы не сможете просто сделать лучевую трансляцию прямо в центре каждого персонажа, потому что персонаж может быть частично закрыт. В зависимости от потребностей вашей программы, я бы порекомендовал лучевую передачу по центру и всем 8 углам ограничительной рамки объекта. (Если ваши персонажи были завернуты в коробочный коллайдер, вы можете использовать это для своих углов.) Возможно, вам придется сделать больше, если вам нужно обнаружить видимость с помощью маленьких windows или любых других.

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

0 голосов
/ 21 февраля 2020

В первом примере кода вы проверяете, находится ли игровой объект на расстоянии менее 0 единиц от плоскости обзора. Это только проверяет, находится ли объект «позади» плоскости.

renderer.isVisible вернет истину, если MeshRender должен быть визуализирован. В вашем примере враги не целиком прикрыты стеной, поэтому их do необходимо визуализировать. Однако этот подход должен работать в том случае, если они полностью скрыты.

Я думаю, вам следует проверить isVisible, чтобы определить, находится ли объект в поле зрения камеры. затем, если вы считаете частичное покрытие как покрытие, выполните приведение лучей, чтобы проверить объекты, которые визуализируются , но частично покрыты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...