특정 상황에서 일부 객체와의 충돌 무시


14

Unity에서 자동차로 레이싱 게임을 만들고 있습니다. 자동차에 부스트 / 니트로 파워 업이 있습니다. 부스팅하는 동안 좀비와 충돌 할 때 벗어나고 싶지 않지만 벽과 충돌 할 때 벗어나고 싶습니다.

반면에, 나는 좀비와의 충돌을 무시하고 싶지 않습니다. 왜냐하면 나는 여전히 충돌에 충돌하기를 원하기 때문입니다.

어떻게 처리해야합니까? 기본적으로, 내가 원하는 것은 특정 물체와 충돌 할 때 자동차가 회전하지 않는 것입니다.

답변:


7

런타임시 레이어 조작을 고려하십시오.

전체 레이어가있는 특정 객체에 대한 충돌 활성화 / 비활성화

Physics.IgnoreCollisionPhysics.IgnoreLayerCollision을 사용하면 두 콜 라이더 간 및 두 레이어 간 충돌을 비활성화 할 수 있습니다.

특정 충돌체를 충돌에서 제외하려면 그렇게 할 수있는 방법이 없습니다. 트리거되지 않은 충돌체와 함께 운동학이 아닌 강체를 사용하는 경우 태그별로 응답을 필터링하려고해도 항상 응답이 있습니다.

프로젝트에서이 작업을 수행 한 방법은 "Void"라는 레이어를 만드는 것입니다. 공허는 전혀 충돌하지 않습니다.

이제 레이어를 "Void"로 설정하여 충돌체의 충돌을 일시적으로 비활성화하고 이전 레이어를 복원하여 다시 활성화 할 수 있습니다.

요점은 다음과 같습니다.

int oldLayer = -1;
int voidLayer;

void Start()
{
    voidLayer = LayerMask.NameToLayer("Void");
}

void DisableCollider(Collider col)
{
    oldLayer = col.gameObject.layer;
    col.gameObject.layer = voidLayer;
}

void EnableCollider(Collider col)
{
    col.gameObject.layer = oldLayer;
}

우리는 특히 딱딱한 몸체의 자식 인 충돌체를 활성화 및 비활성화하여 실제로 상황을 망칠 수 있기 때문에 이렇게했습니다. 따라서 복합 강체 충돌체의 일부를 안정적으로 비활성화 할 수는 없지만 복합 충돌체 부분 중 하나의 레이어를 안정적으로 교체 할 수 있습니다.

이제 특정 상황

좀비 충돌이 자동차에 미치는 영향을 줄이려면 좀비를 운동 학적 강체 트리거로 만들거나 그렇지 않으면 질량을 매우 작게 (float.Epsilon과 같이) 만들어서 자동차의 운동량에 영향을주지 않도록하십시오. 임팩트시이 레이어 스위치를 사용하여 첫 번째 충돌이 차체에 무시할만한 힘을가하더라도 후속 충돌이 발생하지 않도록 할 수도 있습니다.

자동차와 충돌하지 않는 레이어로 전환 할 수도 있습니다.

도망 칠 때 활성화되는 좀비에 다른 충돌기를 놓을 수도 있습니다. 이렇게하면 OnTriggerEnter에 충격을 가할 수 있습니다. 당신은 그것으로 정확하게 얻을 수는 없지만, 접촉 법선이 좀비를 재미있게 던지기에 충분했을 정도로 대략적인 위치를 추정 할 수 있습니다.

당신은 스스로에게 물어야합니다 :

  • 내 차로 도망친 좀비를 두드리고 싶습니까, 아니면 그냥 죽음의 애니메이션을 재생해야합니까?

  • 좀비를 쳐서 자동차의 속도와 각속도가 더 작은 방식으로 영향을 받습니까?


1

