Unity Study

2025-11-19 Jumping

NyumMa 2025. 11. 24. 18:08

점프 조건

 

1.     플레이어가 바닥에 붙어 있어야 함 -> IsGround, 아니면 공중에서도 점프 할 수 있음

2.     플레이어가 현재 점프를 하고 있지 않은 상황이어야 함(더블점프 방지)

 

움직임 개선

1.     캐릭터가 지면에 붙어 있지 않을 시에 wasd 키보드에 대한 vector 값을 받지 않아야 캐릭터가 공중에서 움직이거나 하지 않음

2.     따라서 IsGround 옵션이 true인 경우에만 wasd vector 입력을 받도록 설정

 

점프 로직

Rigidbody로 설정하면 오브젝트가 쓰러지는 문제가 발생하므로 일반적으로 사용 x

Charactercontroller를 통해서 움직임을 구현

 

Physics.gravity 메소드에서는 유니티에서 아래 방향으로 가속도 설정이 처리 되어 있음

v = v0 + at

S = 1/2at^2 + vt

2as = v^2 – v0^2

 

유니티에서는 매 프레임마다 값이 갱신됨 -> s 에 대한 결과값을 미리 한꺼번에 계산하지 않고 프레임 단위로 계산되기 때문에 dt에 대한 접근으로 로직으로 처리해야함 -> 모든 물리 법칙이 이와 동일한 방향성

 

결과적으로는 1/2at^2이고 구현시에는 매번 프레임 업데이트에 따른 dt변화가 누적되므로 고려 결과에 대한 식을 고려 안해도 됨

 

 

점프키 눌렀을 때

1.     Charactercontrollery축 방향(높이)로 지정된 속도를 부여 ex) dir.y = 7f

2.     그 즉시 dir.y에 중력가속도 + delta.t 에 따른 속력 감소 로직 부여

dir.y = dir.y + gravity. Deltatime , 여기서 gravity는 이미 음수값이므로 + 처리

3.     이를 charactercontroller.move에 지속적으로 값을 누적시킴

4.     2as = v^2 -v0^2에 의거하여 만약 캐릭터가 특정 높이 만큼 캐릭터가 점프할 정도로의 속도를 주고 싶다면

Ex) 2m 위치가 최고 높이로 하고 싶다

V = math.sqrt(2gs)

 

스크립트 아이디어 오류들

1.     OnJump 부분에서 key.started isjumping 부분을 true로 하고 else로는 isjumpingfalse로 설정함 ( 키보드를 누른 순간 이외에는 점프가 true가 되지 않기를 원했기 때문)

è  Inputaction 작동은 매 1프레임마다 이벤트가 호출됨

è  따라서 isjumping이 해당 프레임 부분에선 true였겠지만 다음 프레임에서는 곧바로 false로 변함

è  같은 1프레임에 따라서 업데이트가 되긴 하므로 생각의 오류가
어쨌든 1프레임 타임에서 찰나에 true가 되니까 update에서도 해당 flag가 반영되어야 하는것 아닌가라고 착각함

è  하지만 update함수랑 input action 함수의 호출 순서 및 타이밍에 따라서 해당 찰나에 이벤트 처리가 되지 않을 수 있음

è  무엇보다 inpuaction1프레임 로직에서 else에서 false 처리하면 "started 1프레임"에도 IsJumping이 곧바로 false가 되므로 Update()에서 체크가 안 됨

è  Is jumpingfalse 처리가 되는 부분은 isjumping = true에 의해서 위에 방향으로 속력을 받고 난 이후에 isjumping false로 바꾸는 것이 바람직한 순서다.

 

2.     Inputaction에서 wasd 방향 입력에 대해서 vector2로 받고 이 데이터를 사용할 때 정규화 순서

입력 값 forward, right를 받은 다음에 이 데이터를 카메라 transformnormalized 값과 행렬곱 연산 하고 난 후에(정규직교기저 변환) normalized movepseed 곱함

카메라 공간에 대해서 변환 후 정규화 처리해도 상관없지만 젤 베스트는 input 값 받은 직후에 해당 값을 먼저 normalized 한 후 데이터를 사용하는 것이 좀더 나이스하다.

 

Vector2 input = value.readvalue<vector2>();

Input. = input.normalized();

<- 즉시 정규화 처리 후 데이터 사용

 

Movespeed 를 곱해준 다음에 점프 성분에 대한 벡터를 더해줌

HorizontalVector(x , 0, z) * movespeed + VerticalVector(0, y, 0)

가 올바른 형태

 

Vector3 HorizontalMove = (forward * inputVector.y + right * inputVector.x) * movespeed;

 HorizontalMove norm21로 정규화 되어 있나 라는 의문에 대해서

forward 내적 right 0이므로

(forward *inputvector.y) ^2 + (right+inputvector.x)^2 =1 이 만족하면 되는데 forward^2 =1, right ^ 2 = 1 이고 inputvector는 이미 정규화 되어 있으므로

따라서 이 값은 항상 1이다

 

 

 

 

 

 

'Unity Study' 카테고리의 다른 글

2025-11-21 Project prefab  (0) 2025.11.24
2025-11-20 raycast  (0) 2025.11.24
2025-11-17 running  (0) 2025.11.24
2025-11-15 Camera Rotation  (0) 2025.11.24
2025-11-13 movemnets  (0) 2025.11.24