본문 바로가기

Programming/유니티

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

목표

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

----

----

Playground 설정

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

//운동장
public class PlayGround : MonoBehaviour
{
    //캐릭터 지정
    Unit unit;

    float screenJumpHeight = 0;
    float worldJumpHeight = 0;
    float jumpScreenRate = 0.6f;
    Vector2 bottomPosition;

    private void Awake()
    {
        //제일 먼저 자동으로 시작되는 함수
        //기본 정보들을 초기화 해주자
        //오브젝트가 활성화 되고 한반만 호출된다.
        //스크립트가 비활성화 되어있어도 호출된다.
        Debug.Log(gameObject.name +  " : Awake");

        var _orthoSize = Camera.main.orthographicSize;
        screenJumpHeight = Screen.height * jumpScreenRate;
        worldJumpHeight = (_orthoSize * 2) * jumpScreenRate;

        Debug.Log("Jump Height : " + screenJumpHeight + " / " + worldJumpHeight + " / " + _orthoSize);
    }

    private void OnEnable()
    {
        //오브젝트가 활성화 될 때 마다 호출
        Debug.Log(gameObject.name + " : OnEnable");
    }

    private void Start()
    {
        //스크립트가 활성화 될때 한반만 호출된다.
        Debug.Log(gameObject.name + " : Start");

        FindUnit();
    }

    private void Update()
    {
        //프레임마다 호출
        TouchScreenEvent();
    }

    private void OnDisable()
    {
        //오브젝트가 비활성화 될 때 마다 호출
        Debug.Log(gameObject.name + " : OnDisable");
    }

    private void OnDestroy()
    {
        //오브젝트가 파괴될 때 호출
    }

    void FindUnit()
    {
        //캐릭터를 찾는다
        unit = GameObject.Find("character").GetComponent<Unit>();
    }

    void TouchScreenEvent()
    {
        //update 함수 안에서 터치 이벤트를 감지한다

        //화면을 눌렀을 때 이벤트
        if (Input.GetMouseButtonDown(0))
        {

        }

        //화면을 눌렀다가 땔때 이벤트
        if (Input.GetMouseButtonUp(0))
        {
            JumpUp();
        }
    }
    
    void JumpUp()
    {
        if (unit.GetUnitState != UNIT_STATE.IDLE) return;
        unit.Jump(worldJumpHeight);
    }

}

우선 점프의 높이를 설정하겠습니다.

jumpScreenRate = 0.6f; 점프의 높이를 화면의 60%로 하기 위한 변수입니다.

이 값을 현재의 카메라의 orthographicSize 값에 적용하여 얼마의 값이 60%인지 확인합니다.

var _orthoSize = Camera.main.orthographicSize;
카메라의 화면 영역의 크기를 가져옵니다.
screenJumpHeight = Screen.height * jumpScreenRate;
이것은 스크린 화면에서의 60%의 값인데 지금은 사용하지 않습니다.
worldJumpHeight = (_orthoSize * 2) * jumpScreenRate;
캐릭터가 점프하는 높이를 도출합니다.

이제 worldJumpHeight 의 값이 캐릭터가 점프할 높이 값이 됩니다.

그리고 캐릭터를 찾고 클릭을 통해 점프를 합니다.

Start 함수에서 캐릭터를 찾고, Update 함수에서 클릭이벤트를 호출하여 점프합니다.

캐릭터가 발판에 자유낙하 후 클릭하면 점프하게 됩니다.

물론 현재는 자유낙하 시점에 점프가 가능하지만 그 부분은 뒷부분에서 수정됩니다.

무한의 발판 추가

 

유니티 무한의 발판 만들기 (Unity - Infinity Vertical Jump Platform)

목표 (Subject) 무한으로 생성되는 점프 플렛폼을 만들어보자. (Creating an infinitely generated jumping platform) Platform 발판의 스크립트를 아래와 같이 작성하자 Platform.cs using System.Collections; using System.Collecti

moblieandlife.tistory.com

위의 포스팅을 확인하시면 무한으로 올라가거나 내려갈 수 있는 발판을 만들 수 있습니다.

참고로 위의 포스팅 화면과 현재 작업하고 있는 화면은 다른 구성입니다.

그러므로 아래와 같이 현재 화면에 'PlatformManager' 만 추가하시고 'platform'을 삭제해 줍니다.

그럼 화면에는 캐릭터 혼자만 남아있게 됩니다.

'PlayGround.cs'를 수정하여 'character'의 초기 위치값을 정하고

