중간고사가 끝나고 오랜만에 다시 하는 개발...
미리보기
구현기능
1. Wall Sliding
2. Wall Jump
+ Movement Improvement
목차
WallCheck
먼저 바라보는 방향에 Wall이 있는지 확인한다.
GroundCheck와 마찬가지로 Raycast를 이용한다.
isTouchingWall = Physics.Raycast(wallCheck.position, transform.forward, wallCheckDistance, whatIsGround);
transform.forward는 Vector.forward와 다르게 transform에 따라 바뀐다. (parent 느낌)
Hierachy에서 wallCheck라는 GameObject를 추가하고 Attach한다.
알아보기 쉽게 Gizmos도 추가한다.
WallSliding
WallSliding을 하고 있는 상황은 다음과 같다.
1. 벽에 붙어있을 때 (isTouchingWall == true)
2. 바닥과 떨어져있을 때 (isGround == false)
3. 캐릭터가 떨어지고 있을 때 (rb.veloticy.y <= 0)
private void CheckIfWallSliding()
{
if(isTouchingWall && !isGrounded && rb.velocity.y <= 0)
{
isWallSliding = true;
}
else
{
isWallSliding = false;
}
}
그리고 wallSlidingSpeed를 적용해준다.
/*private void ApplyMovement()*/
if(isWallSliding)
{
rb.velocity = new Vector3(rb.velocity.x, -wallSlidingSpeed, rb.velocity.z);
}
나머지 velocity는 그대로 두고 y 속도면 wallSlidingSpeed로 적용한다.
wallSlidingSpeed는 5f로 적용했다.
또한 UpdateAnimation에 isWallSliding을 넘겨주고 Animator에도 추가한다.
anim.SetBool("isWallSliding", isWallSliding);
isWallSliding == true이면 AnyState에서 WallSliding으로 넘어간다.
다만 영상에 있는 그대로 따라하면 WallSliding 상태에서는 움직일 수 없다.
이후 Movement Improvement에서 수정한다.
WallJump
WallJump는 WallSliding을 하고 있거나 벽이 가까이 있을 때(isTouchingWall) 가능하다.
wallJumpForce(30f) 와 wallJumpDirection(1f, 2f, 0f)을 정의한다.
else if((isWallSliding || isTouchingWall) && movementInputDirection != facingDirection)
{
anim.SetTrigger("Jump");
Vector3 forceToAdd = new Vector3(wallJumpForce * wallJumpDirection.x * movementInputDirection, wallJumpForce * wallJumpDirection.y, 0);
rb.AddForce(forceToAdd, ForceMode.Impulse);
}
WallJump는 위 상황에서 현재 바라보고 있는 방향과 반대방향으로 방향키를 누르면서 Jump하면 실행된다.
animation은 기존 Jump와 같은 것을 사용한다.
WallHop
이후 Movement Improvement 과정에서 삭제된다.
WallJump가 반대쪽 벽으로 가는 거라면 WallHop는 WallSliding을 종료하는 가벼운 점프다.
즉 movementInput이 없는 상태에서 Jump하는 상태이다.
마찬가지로 wallHopForce(20f)와 wallHopDirection(1f, 0.5f, 0f)을 정의한다.
else if(isWallSliding && movementInputDirection == 0)
{
Vector3 forceToAdd = new Vector3(wallHopForce * wallJumpDirection.x * -facingDirection, wallHopForce * wallHopDirection.y, 0);
rb.AddForce(forceToAdd, ForceMode.Impulse);
}
animation은 wallSliding을 종료한 후 바로 JumpFall로 넘어간다.
Movement Improvement
- Delete JumpHop
- Seperate Jump Function (Normal&Wall Jump)
- Add Timer (jumpTimer, turnTimer, wallJumpTimer)
(작업일지 쓰는 거 까먹고 그냥 해버려서 나중에 생각나면 작성...)
마무리
개인적으로 플랫포머에서 WallJump는 필수 기능이라고 생각한다.
멋있으니까...
다음 챕터는 Ledge Climb이지만 필요한 기능이라고 생각하지 않아 생략
Dash를 구현할 예정이다.
'중단된 프로젝트 > Chrono Wave' 카테고리의 다른 글
[ChronoWave] ~2022/12/04 (0) | 2022.12.04 |
---|---|
[Chrono Wave] #4.5 - Animator Transition 정리 (0) | 2022.11.05 |
[Chrono Wave] #3 - Variable Jump (3) | 2022.10.26 |
[Chrono Wave] #2 - Basic Movement (0) | 2022.10.21 |
[Chrono Wave] #1 - 애니메이션/조작법 구상 (0) | 2022.10.14 |