1-1. 기본 점프 소스코드
public float jumpPower;
void Update() { //Jump if (Input.GetButtonDown("Jump")) { rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse); } }
- 버튼의 연속적이 아닌 단발적인 사용으로, Update()에다가 작성.
- GetButtonDown을 이용해 "Jump"버튼을 누를 때, 물리적으로 힘을 가하는 함수인 AddForce()을 이용해 원하는 크기의 점프구현.2-1. 중력 크기 적용
- 첫 번째, Edit - Project Settings - Gravity에서 Y값에 원하는 크기를 입력.
- 기본적으로 -9.81이 적용돼있음.
- 두 번째, Rigidbody 2D 의 Gravity Scale에서 오브젝트에 적용되는 중력 비율을 적용가능.
- 1이면 100%적용, 그 이하면 작게 적용, 그 이상이면 더 크게 적용.
(Gravity Scale : 1인 떨어지는 모습)
(Gravity Scale : 4인 떨어지는 모습)
2-1. 애니메이터
- 먼저, 원하는 객체에 점프 애니메이션을 만든 뒤, 애니메이터에 들어감.
- 위의 사진처럼 State 끼리 Make Transition을 통해 엮어줌.
- isJumping이라는 bool 변수를 만들어 각 transition에 위의 사진처럼 Conditions에 추가하여 true/false 상태 조정.
- (예시)
Walk -> Jump = iswalking : true , isjumping : true
Jump -> Walk = iswalking : true , isjumping : false
Idle -> Jump = iswalking : false , isjumping : true
Jump -> Idle = iswalking : false , isjumping : false2-2. Loop Time
- 참고로, 적용한 점프 애니메이션이 반복을 시키면 이상하므로 Loop Time을 false.
2-3. 애니메이션 적용 소스코드(feat. Raycast)
void Update() { //Jump if (Input.GetButtonDown("Jump")) { rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse); anim.SetBool("isjumping", true); } }
void FixedUpdate() { //Landing Ploatform if(rigid.velocity.y < 0) //내려갈떄만 스캔 { Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0)); RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask("Platform")); if (rayHit.collider != null) { if (rayHit.distance < 0.5f) { anim.SetBool("isjumping", false); } } } }
- DrawRay(시작점, 쏘는방향, 색깔) : 에디터 상에서만 Ray(빔)을 그려주는 함수
- RayCastHit : Ray에 닿은 오브젝트, Ray는 물리기반이라 Physics2d에 있음.
- GetMask() : 레이어 이름에 해당하는 정수값 리턴.
Raycast 인자로 넣는 순간, 입력한 레이어에 해당한 것들만 Ray로 스캔하겠다는 의미.- Raycast(시작점, 쏘는방향, 거리(원할때), LayerMask(원할때)) : 빔을 쏘는 함수.
- RayCastHit변수의 콜라이더로 검색 확인 가능.
- 맨위에 있는 기본 점프 소스코드에다 점프할때마다 isjumping을 true로 반환하는 코드 적용.
- rigid.velocity.y < 0 일때 작동하는 조건을 넣어, 점프하고 난 뒤, 내려 올때 Ray를 쏘아 platform과의 거리가 0.5아래면 isjumping을 false로 변환하여 점프 애니메이션에서 걷고있거나 정지한 상태의 애니메이션으로 넘어가게끔 함.
(모든 Floor에 Platform 이라는 Layer을 적용한상태)
(Platform이라는 Layer을 적용한 object만 스캔하는 모습)
void Update() { //Jump if (Input.GetButtonDown("Jump") && !anim.GetBool("isjumping")) { rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse); anim.SetBool("isjumping", true); } }
- 2-3의 코드에서 조건에 isjumping이 false일 때만 즉, 점프하고있지않는 상태에서만 점프할 수 있게 and로 묶어줌.
(전체적으로 점프, 멈춤, 걷기 애니메이션이 순환되는 모습)
<참고>
골드 메탈님 강의 영상:https://www.youtube.com/watch?v=2SikOdH7xvQ&list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2&index=18
사용한 텍스처 소스 : http://u3d.as/2mvJ (by골드메탈님)