개발일지

[Unity] 점프 애니메이션과 트랩 충돌 시 문제 해결 과정

게임 프로그래머 2024. 11. 20. 23:56

기존 Switch 조건문에는 점프횟수가 0일 때만 발동되는 점프 애니메이션이 있는데

 

트랩과 충돌시 상승 후 하강하는 로직이 작동하면서 의도하지 않은 점프 애니메이션이 실행 되었다.

 

애니메이션 초기화 시도

문제를 해결하기 위해 애니메이션 상태를 초기화하는 방법을 시도했다.

 

Setbool 값은 false 처리하고, SetTrigger 값은 ResetTrigger로 초기화 한 뒤

 

새로운 애니메이션을 실행하는 방식이다.

 

animator.SetBool(isJumping, false);
animator.ResetTrigger(isDoubleJump);
animator.SetTrigger("isDamaged");

 

참고한 자료

https://docs.unity3d.com/kr/2023.2/ScriptReference/Animator.ResetTrigger.html

 

Animator-ResetTrigger - Unity 스크립팅 API

Resets the value of the given trigger parameter.

docs.unity3d.com

https://drehzr.tistory.com/2257

 

Unity) Animator Reset (애니메이터 초기화 코드)

Animator Reset (애니메이터 초기화 코드)Unity 에서 Animator를 사용하다보면 Mecanim 의 상태를 초기화해서 재사용해야하는 경우가 생긴다.그때 사용하는 유틸 코드이다. animator.Rebind();animator.Update(0f)

drehzr.tistory.com

 

 if (other.collider.CompareTag("Trap") && !isDead)
        {
            animator.SetBool(isJumping, false);
            animator.ResetTrigger(isDoubleJump);
            animator.SetTrigger("isDamaged");
            
            isDead = true;
            rb.velocity = Vector2.zero;
            rb.AddForce(Vector2.up * 8f, ForceMode2D.Impulse);
            StartCoroutine(Dead());
        }

 

Trap과 충돌하거나 플레이어가 dead 상태가 아니면

 

애니메이션을 초기화하고 새로운 애니메이션이 실행한다.

 

dead 상태가 되며 정지후 Addforce를 통해 위로 상승하는 힘을 가한다.

 

이후 Dead 코루틴 실행

 

Dead() 코루틴에서의 문제점과 원인

IEnumerator Dead()
    {
        yield return new WaitForSeconds(0.1f); // 0.1초간 대기
        collider.enabled = false; // 하강(추락)을 위해 collider2D 비활성화
    }

 

코루틴 실행후 collider를 비활성화 해서 추락 상태로 전환하는데는 성공했지만

 

점프대처럼 x축으로 이동한뒤 추락하는 현상이 생겼다.

 

왼쪽에서 오른쪽으로 이동할경우 → 우측으로 포물선을 그리며 떨어지는 현상 발생

 

문제 해결: Rigidbody Constraints 활용

 

강의에서 배운 Rigidbody의 Constraints 기능을 사용해 보니

스크립트로도 이동 제한을 제어할 수 있다는 사실을 확인했다.

rb.constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;

 

비트연산자를 통해 여러 이동제한을 동시에 적용할 수 있다.

 

참고한 자료

https://meongjeong.tistory.com/entry/UNITY-RigidbodyConstraints-Rigidbody-%EC%9B%80%EC%A7%81%EC%9E%84-%EC%A0%9C%ED%95%9C%ED%95%98%EA%B8%B0

 

[UNITY] RigidbodyConstraints | Rigidbody 움직임 제한하기

저번 글에서 움직임을 제어하기 위해 Rigidbody의 gravity와 kinematic에 접근하는 방법에 대해 알아봤다. https://meongjeong.tistory.com/5 [UNITY] Rigidbody - useGravity, isKinematic 접근하기 GameObject의 물리 엔진을 동

meongjeong.tistory.com

https://jjing-log.tistory.com/72

 

플레이어의 벽면 충돌 방지_ Physics Material 2D(Unity 프로젝트 / 플랫포머 2d 게임)

플랫포머 게임에서 가장 중요한 것은 이동이기 때문에 조작감이 매우 중요하다. 나는 그림과 같이 땅에 엣지 콜라이더를 사용했는데, 벽면도 땅 처리가 되기 때문에 벽에서 자꾸 마찰이 생기는

jjing-log.tistory.com

https://gksid102.tistory.com/90

 

4. C 비트연산자(연산자 &, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동)

C 언어는 비트끼리 연산을 할 수 있는 연산자가 있습니다. 그 종류는 다음과 같습니다. 연산자 연산자의 기능 & 비트단위로 AND 연산을 한다. | 비트단위로 OR 연산을 한다. ^ 비트단위로 XOR 연산을

gksid102.tistory.com