Unity 6.3
0 онлайн 95 гостей 3 в системе
Вход
2D разработка игр Шаг 163 из 198

Проверка пересечений LowLevelPhysics2D и API

Примечание: Эта документация посвящена написанию C# скрипты с использованием LowLevelPhysics2D API. Использовать 2D физики в Unity Editor используя компоненты, такие как Rigidbody 2D компонент, см. 2D физика вместо этого.

Чтобы проверить, будут ли физические объекты 2D перекрываться или столкнуться, также известные как пересечения, используйте методы запроса LowLevelPhysics2D API.

Используйте один из следующих методов:

  • PhysicsQuery API для проверки на пересечения. Например, PhysicsQuery.CapsuleAndCircle для проверки на то, пересекается ли капсула с кругом.
  • Метод Intersect геометрии объекта для проверки, не перекрывается ли он с другим геометрическим объектом. Например, CapsuleGeometry.Intersect.

Объект мира также имеет следующие методы:

  • Методы, которые бросают лучи или формы. Например, PhysicsWorld.CastRay или PhysicsWorld.CastGeometry.
  • Методы тестирования перекрытия, возвращающие true, если точка или форма перекрывает другой объект. Например, PhysicsWorld.TestOverlapAABB.
  • Методы перекрытия, которые возвращают объекты, перекрывающие точку или форму. Например, PhysicsWorld.OverlapCircle.

Все методы безопасны для потоков. Дополнительные сведения см. в Оптимизация LowLevelPhysics2D API с многопоточной обработкой.

Важно: Эти методы возвращают типы NativeArray, которые необходимо удалить, чтобы освободить используемую память. Дополнительные сведения см. в Уничтожение объектов и управление памятью.

Пример

Чтобы провести лучи, чтобы проверить, столкнется ли фигура с другими фигурами, используйте CastGeometry API.

Например, следующий скрипт проверяет, столкнется ли маленький падающий круг с объектами под ним. Прикрепите скрипт к GameObject и перейдите в режим воспроизведения, затем используйте флажок Big Circle для переключения объекта под падающим кругом.

using UnityEngine;
using UnityEngine.LowLevelPhysics2D;
using Unity.Collections;

public class CastGeometryExample : MonoBehaviour
{
    private PhysicsWorld world;
    public bool BigCircle;

    void Start()
    {
        world = PhysicsWorld.defaultWorld;

        // Create a small falling circle
        CircleGeometry object1Geometry = CircleGeometry.Create(0.5f, new Vector2(0.5f, 8f));
        PhysicsBody object1 = world.CreateBody(new PhysicsBodyDefinition
        { 
            position = object1Geometry.center,
            type = PhysicsBody.BodyType.Dynamic
        });
        object1.CreateShape(object1Geometry);

        if (BigCircle)
        {
            // Create a larger static circle below
            CircleGeometry object2Geometry = CircleGeometry.Create(3f, new Vector2(0f, 0f));
            PhysicsBody object2 = world.CreateBody(new PhysicsBodyDefinition
            { 
                position = object2Geometry.center,
                type = PhysicsBody.BodyType.Static
            });
            object2.CreateShape(object2Geometry);
        }

        // Set translation and filter for the cast
        Vector2 translation = new Vector2(0, -10f); // Move downwards
        PhysicsQuery.QueryFilter filter = new PhysicsQuery.QueryFilter();

        // Cast the circle geometry through the world
        NativeArray<PhysicsQuery.WorldCastResult> results = world.CastGeometry(object1Geometry, translation, filter, PhysicsQuery.WorldCastMode.Closest, Allocator.Temp);

        if (results.Length > 0)
        {
            Debug.Log("Collision will occur!");
        }

        // Dispose of the NativeArray to free memory
        results.Dispose();
    }
}

Дополнительные ресурсы