본문 바로가기

Programming/유니티

유니티(Unity) 프로젝트 점프게임 만들기 : [3] 캐릭터 점프

목표

캐릭터에 RigidBody2d 컴포넌트를 추가시켜서 점프연출을 구현해 보자

RigidBody2D

물리를 적용하는 컴포넌트로 중력을 이용하여 캐릭터가 점프를 연출하는데 자연스럽게 보이도록 한다.

'Hierachy' 에서 'character' 를 선택해서 'Inspector' 안의 'Add Component' 를 눌러 RigidBody2D를 추가한다.

'Gravity Scale' 이 중력값을 나타낸다.

----

----

실행해 보면 캐릭터가 아래로 떨어지는 것을 확인할 수 있다.

캐릭터가 서있을 수 있는 발판을 만들어서 캐릭터가 아래로 떨어지지 않도록 해야 한다.

우선은 캐릭터에 'Box Collide 2D' 를 추가해 준다.

'Box Collider 2D' 는 충돌을 감지할 수 있도록 해주는 컴포넌트는

'Box Collider 2D' 끼리 충돌하면 충돌하면 멈추게 하는 역할을 한다.

캐릭터와 발판에 'Box Collier 2D'를 추가해서 캐릭터가 떨어지며 발판에 충돌했을 때

캐릭터가 발판 위에 서게 한다.

캐릭터에 'Box Collider 2D' 를 추가한다.

캐릭터에 'Rigidbody 2D'와 'Box Collider 2D'가 붙어 있는 것을 확인할 수 있다.

발판 추가

'Hierachy' 에서 오른쪽 버튼을 클릭하여 'GameObject'를 생성 후 '이름을 'platform' 으로 변경해 준 뒤

위치를 0으로 설정해 주고

Add Component'로 'Sprite Renderer'를 추가해 준다.

platform.png
0.01MB

위의 파일을 다운받아서 사용하시면 됩니다.

이러한 리소스 파일을 한 폴더 안에 넣고 사용하면 보기 편하니

RawResources 폴더를 만들어 파일을 넣어주자

폴더 이름은 원하는 데로 만들어도 상관없다.

위에 만들어둔 'platform'에 platform 이미지를 설정해 준다.

발판의 윗부분이 중앙으로 올 수 있도록 이미지의 pivot을 변경해 줍니다.

그리고 캐릭터와 마찬가지로 'Box Collider 2D'를 추가해 준다.

주의할 점은 'Rigidbody2D'는 추가하지 않고 'Box Collider 2D'만 추가해 준다.

화면처럼 'platform'과 'character'가 겹쳐있는 화면이 보인다.

이제 'platform'을 아래로 내려서 'character'가 발판 위로 올라서게 하자

위처럼 y 의 위치를 -3.92로 설정하고 실행해 보자

캐릭터가 발판 위에 멈추는 것은 확인했지만 서있는 위치가 발밑이 아니니 수정해 주자

'RawResource' 폴더의 'robot'을 선택해서 'Inspector' 에서 Sprite Editor 를 눌러준다.

다시 실행하면 아래와 같이 발판 위에 올라선 모습을 확인할 수 있습니다.

발판도 마련되었으니 드디어 점프를 할 수 있는 환경이 모두 갖추어졌네요

디파인 파일 스크립트

'GameDefine.cs' 를 추가하여 아래와 같이 게임 전반적으로 사용할 enum 값을 정해줍니다.

//캐릭터의 점프 상태
public enum UNIT_STATE
{
    IDLE,
    JUMP,
}
//발판의 종류 - 앞서 언급했듯이 
//움직이는 발판, 사라지는 발판등을 추가할 예정이다.
//현재는 일반 발판만 기재하였다.
public enum PLATFORM_TYPE
{
    NORMAL,
}

Unit 스크립트

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;


public class Unit : MonoBehaviour
{
    UNIT_STATE state = UNIT_STATE.IDLE;

    //점프할때 사용할 Rigidbody
    Rigidbody2D rigid;	
    //점프할 때 머리위의 발판과 충돌을 방지 하기 위한 밴수 
    Collider2D collid;
    