자동차가 부스트하기 시작할 때 모든 좀비에서 Physics.IgnoreCollision 을 호출 하고 플레이어 객체에도 함수를 전달하십시오. 이것은 유니티가 플레이어와 좀비 사이의 충돌에 반응하지 않게합니다. 차가 부스팅을 마치면 Physics.IgnoreCollision각 좀비를 다시 호출 하여 플레이어 오브젝트를 전달하고 false충돌 응답을 다시 시작하십시오.


그러나 이것은 다른 것과 충돌하지 않을 것임을 의미합니다.
Paul Manta

좀 더 연구하겠습니다. 내가 생각할 수있는 유일한 것은 : OnCollisionEnter에서 false를 반환하여 충돌을 무시할 수 있습니까?
Wackidev

@Wackidev 이것은 사실이 아니다.
Rhys van der Waerden

@Paul 내 답변을 편집했습니다.
Wackidev

0

객체의 이름을 확인하거나 객체 클래스에 이름 값을 추가 한 다음 확인할 수 있습니까?

bool boosting = false; //need a trigger in the game to set this to true.

function OnCollisionEnter(theCollision : Collision)
{   
    if (boosting == true)
    {
        if(theCollision.gameObject.name == "Zombie")
        {
              Debug.Log("Zombie hit during boost");              
        }
        else if(theCollision.gameObject.name == "Wall")
        {
              Debug.Log("Wall hit during boost");            
        }
    }
    else 
    {
        if(theCollision.gameObject.name == "Zombie")
        {
              Debug.Log("Zombie hit not in boost");              
        }
        else if(theCollision.gameObject.name == "Wall")
        {
              Debug.Log("Wall hit not in boost");                
        }
    }
}

그런 다음 부스팅을 확인하고 검사에 추가하는 데 사용할 수있는 다른 변수가 있습니다.

편집 :이 변수를 추가했습니다.


그는 충돌 알림을받는 방법을 알고 있습니다. 그는 결과적으로 어떤 행동도 취하기를 원하지 않습니다. 특정 경우에 내장 충돌 응답을 비활성화하려고합니다.
Wackidev

충돌이 발생했을 때 어떤 일이 발생하든 브래킷 사이는 확실합니까? 나는 전에 화합을 사용하지 않았기 때문에 cocos2d에서는 알지 못했지만 XNA는 그렇게했습니다.
Lewis

실제로 Unity는 PhysX를 통해 충돌 자체를 처리합니다. OnCollisionEnter는 알림 방법 일뿐입니다. 실제 충돌 응답을 처리하도록 설계되지 않았습니다.
Wackidev

0

물리 엔진을 사용하여 물체가 충돌 할 때 모양 / 질량을 기반으로 '편차'를 자동으로 수행한다고 가정합니까? 이 경우 좀비의 질량을 최소값으로 변경하면 자동차에 영향을 미치지 않습니다.


0

여기에는 두 가지 답변 클래스가 있습니다.

  1. 충돌 무시 또는 비활성화
    • 이 솔루션은 문제를 해결하지 못하고, 좀비가 맞으면 날아 가기를 원합니다.
  2. 질량 변경 :
    • 이것은 좋은 접근 방법입니다. 그에 따라 관성을 변경하는 것을 잊지 마십시오.
      • 승압 할 때 자동차 질량 및 관성을 대신 변경할 수 있습니다 (부스트 할 때 모든 비 운동 학적 객체가 차량에 미치는 영향을 줄이기 위해이 작업을 수행함)
      • 이것은 운동 학적이라고 가정 할 때 도로 나 벽에 영향을 미치지 않아야합니다.

도움이 되었기를 바랍니다!


6 년 전의 기존 답변 중 2 개는 이미 제안한 대중 기반 접근 방식을 권장합니다. 추가하려는 새로운 전략이 있습니까?
DMGregory

죄송합니다. 아직 투표 할 수 없으며 Paul Manta가 길을 잃지 않았 음을 확인하고 싶었습니다.
1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.