2024/11 17

[Retro유니티] Object Pooling으로 발판생성기 만들기 & 음악넣고 빌드하기

발판을 무한 반복 생성하여 배치하는 발판 생성기를 구현하자.가장 간단한 방법은 매번 새로운 발판을 생성하는 것인데,이 방법은 발판 오브젝트를 kill하지 않기 때문에, 메모리 사용량이 계속 증가하는 문제가 있다.따라서 Object Pooling 방식으로 발판을 생성/관리하도록 하자. Object Pooling은 Object를 미리 만들어서, Pool에 쌓아두는 방식이다. Pool에 Object를 생성해두고, 필요하면 생성 대신, Pool의 Object를 가져다 쓴다.필요 없다면 파괴하는 대신, 비활성화하고 Pool에 반환한다.- Instantiate() 또는 Destroy() 메서드는 오브젝트를 실시간으로 생성/파괴하는데, 성능을 많이 먹으며 GC를 유발하기 쉽다. 이것은 게임 중 Freeze를 겪게 만..

[Retro유니티] 발판 밟을 시 점수+=1 구현

목표- Prefabs를 통한 발판구현- OnEnable() 메서드- 발판Generator 구현- Object Pooling- 미리 생성된 발판 재사용  발판만들기지금은 StartPlatform 게임오브젝트의 발판(시작지점 발판) 뿐이다.발판은 두 종류로 나뉘며, feature도 다르다.1. 시작지점 발판-> 별 기능 없다.2. 그 이후 발판-> 밟을 때마다, Scored를 +=1 한다. Prefabs의 Platrofm을 Hierarchy로 드래그.그 이후,Platform 전체는 Sorting Layer를 Foreground로, 각 Obstacle들은 Middleground로 설정해준다. (Prefab 만드는 법은, Bullet Prefab 생성하는 글을 참고하라) Platform Prefab으로부터 생성..

[Retro유니티] 배경 구현, 배경스크롤링 구현 및 Deadzone 구현

목표- 움직이는 배경 구현- 움직이는 발판 구현- 낙사존 구현 Player 캐릭터는 계속 뛰는 것처럼 보이지만, 실제 X축 위치는 고정시킬 것이다.대신, 배경을 움직이게 만들어서 뛰는것처럼 보이게 만들 것이다. 배경추가- 먼저 게임 배경하늘을 추가하자. Main Camera의 Background 컬러색을 Sky 스프라이트에 어울리게 변경하자. 이 상태로 플레이를 하면, Player랑 Sky Sprite랑 앞뒤 서순이슈로 가려지는 문제가 있다.Player가 항상 Sky보다 앞에 나오게 해야한다.- Sprite Renderer Component가 그리는 Graphic의 앞뒤정렬은, Transform상의 Position과 독립적이다.  - 앞뒤정렬 순서는 Sprite Renderer의 Sorting Layer..

[Retro유니티] 2D 충돌구현 - OnTriggerEnter2D / OnCollisionEnter2D / OnCollisionExit2D 오버라이딩

PlayerController 스크립트- 사용자 입력을 감지하여 Jump- 충돌을 감지하여 장애물에 닿았다면 Die- 상황에 맞는 효과음과 애니메이션 재생  Input.GetMouseButtonDown(0) -> 0은 왼쪽마우스, 1은 오른쪽마우스, 2는 휠클릭이다. Input.GetMouseButtonDown -> 마우스 누르는 순간Input.GetMouseButton ->마우스 누르는 동안Input.GetMouseButtonUp ->마우스 떼는 순간 우리는 Player 게임 오브젝트의 Audio Source Component에 Jump 오디오 클립을 할당했다.따라서 그냥 playerAudio.Play(); 하면, 점프 사운드 재생이 된다.  Die시에는 Die 오디오 클립으로 변경해야한다.player..

[Retro유니티] FSM을 통한 Animator Controller 구현

FSM은 뭐 학부때 당연히 배우는 내용이니 넘어가고.중요한건 유니티에서 어떻게 구현하느냐이다. Animator Controller 란- FSM을 사용해서, 재생할 Animation을 결정하는 State Graph를 표현하는 Asset이다.Animator 란- Animator Controller를 참고하여 Game Object에 Animation을 적용하는 Component이다. Animator Controller는 Asset이고, Animator 는 Component 라는 점에 주의.(게임에서 Animation을 재생하려면, 둘 다 필요하다.) 이전에 Run 애니메이션 클립을 만들 때, Player Animator Controller가 자동생성되었고,또한 Player Game object에 Animato..

