두 객체가 상호 작용하면 상호 작용 코드는 무엇입니까?


28

총알과 적, 또는 플레이어와 바닥을 생각하십시오. 이러한 객체가 상호 작용하면 상호 작용 코드는 무엇입니까?


2
어떤 방식으로 상호 작용합니까? 충돌 감지를 의미합니까? 그렇다면 충돌 감지 클래스와 충돌 해결 관리자를 모두 구현했을 가능성이 큽니다.
CaptainRedmuff 2018 년

부분적으로 그렇습니다. 충돌과 충돌 후의 일에 관심이 있습니다. 총알이 적과 가까워 졌는지 아니면 다른 방법으로 확인합니까? 그리고 충돌 후 어떤 일이 발생합니까? 탄환 물체는 적에게 물체가 닿았다고 말할 수 있습니까? 보시다시피 나는 모든 것에 대해 상당히 혼란스럽고 코드를 읽기가 매우 어렵습니다.
ThatOneGuy 2016 년

답변:


23

TL; DR :

게임 오브젝트는 서로에 대해 알지 못하고 다른 오브젝트에 대한 점검도 수행하지 않습니다. 게임 오브젝트를 확인하고 게임 물리를 시뮬레이션하기위한 적절한 조치를 수행하는 충돌 감지 및 충돌 해결 패턴을 작성합니다.

좋은 물건

충돌 감지를 작성 하고이 책을 읽으려는 이전의 시도에서 충돌 감지 및 충돌 해결을위한 두 단계가 있습니다. 첫 번째 단계 (충돌 감지)는 두 객체가 잠재적 충돌을 일으킬 수 있는지 여부를 결정하는 초기 단계입니다. 두 개체가 충돌 가능성을 형성하면이 개체를 두 번째 단계 (충돌 해결)로 전달하여 개체에 대해보다 세밀한 검사를 수행하고 충돌을 해결하려고합니다.

당신의 엔진 / 게임 어딘가에, 당신은 당신의 세계에있는 모든 물건들의 배열을 가질 것입니다. 각 프레임에서 배열을 반복하고 간단한 경계 상자 / 구면 충돌 감지를 통해 다른 모든 객체에 대해 각 객체를 검사합니다.

의사 코드 :

dectectCollisions(objects)
{
    for(objectA in objects)
    {
        for(objectB in objects)
        {
            if(objectA != objectB) //ignore self
            {
                if(BoundingSpheresIntersect(objectA, objectB))
                {
                    collisionResolver.addObjects(objectA, objectB);
                }
            }
        }
    }
}

이러한 종류의 루프는 다소 비효율적이지만 공간 분할을 사용하여 충돌하기에는 너무 멀리 떨어져있는 객체에 대한 초기 단계로서 개선의 여지가 남아 있습니다.

잠재적 충돌이 있는지 두 객체를 확인한 후 (즉, 두 객체가 충돌하기에 충분히 가까워진 경우)보다 정확한 충돌 감지 루틴을 수행하기 위해 객체가 전달됩니다.

임의의 모양과 크기의 다각형 두 개가 잠재적으로 교차 할 수있을만큼 가깝지만 형상으로 인한 것이 아니라고 상상해보십시오.

Google을 통해 찾은 이미지

경계 구체를 사용하면이 두 물체는 잠재적 충돌에 대해 오 탐지를 만듭니다. 여기에서 두 오브젝트가 실제로 교차하는지 여부를 판별하기 위해보다 철저한 패스를 수행해야합니다.

실제 충돌을 발견하면 충돌 해결 단계에서 게임 물리학의 세분성 및 요구에 따라 힘 또는 모멘트를 적용하여 오브젝트를 해결하는 적절한 조치를 수행합니다.

이를 염두에두고 충돌 감지 및 해결의 전체 프로세스를 추상화하여 개체가 서로에 대해 알 필요가 없으며 충돌을 확인하고 해결하는 데 필요한 프로세스도 수행 할 수 있습니다. 이를 처리하는 두 클래스 / 관리자는 충돌에 대한 빠르고 더러운 검사를 수행하기 위해 각 객체의 기본 속성 만 알고 있으면 더 철저한 검사가 필요합니다.


2
특히 중재자 디자인 패턴이 적합합니다. 관찰자 패턴은 좋은 대안이 될 것이며, 의도는 매우 다릅니다. 이 Stackoverflow 게시물 에서 꽤 좋은 요약을 얻을 수 있습니다 .
kurtzbot 2016 년

12

언리얼 엔진 3가 처리하는 한 가지 방법 :

총알에 충돌 메시지가 표시되어 충돌이 발생했다는 메시지가 표시됩니다. 그런 다음 objectHit.takeDamage (self)를 호출 할 수 있습니다. 그러면 대상은 해당 대상에 대한 포인터와 함께 TakeDamage 메시지를 가져 와서 적절한 조치를 취합니다.

이 접근 방식은 개인적으로 총알이 특수 행동을 수행 할 수 있고 (타격 유형에 따라 폭발 효과를내는 것과 같이) 대상이 총알 유형에 따라 특수 행동을 수행 할 수 있기 때문에 선호합니다.

글 머리 기호가 대상에 대해 수행 한 작업을 알고 objectHit.freeze (self)와 같이 대상에 함수를 호출 할 수도 있습니다. 그런 다음 목표는 그것이 얼어 붙은 무언가와 어떤 종류의 물체에 부딪쳤다는 것을 알고 있습니다.

편집 :이 답변은 UE3와 함께 작동하지 않기 때문에 작동 방법에 대한 일반적인 그림입니다. :)


10

도둑은 소스와 리셉 트론이있는 어두운 엔진에서이 작업을 매우 잘 수행했습니다. 객체는 유형이 다른 이러한 속성을 모두 가질 수 있습니다. 예를 들어, 물 화살표는 접촉시 WaterStim 소스를 갖습니다. 폭발에는 AoE FireStim이 있습니다.

물 화살이 물체에 부딪 치면, 대상 물체는 적절한 강도 값을 가진 WaterStim를 찾는 물체를 수용합니다. 그런 다음 명령과 관련된 모든 명령을 실행합니다 (이 경우 불타는 횃불을 횃불로 돌리고 연기 퍼프를 방출 함).

동일한 엔진이 SystemShock2에서 사용되기 때문에 이것은 모든 다른 피해 유형이 처리되는 방식이며, 다른 총알에는 다른 스팀 세트가 있으며, 다른 몬스터는 다른 스팀 유형에 대한 리셉터 론을 가지며 1 *, 2 *, 1 / 2 탄약 종류가 "슈퍼 효과적"인지 아닌지에 따라 강도.

레벨 에디터에서 오브젝트에 소스와 리셉 트론을 추가 할 수 있기 때문에 매우 유연한 시스템처럼 보입니다 (예를 들어, 불에 닿으면 열리는 일회성 문을 만들 수 있습니다). 메시지에 개체와 관련된 특수 스크립트가있는 경우

당신이 원하지 않는 것은 가능한 모든 객체와 충돌하는 모든 가능한 객체의 nXn 상호 작용 행렬을 하드 코딩해야합니다! 표준화 된 메시지를 통해 상호 작용을 일반화함으로써 프로세스를 단순화합니다.


스크립팅 관점에서이 접근 방식은 가장 유연하고 표현력이 뛰어납니다. 매우 시원합니다.
drhayes 2016 년

-2

한 가지 해결책은 총알과 플레이어의 컨테이너를 별도의 클래스로 유지 한 다음 프레임 루프가 상호 작용을 담당하는 main () 함수를 갖는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.