'PlatformManager'를 찾아서 발판을 만들어주고 'character'의 위치에 따라 갱신해 줄 겁니다.

!!표로 표시된 부분만 새로 추가해주면 됩니다.

public class PlayGround : MonoBehaviour
{
    //캐릭터 지정
    Unit unit;
    // !!PlatformManager 변수 추가 
    PlatformManager platformManager;
    
    ....
    
    private void Start()
    {
        //스크립트가 활성화 될때 한반만 호출된다.
        Debug.Log(gameObject.name + " : Start");

        FindUnit();
        //!!캐릭터 초기위치 설정 
        FindUnitStartPosition();

        //!!PlatformManager 를 찾기
        FindPlatformManager();
        //!!PlatformManager 에서 발판 생성
        PlacePlatformManager();
    }
    
    private void Update()
    {
        //프레임마다 호출
        TouchScreenEvent();

        //!!PlatformManager에서 character의 위치값 추적 
        platformManager.UpdatePlatform(unit.transform.position.y);
    }
    
    ....
    
    //!!캐릭터 초기위치 설정
    void FindUnitStartPosition()
    {
        //screen 의 위치와 오브젝트가 존재하는 위치는 계산되는 단위가 다르다.
        bottomPosition = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width * 0.5f, Screen.height * 0.1f));

        //스크린 상의 하단 중앙의 위치를 오브젝트가 존재하는 위치로 환산하여 유닛에게 적용될 위치를 보여준다.
        Debug.Log("BottomPosition : " + bottomPosition);

        //유닛에게 적용시킨다. - 주의 할점은 z 값을 0으로 지정해 줘야 화면에 표시된다.
        unit.transform.position = new Vector3(bottomPosition.x, bottomPosition.y, 0);
    }
    
    ....
    
    //!!PlatformManager 를 찾기
    void FindPlatformManager()
    {
        platformManager = GameObject.Find("PlatformManager").GetComponent<PlatformManager>();
        platformManager.transform.position = Vector3.zero;
    }
    //!!PlatformManager 에서 발판 생성
    void PlacePlatformManager()
    {
        platformManager.MakePlatforms(bottomPosition.y, Camera.main.orthographicSize);
    }
}

이제 실행하면 캐릭터 발밑에 발판이 한개 화면 중앙에 발판이 한개 생긴 화면을 보실 수 있고

클릭하면 캐릭터가 발판을 타고 점프하며 올라가는 것을 확인할 수 있습니다.

여기까지 잘 따라오고 계신가요?

혹시라도 잘 안되시는 분이 계시다면 댓글 남겨주세요.

지금은 캐릭터가 점프를 하게 되면 화면에서 사라지는데

'Main Camera'가 캐릭터를 따라 움직이며 화면을 비춰주는 연출을 넣어줄 겁니다.

'Scripts' 폴더에 'SmoothLookAt' 이란 c# 스크립트를 생성합니다.

SmoothLookAt.cs

카메라가 자연스럽게 캐릭터를 따라가면서 점프연출을 부드럽게 보여주는 기능을 합니다.
public class SmoothLookAt : MonoBehaviour
{
    //카메라가 따라다닐 대상
    Transform target;
    //부드러움의 강도
    float smooth = 0.25f;

    Vector2 velocity = Vector2.zero;
    
    void Start (){
        target = GameObject.Find("character").transform;
    }

    //RigidBody2d 점프를 따라 이동할것이기 때문에 FixedUpdate를 사용
    private void FixedUpdate()
    {
        Vector2 smoothPos = Vector2.SmoothDamp(transform.position, target.position, ref velocity, smooth);
        transform.position = new Vector3(0, smoothPos.y, -10);
    }
}

해당 스크립트를 작성하고 'Main Camera' 에서 'Add Component'로 'SmoothLookAt'을 추가해 줍니다.

실행하면 아래와 같이 점프를 할 때 카메라가 캐릭터를 따라다니게 됩니다.

다음시간에는 배경을 넣도록 하겠습니다.

다음화

 

유니티(Unity) 프로젝트 점프게임 만들기 : [5] 배경만들기

목표 캐릭터가 위아래로 움직일 때 함께 움직이는 배경을 넣어 자연스러운 게임 연출을 보여주자 ---- ---- 배경연출 'Canvas'를 생성하여 UI Image를 넣고 배경 이미지를 설정하겠습니다. 'Hierarchy' 에

moblieandlife.tistory.com