    //올라가는 중인지 내겨가는 중인지 확인하기 위한 변수
    //collid 를 활성화 비활성하는지 판단하는 기준이 된다.
    float yDir = 0;

    private void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
        collid = GetComponent<Collider2D>();

        yDir = transform.position.y;
    }

    private void Update()
    {
        if (state == UNIT_STATE.JUMP)
        {
            var y = transform.position.y;
            if (y < yDir)
            {
                collid.enabled = true;
            }
            yDir = y;
        }
    }

    public void Jump(float _jumpHeight)
    {
        Debug.Log("jump");

        if (rigid == null || collid == null) return;

	//점프시 상태값을 점스 상태로 변경
        state = UNIT_STATE.JUMP;
        collid.enabled = false;
        yDir = transform.position.y;

        var g = Physics.gravity.magnitude;
        var vSpeed = Mathf.Sqrt(2 * g * _jumpHeight); 
        rigid.velocity = new Vector2(0, vSpeed); 
    }

    public void SetUnitState (UNIT_STATE _state)
    {
        state = _state;
    }
    public UNIT_STATE GetUnitState { get { return state; } }

    private void OnCollisionEnter2D(Collision2D collision)
    {
    	//발판과 충돌하여 안착했을 경우 다시 점프 할 수 있도록 상태값을 변경
        state = UNIT_STATE.IDLE;
    }
    private void OnCollisionExit2D(Collision2D collision)
    {
    
    }
}

캐릭터에 붙여진 'Unit' 스크립트의 내용입니다.

----

----

오브젝트가 활성화되면 Rigidbody2d와 Box collider 2d의 컴포넌트를 수정할 수 있도록 받아옵니다.

'Jump' 함수를 외부에서 어느 정도 높이로 점프를 할지

캐릭터 공간의 수치로 전달하면 높이에 맞춰서 점프를 하게 됩니다.

public void Jump(float _jumpHeight)
{
    Debug.Log("jump");

    if (rigid == null || collid == null) return;

    //점프시 상태값을 점스 상태로 변경
    state = UNIT_STATE.JUMP;
    collid.enabled = false;
    yDir = transform.position.y;

    var g = Physics.gravity.magnitude;
    var vSpeed = Mathf.Sqrt(2 * g * _jumpHeight); 
    rigid.velocity = new Vector2(0, vSpeed); 
}

우리는 캐릭터의 점프 높이를 화면의 60%높이로 점프할 것입니다.

이에 대해서는 'Playground'의 스크립트 작성 부분에서 다시 설명하겠습니다.

'Update' 함수에서는 캐릭터의 현재 위치를 계속 추적하면서

올라가는 중인지 내려가는 중인지 확인하여 collid 변수의 활성, 비활성을 결정합니다.

올라갈 때는 머리 위의 발판과 충돌하지 않도록 비활성하고

내려올 때는 발판 위에 착지하기 위해 활성화합니다.

'SetUnitState'는 외부에서 캐릭터의 상태값을 지정해 줘야 할 때가 있으면 호출합니다.

'GetUnitState'는 외부에서 캐릭터가 점프 중인 상태인지를 확인하는 데 사용합니다.

'OnColliderEnter2D' 는 발판과 충돌했을 때 호출 됩니다.

캐릭터가 다시 점프할 수 있도록 상태값을 변경해 줍니다.

'OnColliderExist2D' 는 캐릭터가 발판을 벗어 낫을 때 호출해 줍니다.

 

이제 'Playground'에서 'Unit'의 점프를 호출할 수 있는 환경을 구성하고 실제로 'Jump' 함수를 호출해 보겠습니다.

글의 길이가 너무 길어지는 듯하여 다음 글에서 계속하겠습니다.

다음화

 

유니티(Unity) 프로젝트 점프게임 만들기 : [4] 캐릭터 점프 호출

목표 찐으로 캐릭터를 점프시켜 보겠습니다. 초보를 대상으로 자세한 설명을 하다 보니 스크린샷도 많아지고 부연설명이 많아서 부득이하게 글을 나누게 된 점 양해부탁드립니다. 이번시간에

moblieandlife.tistory.com