반응형

공부 624

Part 3-10-1. Object Pooling : Pool Manager

Object Pool 오브젝트 풀을 왜 사용해야할까? 리소스 폴더에 있는 것을 Instantiate 하는 일련의 과정은 어마어마하게 느리며, SSD와 CPU는 여전히 물리적으로 거리가 떨어져 있기 때문이다. 👉 따라서 런타임 도중의 생성이 빈번하게 일어날 오브젝트에 대해서만 게임 시작 전에 미리 가져와서 로드해놓고 그를 재활용. 미리 로드해놓은 것을 켜주고 꺼주고 하는 식으로 관리하며 풀링을 진행한다. 풀링을 할 오브젝트, 풀링을 안 할 오브젝트를 구분해야 한다. 👉 이 구분을 풀링을 할 오브젝트들에만 📜Poolable 컴포넌트(스크립트)를 붙여 구분한다. 📜PoolManager 오브젝트 풀링 관리 📜Manager로 부터 사용 📜ResourceManager 를 보조 하는 역할. 📜Poolable 풀링 할..

Part 3-9-1. Sound : Sound Manager, 3D 사운드

Sound Sound Manager 1. MP3 Player, 소리 발생 근원지 👉 Audio Source 컴포넌트 2. MP3 음원, 어떤 소리를 재생할지, 음반 👉 Audio Clip 3. 관객, 듣는 사람, 귀 👉 Audio Listner 컴포넌트 Audio Listner 컴포넌트는 Main Camera에 기본적으로 달려있는 컴포넌트이다. 한 Scene 안에 하나만 있으면 된다. 소리를 발생시킬 오브젝트들에게 Audio Source 컴포넌트를 붙여준다. 이 컴포넌트의 Audio Clip 에 원하는 음원을 할당하면 된다. Volume : 소리 크기 Pitch : 재생 속도 (느리고 빠르게) 사운드 매니저를 사용하는 이유 AudioClip audioClip1; AudioClip audioClip2; A..

Part 3-8-1. Scene : Scene Manager

