Priv's Blog

캐릭터 이동 시 떨림 현상이 발생할 경우 본문

Dev. Study Note/Unity

캐릭터 이동 시 떨림 현상이 발생할 경우

Priv 2020. 4. 20. 18:08

2D 게임 개발 중, 캐릭터를 이동시킬 때마다 떨림 현상이 지속적으로 발생했다.

Rigidbody2D를 이용해 캐릭터를 움직였기에, 물리 엔진을 기반으로 캐릭터를 움직이게 만들고 있었다.

이 때문에 Update 문이 아닌 FixeUpdate 문 안에 캐릭터를 움직이는 코드를 작성해야 정상적인 움직임 구현이 가능했는데, 이를 놓치고 있었다.

추가로 Rigidbody에 Interpolate라는 옵션도 이 떨림 현상을 해결하기 위해 사용되는 옵션 중 하나이다.

하지만 이번 문제를 해결하는 데는 아무런 도움이 되지 못했다.

Interpolate 옵션은 물리 엔진 처리 방식을 설정하는데, Interpolate 설정은 이전 프레임을 기반으로 변형 이동을 부드럽게, Extrapolate 설정은 다음 프레임의 예상 위치를 기반으로 움직임을 부드럽게 설정한다.

기본적으로 활성화되어 있었던 Extrapolate 설정을 바꿔봐도 떨림 현상이 더 심해졌을 뿐, 완전히 해결되지는 못했다.

FixedUpdate 문은 물리 엔진을 사용해야 할 때 활성화되는 점에서 힌트를 얻어 캐릭터의 움직임과 관련된 부분들 중 물리 엔진을 사용하는 코드들은 전부 FixedUpdate 문으로 옮겼더니 바로 해결되었다.

처음에는 캐릭터 움직임 부분만 FixedUpdate 문에 추가하고 나머지 부분들 (시점, 총알 발사 등)과 관련된 부분들은 Update 문에 남겨둔 채로 테스트를 했었는데, 이 때문에 만족스러운 결과가 나오지 않았던 것 같다.

 

- 수정한 코드

기존에 Update 문에 있던 코드들을 FixedUpdate 문으로 옮긴 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void FixedUpdate()
    {
        // Player Move
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
 
        Vector2 move = new Vector2(horizontal, vertical);
        Position = rigidbody2D.position;
        Position = Position + (move * Speed * Time.deltaTime);
        rigidbody2D.MovePosition(Position);
 
 
        // Player Sight
        Vector2 PlayerPos = rigidbody2D.position;
        Vector2 MousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
 
        float dy = MousePos.y - PlayerPos.y;
        float dx = MousePos.x - PlayerPos.x;
 
        float rotateDg = Mathf.Atan2(dy, dx) * Mathf.Rad2Deg;
 
        transform.rotation = Quaternion.Euler(0.0f, 0.0f, rotateDg);
 
 
        // Player Shoot
        Vector2 Dir = (MousePos - PlayerPos);
 
        if (Input.GetMouseButtonDown(0&& n != -1// SEMI AUTO
        {
            GameObject projectileObject = Instantiate(projectile[n], transform.position, Quaternion.Euler(0.0f, 0.0f, rotateDg));
 
            projectileController = projectileObject.GetComponent<ProjectileController>();
            projectileController.Launch(Dir.normalized, 900);
        }
 
    }
cs

 

 

- 수정 전 움직임

 

- 수정 후 움직임

Comments