본문 바로가기
  • _^**_
카테고리 없음

[무근본 유니티] 자동차가 코너에서 충돌 시 회전하는 스크립트 작성법

by 크리드로얄워터 2023. 4. 18.
반응형

[질문]

유니티 3d로 자동차가 지나가다가 코너에서 충돌하면 회전하는 스크립트를 짜고있는데 처음 부딪혔을때는 회전을 한번만 90도로 잘하는데 두번째 부딪히는순간 2번 회전을 해요 ㅠ 한번만 회전하고싶은데 코드 첨부합니다

 

void OnTriggerEnter(Collider other)

{

if (!a && other.gameObject == box)
{ 
// 회전할 각도 계산 
Quaternion targetRotation = Quaternion.Euler(0, -90f, 0) * transform.rotation; 
// 오브젝트 회전 
transform.rotation = targetRotation; 
Debug.Log("1차회전"); a = true; 
} 
else if (!b && other.gameObject == box) 
{ // 회전할 각도 계산 
Quaternion targetRotation = Quaternion.Euler(0, 90f, 0) * transform.rotation; 

// 오브젝트 회전 
transform.rotation = targetRotation; Debug.Log("2차회전"); b = true; } 

if (a && b) { a = false; b = false; } 

}

 

두번째 충돌을 하면서 a,b가 초기화 되면서 첫번째 회전하는 조건이 만족해서 2차회전과 1차회전이 같이 실행되서 두번 회전을 하는것같은데 어떻게하면 한번만 회전할수있게 할까요?

 

[답변]

 

문제의 원인은 두 번째 충돌이 발생할 때, 변수 a와 b가 동시에 초기화되기 때문입니다. 그러므로 두 번째 충돌이 발생하면서 a와 b가 초기화되고, 다시 첫 번째 충돌 조건이 만족되어 첫 번째 회전 조건문이 실행되고, 이어서 두 번째 회전 조건문이 실행되기 때문에 두 번 회전하는 현상이 발생하는 것입니다.

따라서 해결 방법으로는 a와 b가 동시에 초기화되는 것을 막는 것입니다. a와 b를 따로 관리하여, 첫 번째 충돌 조건문에서 a를 true로 변경하고, 두 번째 충돌 조건문에서 b를 true로 변경하는 방식으로 변경하면 됩니다.

다음은 수정된 코드입니다:

 

bool a = false;
bool b = false;

void OnTriggerEnter(Collider other)
{
    if (!a && !b && other.gameObject == box)
    {
        // 회전할 각도 계산
        Quaternion targetRotation = Quaternion.Euler(0, -90f, 0) * transform.rotation;
        // 오브젝트 회전
        transform.rotation = targetRotation;
        Debug.Log("1차회전");
        a = true;
    }
    else if (a && !b && other.gameObject == box)
    {
        // 회전할 각도 계산
        Quaternion targetRotation = Quaternion.Euler(0, 90f, 0) * transform.rotation;
        // 오브젝트 회전
        transform.rotation = targetRotation;
        Debug.Log("2차회전");
        b = true;
    }
}

 

 

이제 a와 b는 각각 독립적으로 관리되며, 두 번째 충돌이 발생하더라도 a는 true 상태로 유지되기 때문에 첫 번째 회전 조건문은 실행되지 않습니다.

반응형

댓글