Scene 구조도 여태까지는 📜PlayerController에 Manager로부터 GameManager 스러운 일들을 실행시켰는데, 플레이어도 씬에 동적으로 생성되는 존재라면 📜PlayerController에 Manager를 호출하는 것은 바람직하지 않을 것이다. 생각해보면 이는 당연한 것이다. 🤔 따라서 게임 실행 내내 살아있는 선봉대 역할을 할 존재를 만들고 그에게 Manager를 호출하는 일을 맡겨야 한다. 이 선봉대 역할을 📜Scene에서 하는 것이다. 씬들. 각각 씬들만의 함수 📜BaseScene 📜GameScene 📜LoginScene 여러 씬들 한꺼번에 관리 👉 📜SceneManager 빈 오브젝트 @Scene 만들어서 그 곳에 Scene 종류가 되는 스크립트(📜GameScene 혹은 📜Lo..

Part 3-7-5. UI : 인벤토리 실습

UI 인벤토리(고정UI) 📜UI_Inven_Item UI_Inven 캔버스 UI 프리팹의 아이템 하나하나를 이루는 그 아이템에 붙는다. public class UI_Inven_Item : UI_Base { enum GameObjects // 구성 UI 오브젝트가 2개 뿐이라 그냥 GameObjects 한 곳에 묶음 { ItemIcon, ItemNameText, } string _name; void Start() { Init(); } public override void Init() { Bind(typeof(GameObjects)); // ItemIcon, ItemNameText 오브젝트 바인딩하여 상속받은 Dictionary _objects에 저장. Get((int)GameObjects.ItemNameT..

Part 3-7-4. UI : UI Manager, Blocker

UI UI 자동화를 위한 클래스 구조 📜Managers 👉 📜UIManager 를 싱글톤으로 관리 UIManager _ui = new UIManager(); public static UIManager UI { get { return Instance._ui; } } 📜PlayerController 👉 📜UIManager의 UI 캔버스 프리팹 생성해주는 ShowPopupUI(팝업 UI 경우) 함수를 호출시켜 UI 띄우기 void Start() { Managers.Input.MouseAction -= OnMouseClicked; Managers.Input.MouseAction += OnMouseClicked; // 임시로 생성 테스트를 진행한다 👻 Managers.UI.ShowPopupUI(); } 📜UIMa..

Part 3-7-3. UI : UI 자동화

UI UI 자동화 UI 자동화를 위한 클래스 구조 UI 구조 📜UI_Base 👉 모든 UI 의 조상, 모든 UI 캔버스들이 가지고 있는 공통적인 부분들. 📜UI_Scene 👉 씬 UI 의 조상, 팝업처럼 차례대로 뜨는게 아니라 원래 자리잡고 있는 고정적인 UI 캔버스들의 공통적인 부분들. 📜UI_PopUp 👉 팝업 UI 의 조상, 팝업 UI 캔버스들의 공통적인 부분들. (📜UI_Button) UI Canvas 의 종류를 고정적인 형태의 1️⃣Scene, 스택으로 관리되는 팝업 형태의 2️⃣PopUp 로 구분할 것. 바인딩, 이벤트 관련 함수 📜Util 📜UI_EventHandler 📜Define Bind : 이름으로 UI 오브젝트 찾아와 자동 할당 📜UI_Button UI_Button이라는 이름의 Can..

Part 3-7-2. UI : Button Event, IsPointerOverGameObject()

UI 팝업창 Managers.Resource.Instantiate("UI/PopUp_Canvas"); // 팝업 UI 캔버스 프리팹 생성. 이전에 📜ResourceManager 참고 게임에는 수 많은 팝업 UI 가 사용될 수 있다. 그러려면 각각의 팝업 UI 들이 독립적인 캔버스가 있어야 하고 이를 프리팹으로 만들어두어 그때 그때 생성하는 방식으로 사용해야 한다. 캔버스들은 서로 캔버스의 sort order 에 의하여 먼저 그려지고 가장 위에 그려지고 이런 순위가 결정된다. UI 입력 이벤트만 처리 using UnityEngine.EventSystems; //.. if (EventSystem.current.IsPointerOverGameObject()) return; IsPointerOverGameObj..

Part 3-7-1. UI : 기초, Rect Transform (앵커)

UI UI 기초 1. 캔버스는 도화지다 이미지, 텍스트 같은 UI 요소들은 반드시 캔버스의 자식으로 있어야지만 보이게 된다. 2. UI는 Rect Transform 으로 좌표를 관리한다. 3. UI는 씬에서 볼 때 3D가 아닌 2D로 보는게 더 편하다. T 단축키를 이용하여 Rect Transform 크기를 관리할 수 있다. 해당 기능 하나로 회전 이동 스케일 관리 다 할 수 있다. 회전 같은 경우는 모서리에 커서 갖다대면 가능 스케일도 그냥 크기 늘리듯이 키우면 되는데 shift를 누르면 비율을 유지한체 스케일 조정을 할 수 있다. 4. 중앙의 파란 점은 Pivot이다. 👉 중심 좌표 이 피봇을 중심으로 회전을 한다. 5. 바람개비 같은 것은 Anchor이다. 👉 원점 좌표 위치 찢어질 수도 있다. 6..

Part 3-6-3. 애니메이션 : KeyFrame, Event

Animation(애니메이션) Animation KeyFrame, 위치 - Window - Animation 모델에 종속된 애니메이션이 아니라 게임에 의존적인 애니메이션 직접 만들기. Animation 윈도우에서 애니메이션 클립을 만드려면 반드시 애니메이션을 적용할 오브젝트를 선택한 상태여야 활성화된다. 일종의 애니메이션 클립을 생성하는 과정이다. 애니메이션 컨트롤러의 상태 머신에 추가하고 이를 Animator 컴포넌트에 할당해주면 재생할 수 있다. 첫 번째 줄 👉 시간(프레임) 두 번째 줄 👉 애니메이션 이벤트 (다음 포스트)) 세 번째 줄 👉 프레임마다 키를 추가할 수 있음 Key : 해당 프레임에서 어떤 속성이 변할 경우 체크되는게 바로 키이다. 두 가지의 속성값만 변화시켜 입력하면, 즉 두 Key..

Part 3-6-2. 애니메이션 : State 패턴, State Machine

Animation(애니메이션) State 디자인 패턴 bool isFalling; bool isJumping; bool isSkillCasting; bool isSkillChanneling; if(isJumping) { } else { if(isSkillChanneling && isFalling) { } else { if(isSkillCasting) { } } } 이런식으로 bool타입의 상태 flag 변수를 여러개 사용하면 너무 복잡하다. if - else문이 너무 많아진다. 상태 flag 변수가 적은 갯수라면 괜찮지만 규모가 큰 게임일 수록 많이 필요하기 때문에 적합하지 않다. 해결 방법 👉 State 패턴 사용하기! using System.Collections; using System.Collect..

Part 3-6-1. 애니메이션 : 기초, 블렌딩

Animation(애니메이션) 휴머노이드 애니메이션 “Unity Model”을 선택하면 유니티에서 기본으로 지원해주는 모델에게 애니메이션을 적용시킨다. 또한 Humanoid 타입의 애니메이션 파일은 Humanoid 뼈대를 가진 모델이라면 어떤 애니메이션이든지 그 모델에 입힐 수 있다. 애니메이션의 위와같은 버튼을 누르면 애니메이션을 입힐 모델을 선택할 수 있다. 원하는 모델을 에셋에서 드래그 앤 드롭 해서 애니메이션에 입힐 수도 있다. Animator 컴포넌트 Controller 애니메이터 컨트롤러는 애니메이션을 재생 시키는 상태 머신을 정의할 수 있다. 애니메이터 컨트롤러에 할당하면 애니메이터 컨트롤러에서 정의한대로 애니메이션을 재생시킨다. Avatar 애니메이션의 뼈대가 될 아바타. 애니메이터가 Hu..

Part 3-5-3. 카메라 : 카메라가 벽에 막힐시, 벽 앞으로 카메라 이동시키기

카메라 플레이어를 따라가던 카메라가 벽에 가려지면, 벽 앞으로 카메라 이동시키기 📜CameraController.cs void LateUpdate() { if (_mode == Define.CameraMode.QuaterView) { RaycastHit hit; if(Physics.Raycast(_player.transform.position, _delta, out hit, _delta.magnitude, LayerMask.GetMask("Wall"))) { float dist = (hit.point - _player.transform.position).magnitude * 0.8f; transform.position = _player.transform.position + _delta.normalized..

Part 3-5-2. 카메라 : 클릭한 곳으로 플레이어 이동하기

카메라 롤이나 스타처럼 클릭한 곳으로 플레이어와 카메라가 따라가게 하기. 바닥에 마우스를 클릭하면 클릭한 곳으로 플레이어가 자동으로, 스스로 이동하게 한다. 방법 소개 1️⃣ 카메라를 플레이어의 자식으로 넣기 단점 👉 플레이어가 회전하면 카메라도 같이 회전한다. 그래서 휙휙 돌아서 너무 어지럽다. 2️⃣ 부모-자식 관계가 아닌 별개로 두되, 카메라가 플레이어와 적정 Vector3 값을 유지한체, 플레이어를 바라보며 따라다니게 하기 카메라의 위치는 (플레이어와의 위치 + 카메라와 플레이어의 적당한 Vector3 값)로 업데이트 하고, 카메라는 LookAt 함수를 이용하여 플레이어의 위치를 바라보게 회전한다. 플레이어가 바라보는 방향으로 회전하는 것이 아닌, 카메라가 그냥 플레이어의 위치를 바라보게 회전하는..

Part 3-5-1. 카메라 : 카메라가 플레이어를 따라다니게 만들기

카메라 카메라가 플레이어를 따라다니게 만들기 방법 소개 1️⃣ 카메라를 플레이어의 자식으로 넣기 단점 👉 플레이어가 회전하면 카메라도 같이 회전한다. 그래서 휙휙 돌아서 너무 어지럽다. 2️⃣ 부모-자식 관계가 아닌 별개로 두되, 카메라가 플레이어와 적정 Vector3 값을 유지한체, 플레이어를 바라보며 따라다니게 하기 카메라의 위치는 (플레이어와의 위치 + 카메라와 플레이어의 적당한 Vector3 값)로 업데이트 하고, 카메라는 LookAt 함수를 이용하여 플레이어의 위치를 바라보게 회전한다. 플레이어가 바라보는 방향으로 회전하는 것이 아닌, 카메라가 그냥 플레이어의 위치를 바라보게 회전하는 것이다. 📜Define.cs using System.Collections; using System.Collect..

Part 3-4-2. Raycast, LayerMask, Tag, 투영의 개념

Raycast 광선을 쏴서 충돌되는 물체가 있는지 없는지를 검사하는 것 예를 들어 1. 게임 속 물체를 클릭한다는 것은 클릭한 화면의 위치로부터, 즉 카메라의 위치로부터 레이저(Raycast)를 쏴서 닿은 물체를 활성화시키는 것과 같다. 2. 3인칭 카메라에서 플레이어를 향해 Raycast를 쐈을 때 장애물이 있다면 플레이어를 가리지 않고 제대로 찍을 수 있도록 카메라 위치를 장애물을 넘어가는 곳으로 이동시키는 식으로 구현할 수 도 있다. 3. 롤이나 스타크래프트처럼 마우스로 화면상에 찍은 위치에서 카메라가 Raycast를 월드 좌표로서 쏴서 그 곳으로 캐릭터를 이동시키게도 할 수 있다. 하나만 부딪치면 끝난다. 하나 충돌되면 더 이상 관통하지 않는다. void Update() { RaycastHit h..

Part 3-4-1. Collider, Collision, Trigger

Collider Collider 컴포넌트를 붙였다고 해서 관통이 안된다거나 튕겨진다던가 하는 처리 등은 할 수는 없다. 그러한 처리등은 Rigidbody나 NavMeshAgent 같은 어떤 물리적인 처리를 해주는 컴포넌트들이 하는 일이다. Collider는 어디까지나 그냥 참고사항일 뿐이다. 위와 같이 Mesh 는 굉장히 복잡하게 이루어져 있다. 무수한 삼각형들의 조합으로 이루어져 있기 때문에 충돌 기준을 이 Mesh 기준으로 잡으면 어마무시한 연산량이 필요할 것이다. 따라서 위와 같이 Box 모양인 Sphere 혹은 Capsule 모양의 Collider 를 Mesh를 감싸도록 붙여서 이렇게 단순하게 생긴 것으로 충돌 처리를 대신한다! Collider 영역 안에 오브젝트가 닿거나 들어오면 충돌한 것으로 ..

Part 3-3-1. Prefab (프리팹), Resource Manager

Prefab (프리팹) 프리팹 정의와 생성 👉 오브젝트를 에셋 파일로 만들어 두는 것을 Prefab 이라고 한다. 만들어 둔 프리팹을 CLone 화 하여 씬에 실존하는 오브젝트로 찍어낼 수 있다. 프리팹을 이용하여 게임 도중에도 실시간으로 오브젝트를 씬 상에서 실존하도록 찍어내어 생성할 수 있고, 프리팹 하나로 수 많은 동일한 오브젝트들을 동시에 생성할 수도 있다. Class(프리팹)를 만들어 두고 이것을 객체 인스턴스(오브젝트)로 찍어내는 것과 같다. 프리팹은 오브젝트와 다르게 게임 상에 실존하는게 아니라 오브젝트를 찍어내는 틀이라고 생각하면 된다. 프리팹 만드는 방법 그냥 프리팹화 하려는 오브젝트를 📂Assets 에 드래그 앤 드롭 하면 된다. 프리팹을 Scene에 오브젝트로서 찍어내기 (Clone ..

Part 3-2-1. Transform (트랜스폼), InputManager

[Scale] 오브젝트의 크기. 확대/축소 할 수 있는 기능이다. 지구와 성 등 보다 큰 모델을 필요하다고 가정하면, 모델을 만들 때 처음부터 거대한 모델을 만들 필요 없이 작게 만들어 유니티에 와서 Scale을 통해 크기를 늘리면 된다. [Position] 오브젝트의 위치. 이동과 관련되어 있는 기능이다. 거리 = 시간 * 속력 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { [SerializeField] private float _speed = 10.0f; void Update() { if (Input.GetKey(KeyCo..

Part 3-1-1. 싱글톤

게임 매니저 👉 전역으로 선언하여 게임 전체를 관리하는 스크립트! 게임 매니저는 '컴포넌트'이므로 딱히 어떠한 오브젝트에 꼭 붙어야 하는 이유는 없지만, 모노비헤이비어를 이용하기 위해 실체는 없지만 Scene에 존재하긴 하는 빈 오브젝트를 만들어서 매니저 스크립트를 컴포넌트로서 붙이고 사용하는 것을 권장한다. 따라서 매니저 스크립트를 붙일 용도의 빈 오브젝트를 만들자. 싱글톤 게임 매니저 스크립트가 붙은 오브젝트를 가져오는 것. 현재 “@Managers” 라는 빈 오브젝트에 게임 매니저로 쓸 Managers 라는 C# 스크립트를 붙여준 상태이다. Player.cs using System.Collections; using System.Collections.Generic; using UnityEngine; ..

반응형