2017-10-31 10 views
0

저울의 동작을 복제하는 두 개의 피스톤을 시뮬레이트하고 싶습니다. 나는 OnCollisionStay가 호출 될 때 스프링 조인트를 사용하고 역 경량을 적용하고 있습니다. 이것은 나의 피스톤과 그들의 강체와 관절입니다. 둘 다 똑같습니다.Rigidbodies는 만지지 만 OnCollisionStay는 호출을 멈 춥니 다 (Unity3D)

two pistons

이 내 SpringForceTransmisor.cs 코드 : UnityEngine를 사용하여;

public Rigidbody InverseJoint; 

private void OnCollisionEnter(Collision collision) { 
    Debug.Log("Enter"); 
} 

private void OnCollisionExit(Collision collision) { 
    Debug.Log("Exit"); 
} 

private void OnCollisionStay(Collision collision) { 
    InverseJoint.AddForce(-(collision.rigidbody.mass * Physics.gravity)); 
    Debug.Log("Stay"); 
} 

this is a video

따라서 비디오에 표시된 로그에 따르면 OnCollisionStay()는 OnCollisionExit()이 호출 된 적이 없더라도 호출되는 것을 중지합니다. 이것이 어떻게 가능한지? 난 항상 OnCollisionStay()가 OnCollisionEnter 프레임과 OnCollisionExit 프레임에서 모든 프레임을 호출한다고 생각했습니다.

여기에 무슨 일이 일어나고 있는지 알 수있는 사람이 있습니까?

+0

충돌 감지 모드를 연속으로 변경하면 여전히 발생합니까? – ryeMoss

답변

0

동영상에 "Enter"가 등록되는 부분이 포함되어 있으면 질문에 대한 답변이 명확 해집니다.

지금 무슨 일이 일어나고 있는지 설명하기 위해 traingulated sphere에 대한 예를 보여 드리겠습니다. 여기에 어떻게 보이는지 (일부 삼각형은 의도적으로 보이지 않게되어 있음).

(primitive sphere mesh in unity)

그것은 본질적으로 삼각형을 형성 점의 무리는 모두,이 중공 있음을 유의하십시오. 이제이 메쉬 콜라이더 구성 요소의 메쉬라고 해봅시다. 다른 충돌자가이 sphere_mesh_collider와 상호 작용하는 경우, 일치를 탐지하는 유일한 방법은 교차점이있는 두 충돌 자의 삼각형을 확인하는 것입니다. 즉, 삼각형 안쪽에 덮여 있지 않은 영역은 검사되지 않습니다. 즉, 여기 내 구의 체적은 결코 충돌을 감지하지 못합니다 (충돌 체재를 호출하지도 않지만, 충돌자는 충돌을 피할 수 없으므로 출구를 호출하지 않습니다).

나는 당신의 경우에 일어난다 고 생각 합니다만, 나는 (침입자와 상호 작용하기 시작한) 침입자의 모든 과정을 보지 못하고 (퇴거하는 것보다) 확신 할 수 없습니다.

편집 : 편집기 창에서 단일 와이어 프레임 (또는 음영 처리 된 와이어 프레임)을 활성화하면 쉽게 관찰 할 수 있습니다.

1

OnCollisionStay에 대한 설명서에 따르면, 그것은 말한다 :

OnCollisionStay가 강체/입자 가속기를 만지고 강체 모든 입자 가속기/한 번만 프레임 당이라고합니다.

불행히도, 이것은 이 아니며 때로는이 아닙니다. 일부 경우에는 OnCollisionStay 함수가 몇 번 호출되고 호출이 중지됩니다. 오랜 시간 동안 버그가 수정되었거나 문서가 잘못되었습니다. 사람들에게

내 일반적인 조언은 OnCollisionStay 기능을 포기하고 단순히 OnCollisionExit 함수에서 false로 설정 한 다음 OnCollisionEnter 기능에서 true로 부울 변수를 설정하십시오.그런 다음 Update 함수의 부울 변수를 검사하여 OnCollisionStay 함수로 Update 함수를 사용할 수 있습니다.

public Rigidbody InverseJoint; 

bool collisionStay = false; 
Collision collision = null; 

private void OnCollisionEnter(Collision collision) 
{ 
    Debug.Log("Enter"); 
    collisionStay = true; 
    this.collision = collision; 
} 

private void OnCollisionExit(Collision collision) 
{ 
    Debug.Log("Exit"); 
    collisionStay = false; 
    this.collision = collision; 
} 

void Update() 
{ 
    if (collisionStay) 
    { 
     InverseJoint.AddForce(-(collision.rigidbody.mass * Physics.gravity)); 
     Debug.Log("Stay"); 
    } 
} 
+0

동의합니다. FixedUpdate를 사용하는 것이 더 좋지 않습니까? – Maximetinu