odyssey

#3 odyssey 개발일지 : velocity와 애니메이션 커브로 자연스러운 점프 만들기

san10 2022. 11. 10. 14:15

이제 이동도 만들었으니 캐릭터 점프를 만들 차례다.

그런데 addForce로 하면 쉽게 만들 수 있을줄 알았는데...

문제가 발생했다.

addForce로 Vector2.up 방향으로 힘을 줘도 점프를 하지 않는다..

 

 

이유는 내가 velocity로 매 프레임마다 속도를 직접 조절하기 때문이다.

velocity와 addForce의 차이를 잘 이해하지 못했는데...

velocity는 rigidbody의 velocity 값에 직접 접근해서 속도를 조절하고

addForce는 원하는 방향대로 직접 속도값을 계산해서 rigidbody의 속도값을 조절해주는 메서드라고 이해했다.

 

나는 이동을 구현할때 매 프레임마다 velocity를 조절하기 때문에

addForce를 해도 묻히는 것 같았다.

 

아마 내가 점프를 구현하기 위해선 addForce가 아니라 점프 시간동안 velocity에 Vector2.up을 더해줘야 한다고 생각했다.

private void jump()
    {
        if (isJump == true)
        {
            t += Time.deltaTime;
            if (t < GoalTime) //GoalTime=1
            {
                rigid.velocity = new Vector2(0, 0.1f * jumpForce);
            }
            else
            {
                t = 0;
                isJump = false;
            }
        }
    }

1초동안 Vector2.up방향으로 velocity를 조절해서 1초동안 위로 이동하는 모습을 볼 수 있다.

하지만 지금은 일정하게 velocity 값을 주기때문에 점프라기 보단 공중부양처럼 보인다.

그래서 좀 고민하다 animation curve를 사용하게 되었다.

 

public AnimationCurve jumpAnimation;
public float GoalTime;
float t;
bool isJump;

private void jump()
    {
        if (isJump == true)
        {
            t += Time.deltaTime;
            if (t < GoalTime)
            {
                rigid.velocity = new Vector2(0, 0.1f*jumpAnimation.Evaluate(t) *jumpForce);
            }
            else
            {
                t = 0;
                isJump = false;
            }
        }
    }

원래는 매 프레임마다 일정하게 velocity에 Vector2(0,0.1*jumpForce) 값을 주었는데

이젠 애니메이션 커브에서 매개변수 t에 관한 값을 곱해준다..

 

처음과 다르게 좀 느낌있게 움직인다.

 

 

 

애니메이션 커브를 어떻게 주는지에 따라 다양한 점프 연출이 가능하다.

가면갈수록 빨라지는 점프

 

 

 

유니티 공식문서에선 최대한 velocity를 건들지 말라하는데

이유를 좀 알것같다

velocity를 직접 조절하면 계산을 할게 많아진다..

하지만 그런만큼 addForce와는 다르게 더 섬세하게 조정할 수 있는 것 같다.