[Retro유니티] 2D Collider 및 Animation 추가

Circle Collider 를 추가해서, 원모양 콜라이더를 추가한다.Box대신 Circle을 써야, 각진 모서리에 안착했을 때, 부드럽게 모서리를 타고 올라가게 된다.  오디오 소스를 추가해서, 게임 Object가 소리를 낼 수 있게 하자.   캐릭터의 Sprite 이미지를 사용해 애니메이션을 만들자.   기본이 60fps라 너무 빠르다. 프레임을 낮추자.Sample Rate를 추가한 뒤, Samples를 24fps로 낮춘다. 마찬가지로 Jump, Die 애니메이션 클립을 만들자.Die는 반복재생되면 안된다. Loop Time을 해제하자. Animation 클립 관리를 위해, FSM을 활용한다.다음 공부의 목표는 FSM이다.  배운 것- Circle Collider 를 써야, 각진 모서리에 안착했을 때..

[Retro유니티] 2D 프로젝트 열기

유니티 프로젝트는 2D와 3D가 큰 차이가 없다.자유롭게 변경이 가능할 정도다 2D 프로젝트의 주요 특징은 아래와 같다.1. Sprite Type으로 이미지를 임포트2. 기본생성카메라가 Orthographic 모드를 사용3. Lighting 설정 중 일부가 비활성화된다.4. Scene창이 2D View로 보인다. ----- - 2D 프로젝트에서는, RigidBody2D 같은 2D Component를 사용하게 된다.- 대부분 Vector2로 동작하거나, z축을 무시한 Vector3로 동작한다. https://github.com/IJEMIN/Unity-Programming-Essence/tree/master/11/Uni-Run/Assets에서, Assets를 다운한다.   시작지점만들기   낙사 판정 존 만..

[Retro유니티] GameManager, TextMeshPro & Build

목표- Game Manager와 UI 만들기- Scene관리자로 Scene 로드하기- PlayerPrefs를 사용해 데이터를 저장하기- 게임을 빌드하기 에셋종류별로 폴더를 추가생성하고 정리한다. 바닥회전기능을 구현하여 Level 게임오브젝트에 적용해보자.using System.Collections;using System.Collections.Generic;using UnityEngine;public class Rotator:MonoBehaviour{ public float rotationSpeed = 60.0f; void Update() { // 1초에 y축기준 몇 도 회전할것인지 transform.Rotate(new Vector3(0f, rotationSpeed..

[Retro유니티] BulletSpawner - Update() 함수로 실행반복

Update() 메서드로 탄알을 만들것이다.그런데 Update() 메서드는 1초에 수십번 실행된다. (정확히는, 화면이 갱신될 때마다 실행된다.)따라서 무지성으로 넣으면 1초에 수십개씩 탄알이 쏟아질 것이다.따라서, timeAfterSpawn을 체크 후 탄알을 발사하는 로직을 작성해야 한다. Time.deltatime아까,Update() 메서드는 1초에 수십번 실행된다. (정확히는, 화면이 갱신될 때마다 실행된다.)라고 했다.즉, 컴퓨터 성능에 따라 초당 프레임은 가변이라는 것이다.따라서 직전 Update() 실행과 현재 Update 실행사이의 시간간격은 일정하지 않다.  Update() 사이의 물리적 시간간격을 알기위해 내장변수 Time.deltaTime을 사용한다. Instantiate(원본)런타임에..

[Retro유니티] Bullet Spawner 구현 - Start()

3D Cylinder로 된 Bullet Spawner를 만들자.일단 만드는건 대충 빠르게 만들고. 중요한건 script다. BulletSpawner.cspublic -> 사용할 상수값(탄알 생성주기 최소값, 최대값)-> 탄알생성에 쓸 원본 Prefab을 GameObject로 선언 private-> 조준대상 GameObject의 Transform Component-> 탄알생성주기-> 마지막 탄알생성시점부터 흐른 시간 참고) Range 함수는 argument가 int면 int를, float면 float를 return한다. target = FindObjectOfType().transform;=> PlayerController 타입의 Component를 보유한 GameObject를 찾고, 해당 GameObjec..