-
[Unity] 2D Platformer Game 개발 #2: 플레이어 2D 움직임 및 Parallax Effect2023년 12월 06일
- 유니얼
-
작성자
-
2023.12.06.:02
728x90안녕하세요! 이번 글에서는 Unity를 활용하여 2D 플랫포머 게임을 개발하는 두 번째 단계를 살펴보겠습니다. 전에 다뤘던 프로젝트 설정과 배경 오브젝트 생성에 이어, 이번에는 플레이어 캐릭터의 기본적인 움직임을 구현하는 방법에 대해 알아보겠습니다.
Step 1 : Player Character 만들기
게임에서 플레이어 캐릭터를 나타내기 위해 Sprite Renderer를 사용합니다. Unity에서는 프로젝트에 이미지를 추가하고, 해당 이미지를 Sprite로 변환하여 사용할 수 있습니다. Sprite를 생성한 후, 플레이어 캐릭터에 Sprite Renderer 컴포넌트를 추가하고 해당 Sprite를 할당합니다.
GameObject의 이름은 "Player"로 수정하고 Sprite Renderer 컴포넌트에서 "Sorting Layer"를 "Character" 레이어로 설정합니다.
Step 2 : Player Movement 구현
캐릭터에 자연스러운 움직임을 부여하기 위해 RigidBody2D 컴포넌트를 사용합니다. RigidBody2D는 물리 엔진을 통해 오브젝트에 중력, 충돌, 힘 등을 적용할 수 있게 해줍니다. 플레이어 캐릭터에 RigidBody2D를 추가하고, 중력을 설정하면 캐릭터는 땅에 닿아있을 때는 중력에 따라 아래로 떨어지고, 플레이어의 입력에 따라 움직이게 됩니다.
1, Player Input System
입력은 Unity의 Input System을 활용하여 플레이어의 입력을 받아오도록 합니다. Input System은 다양한 입력 디바이스에 대한 통일된 처리를 제공하며, 키보드나 게임 패드의 입력을 쉽게 감지할 수 있습니다. Input System을 사용하기 위해서는 PackageManager에서 Input System Package를 추가해야 합니다.
2, PlayerController
먼저 플레이어 캐릭터의 움직임을 구현할 PlayerController Script을 만듭니다.
[RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour { // 플레이어 이동 속도 public float walkSpeed = 5.0f; // 플레이어 이동 입력값 Vector2 moveInput; // 플레이어 이동 여부 확인을 위한 프로퍼티 public bool IsMoving { get; private set; } // RigidBody2D 컴포넌트 Rigidbody2D rb; // Awake 함수는 Start 함수보다 먼저 호출되는 메서드 private void Awake() { // RigidBody2D 컴포넌트를 가져와 rb에 할당 rb = GetComponent<Rigidbody2D>(); } // Start 함수는 게임 오브젝트가 활성화된 첫 프레임에서 호출 void Start() { // 초기화 코드나 시작할 때 필요한 작업을 수행 } // Update 함수는 매 프레임마다 호출 void Update() { // 여기에는 주로 입력 처리 등이 들어감 } // FixedUpdate 함수는 일정한 간격으로 호출되는 메서드 private void FixedUpdate() { // 플레이어 이동 처리 rb.velocity = new Vector2(moveInput.x * walkSpeed, rb.velocity.y); } // Input System에서 호출되는 이동 입력 처리 함수 public void OnMove(InputAction.CallbackContext context) { // 입력값을 읽어와 moveInput에 할당 moveInput = context.ReadValue<Vector2>(); // 이동 여부를 확인하여 IsMoving 프로퍼티 업데이트 IsMoving = moveInput != Vector2.zero; } }
그 다음에 PlayerController를 Player 오브젝트에게 추가합니다. 또 Player Input Component를 추가합니다.
3, Player Input Actions
Player Input Component에서 Create Actions 버튼을 눌러 새로운 Player의 Input Actions를 만듭니다. 저는 "PlayerInputActions"로 저장하겠습니다. 그 다음에 "PlayerInputActions"를 PlayerInput 컴포넌트에 설정합니다.
그 다음에 Player Input에서 Behavior에서 기존 Send Messages에서 Invoke Unity Events로 수정합니다. 그리고 Player Move에 PlayerController의 OnMove를 연동합니다.
이게 게임을 실행하고 A,D 키나 왼쪽, 오른쪽 방향키를 입력하면 플레이어 캐릭터가 움직이는 걸 볼 수 있습니다.
Step 3 : Cinemachine Camera
1, Cinemachine 소개
Cinemachine은 Unity에서 제공하는 카메라 시스템 패키지로, 다양한 카메라 기능과 설정을 제공하여 게임에 더 나은 시네마틱 경험을 제공합니다. 이번 단계에서는 Cinemachine을 사용하여 플레이어를 따라가는 카메라를 구현해보겠습니다.
2, Cinemachine 설치
- 먼저, Unity Package Manager를 통해 Cinemachine을 설치해야 합니다.
- Unity 상단 메뉴에서 Window > Package Manager를 선택합니다.
- Package Manager 창에서 Packages: Unity Registry를 클릭하고, 검색란에 "Cinemachine"을 입력합니다. 나타나는 Cinemachine 패키지에서 설치 버튼을 클릭하여 설치합니다.
3, Cinemachine Camera 설정 및 연결
- 하이어라키 창에서 마우스 우클릭하고 Cinemachine->2D Camera 컴포넌트를 추가하여 설정을 진행합니다.
- Virtual Camera의 컴포넌트의 Follow 속성에 플레이어를 할당합니다. 이로써 카메라는 플레이어를 따라가게 됩니다.
- 또한 Main Camera에 Pixel Perfect Camera를 추가합니다. 캐릭터 및 배경의 픽셀이 깨지는 현상을 방지합니다.
Step 4 : Parallax Effect
게임에 깊이감을 더해주기 위해 Parallax Effect를 구현합니다. 배경 이미지를 여러 레이어로 나누고, 각 레이어를 서로 다른 속도로 스크롤하게 만들어줍니다. 이렇게 하면 플레이어 캐릭터가 움직일 때 배경도 함께 움직이는 효과를 얻을 수 있습니다.
먼저 ParallaxEffect 스크립트를 추가합니다. 코드는 다음과 같습니다.
public class ParallaxEffect : MonoBehaviour { public Camera cam; // 카메라를 참조하기 위한 공개 변수 public Transform followTarget; // 팔로우할 대상을 참조하기 위한 공개 변수 Vector2 startingPosition; // 패럴랙스 게임 오브젝트의 시작 위치를 저장하는 벡터 float startingZ; // 패럴랙스 게임 오브젝트의 시작 Z 값 // 카메라 이동량을 계산하여 반환하는 익명 속성 (Property) Vector2 camMoveSinceStart => (Vector2)cam.transform.position - startingPosition; // 대상과 패럴랙스 오브젝트 간의 Z 거리를 반환하는 익명 속성 (Property) float zDistanceFromTarget => transform.position.z - followTarget.transform.position.z; // 클리핑 플레인 (클리핑 평면)을 계산하여 반환하는 익명 속성 (Property) // 플레이어와 배경 오브젝트 사이의 거리값에 따라서 다른 움직임 효과를 나타내기 위한 변수 // 동일한 효과를 주고 싶으면 0.1f로 고정해도 됩니다. float clippingPlane => (cam.transform.position.z + (zDistanceFromTarget) > 0 ? cam.farClipPlane : cam.nearClipPlane); // 패럴랙스 계수를 계산하여 반환하는 익명 속성 (Property) float parallaxFactor => Mathf.Abs(zDistanceFromTarget) / clippingPlane; // Start 함수는 첫 번째 프레임 이전에 호출됩니다. void Start() { // 패럴랙스 게임 오브젝트의 시작 위치와 Z 값을 저장합니다. startingPosition = transform.position; startingZ = transform.localPosition.z; } // Update 함수는 매 프레임마다 호출됩니다. void Update() { // 새로운 위치를 계산하여 패럴랙스 게임 오브젝트의 위치를 업데이트합니다. Vector2 newPosition = startingPosition + camMoveSinceStart / parallaxFactor; // 패럴랙스 오브젝트의 위치를 새로 계산된 위치로 업데이트하며 Z 값은 시작 Z 값으로 유지합니다. transform.position = new Vector3(newPosition.x, newPosition.y, startingZ); } }
이제 각 BG 오브젝트에 ParallaxEffect 스크립트를 추가하고 Player와 Camera를 설정합니다.
이제 게임을 실행하면 다음 영상같이 ParallaxEffect 효과가 추가됩니다.
마무리
이렇게 구현된 기본적인 플레이어 캐릭터와 움직임, 그리고 Parallax Effect를 통해 게임에 깊이와 동적인 느낌을 불어넣을 수 있습니다. 다음 글에서는 더 캐릭터의 애니메이션을 추가하여 게임을 발전시켜보겠습니다.
반응형다음글이전글이전 글이 없습니다.댓글