목표
찐으로 캐릭터를 점프시켜 보겠습니다.
초보를 대상으로 자세한 설명을 하다 보니 스크린샷도 많아지고 부연설명이 많아서 부득이하게 글을 나누게 된 점 양해부탁드립니다.
이번시간에는 진짜로 캐릭터를 점프시켜 보겠습니다.
----
----
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 함수에서 클릭이벤트를 호출하여 점프합니다.
캐릭터가 발판에 자유낙하 후 클릭하면 점프하게 됩니다.
물론 현재는 자유낙하 시점에 점프가 가능하지만 그 부분은 뒷부분에서 수정됩니다.
무한의 발판 추가
위의 포스팅을 확인하시면 무한으로 올라가거나 내려갈 수 있는 발판을 만들 수 있습니다.
참고로 위의 포스팅 화면과 현재 작업하고 있는 화면은 다른 구성입니다.
그러므로 아래와 같이 현재 화면에 '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'을 추가해 줍니다.
실행하면 아래와 같이 점프를 할 때 카메라가 캐릭터를 따라다니게 됩니다.
다음시간에는 배경을 넣도록 하겠습니다.
'Programming > 유니티' 카테고리의 다른 글
유니티 (Unity) 이미지 Pivot 변경 (0) | 2024.02.12 |
---|---|
유니티 무한의 발판 만들기 (Unity - Infinity Vertical Jump Platform) (0) | 2024.02.12 |
유니티(Unity) 프로젝트 점프게임 만들기 : [3] 캐릭터 점프 (0) | 2024.02.11 |
유니티(Unity) MonoBehaviour 의 이벤트 함수 설명과 FixedUpdate 예제 (0) | 2024.02.09 |
유니티(Unity) 배경 UV 애니메이션 (0) | 2024.02.07 |