[Go-Unity] 7. 플레이어 이동, 점프 ⭐⭐⭐

업데이트:

카테고리:

태그: , ,


Collider2D.Bounds, Layer, Gizmos, GetKey

고박사의 유니티 기초를 복습하면서 정리.

1. 플레이어

image

  Component

  - Rigidbody 2D : Freeze Z 확인
  - Collider 2D


  Script

  - Movement 2d : 플레이어 이동, 점프
  - Player Controller : 플레이어 점프





2. Movement2D.cs

Movement2D.cs

public class Movement2D : MonoBehaviour
{
    //private Vector3 moveDirection = Vector3.zero;
    [SerializeField]
    private float               moveSpeed = 3;      //속도
    [SerializeField]
    private float               junpForce = 8.0f;   //점프 힘
    [HideInInspector]
    public bool                 isLongJump = false; //점프높이구분
    [SerializeField]
    private LayerMask           groundLayer;        //바닥 체크를 위한 충돌레이어
    private CircleCollider2D    circleCollider2D;   //오브젝트의 충돌 범위 컴포넌트
    private bool                isGrounded;         //바닥체크
    private Vector3             footposition;       //발의 위치

    [SerializeField]
    private int                 maxJumpCount = 2;
    private int                 currentJumpCount= 0;
    
    private Rigidbody2D rigid2D;

    private void Awake() {
        rigid2D             = GetComponent<Rigidbody2D>();
        circleCollider2D    = GetComponent<CircleCollider2D>();
    }

    private void FixedUpdate() {
        if(transform.position.y < -4){  // 낙하시 플레이어 불러오기
            transform.position = new Vector3(0,0,0);
        }

        // ~~Collider2D.bounds : 오브젝트의 collider2d min, center, max 위치 정보
        Bounds bounds   = circleCollider2D.bounds;

        // 플레이어의 발 위치 설정 X : 오브젝트의 중심, Y 오브젝트의 바닥
        footposition    = new Vector2(bounds.center.x, bounds.min.y);

        // Physics2D.OverlapCircle(Position위치, raius크기, layer레이어) 
        // 플레이어의 발위치에 반지름만큼 보이지않는 원 충돌 범위 생성 , 
        // 원이 레이어에 충돌하면 true, 아니면 false
        isGrounded      = Physics2D.OverlapCircle(footposition,0.1f, groundLayer);

        // 땅에 있고, y축 속도가 0이하이면 점프 횟수 초기화
        // velocity.y <= 0을 추가 하지 않으면 점프키를 누르는 순간에도 초기화가 되어
        // 최대 점프 횟수를 2로 설정하면 3번까지 점프한다.
        if (isGrounded ==true && rigid2D.velocity.y<=0)
        {
            currentJumpCount = maxJumpCount;
        }

        // 낮은 점프, 높은 점프 구현을 위한 중력 계수(gravityScale) 조절 (jump up일 때만 적용)
        if ( isLongJump && rigid2D.velocity.y > 0)  //높은점프
        { 
            rigid2D.gravityScale = 1.0f;    //isLongJump : True -> 중력 1.0
        }else                                       //낮은점프
        {
            rigid2D.gravityScale = 2.5f;    //isLongJump : false -> 중력 2.5
        }
    }

    public void Move(float x){
        // x축은 속도, y축은 기존 속력 값(중력)
        rigid2D.velocity = new Vector2(x*moveSpeed,rigid2D.velocity.y);
    }   

    public void jump(){
        if (currentJumpCount > 0)
            {
            // jump force의 크기만큼 위쪽 방향으로 속력 설정
            rigid2D.velocity = Vector2.up * junpForce;
            currentJumpCount --;    //점프횟수 감소
            }
        }

    //화면에 선이나 도형을 표시할 수 있다.
    private void OnDrawGizmos() {       
        Gizmos.color = Color.blue;      
        Gizmos.DrawSphere(footposition, 0.1f);
    }
}
  • 플레이어의 이동, 점프에 관한 cs
  • Playercontroller.cs에서 호출하여 사용




Bounds

Bounds bounds   = circleCollider2D.bounds;
footposition    = new Vector2(bounds.center.x, bounds.min.y);
  • ~~Collider2D.bounds : 오브젝트의 collider2d min, center, max 위치 정보
  • footposition => 플레이어의 발 위치 설정 X : 오브젝트의 중심, Y 오브젝트의 바닥
  • image




