반응형
[질문]
유니티 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 상태로 유지되기 때문에 첫 번째 회전 조건문은 실행되지 않습니다.
반응형
댓글