땅(Ground), 땅마찰력(Friction) ,점프횟수, 점프세기 Ground, LongJump

//#1
isGrounded      = Physics2D.OverlapCircle(footposition,0.1f, groundLayer);
//#2
if (isGrounded ==true && rigid2D.velocity.y<=0){  // 땅에 있고, y축 속도가 0이하이면 점프 횟수 초기화
    currentJumpCount = maxJumpCount;
}
//#3
    // 
if ( isLongJump && rigid2D.velocity.y > 0){  //높은점프 
    rigid2D.gravityScale = 1.0f;    //isLongJump : True -> 중력 1.0
}else{                                       //낮은점프
    rigid2D.gravityScale = 2.5f;    //isLongJump : false -> 중력 2.5
}
  • #1 - Physics2D.OverlapCircle(Position위치, raius크기, layer레이어)
  • #1 - 플레이어의 발위치에 반지름만큼 보이지않는 원 충돌 범위 생성 , 원이 레이어에 충돌하면 true, 아니면 false
  • #2 - velocity.y <= 0을 추가 하지 않으면 점프키를 누르는 순간에도 초기화가 되어 최대 점프 횟수를 2로 설정하면 3번까지 점프한다.
  • #3 - 낮은 점프, 높은 점프 구현을 위한 중력 계수(gravityScale) 조절
  • Ground 레이어 설정

    1. 인스펙터뷰 Layer -> Add Layer 에 Ground 추가
    2. Ground로 사용되는 모든레이어를 Ground로 설정

GroundLayer



  • Ground 마찰력 추가

    1. Project View 에 Physics Material 2D추가
    2. 설정 Friction - 0에 가까울수록 미끄럽다. Bounciness : 충돌할때 튕기는정도
    3. 생성한 physics Material을 적용할 오브젝트 collider 컴포넌트의 Material에 드래그엔 드랍

material2d마찰력




Move,Jump 함수 (기본 움직임, 점프)

//#1
public void Move(float x){
    // x축은 속도, y축은 기존 속력 값(중력)
    rigid2D.velocity = new Vector2(x*moveSpeed,rigid2D.velocity.y);
}   
//#2
public void jump()
{
    if (currentJumpCount > 0)
    {
        // jump force의 크기만큼 위쪽 방향으로 속력 설정
        rigid2D.velocity = Vector2.up * junpForce;
        currentJumpCount --;    //점프횟수 감소
    }
}

  • #1 - Move 함수 : 플레이어의 기본 움직임
  • #2 - Jump 함수 : 점프카운터가 0 이상이면 점프힘만큼 점프 2회가능




Gizmos

private void OnDrawGizmos() {       
    Gizmos.color = Color.blue;      
    Gizmos.DrawSphere(footposition, 0.1f);  //바닥표시
}
  • Gizmos : 화면에 선이나 도형을 표시할 수 있다.
  • Gizmos.Draw~~~()





3. playercontroller.cs

playercontroller.cs

public class playercontroller : MonoBehaviour
{
    private Movement2D movement2D;
    private void Awake() {
        movement2D = GetComponent<Movement2D>();
    }

    private void Update() {
        float x = Input.GetAxisRaw("Horizontal");   //좌 우 이동
        movement2D.Move(x); //movement2D클래스의 move함수 사용

        if (Input.GetKeyDown(KeyCode.Space)){       //스페이스바 눌렀을 때
            movement2D.jump();                      //점프함수 호출
        }
        if (Input.GetKey(KeyCode.Space)){           //스페이스바 누르고 있을경우
            movement2D.isLongJump = true;           //롱점프 : true
        }
        else if (Input.GetKeyUp(KeyCode.Space)){    //스페이스바 눌렀다 땠을 때
            movement2D.isLongJump = false;          //롱점프 : false
        }
    }
}
  • Awake() - movemoen2D 컴포넌트 호출
  • Update() - 좌우이동, movemoen2D.Move 호출
  • Getkey - 스페이스 누름에 따라 점프변화

Input 함수 GetKey, GetKeyDown, GetKeyUp

GetKey : 해당 키를 누르고 있을 경우 True 반환
GetKeyDown : 해당 키를 눌렀을 때 True 반환
GetKeyUp : 해당 키를 눌렀다 땟을때 True 반환


참고 : 유니티 TOP


📔

댓글남기기