Unity - 데이터 저장 방식 : PlayerPrefs, JSON, CSV, ScriptableObject
·
Unity
PlayerPrefsUnity가 기본 제공하는 가장 간단한 로컬 저장 방식으로 소규모 설정값 등을 간단하게 저장하기에 좋다.OS별 레지스트리 또는 설정 파일에 저장되며 파일 기반이 아니기에 가볍다.하지만 암호화되지 않아 치트나 메모리 변조에 취약하다.영구 저장이 가능하긴 하지만 대량 데이터에는 부적합하고 불편하다.또한 이전에는 옵션값 등을 주로 썼지만, 요즘에는 옵션값을 로컬 환경이 아닌 계정 귀속으로 설정하는 경우가 많기에 이것도 조금 애매해졌다... 기본 사용법은 아래와 같다.using UnityEngine;using UnityEngine.InputSystem;public class SaveTest : MonoBehaviour{ public float playerHealth = 100; v..
Unity - Object Pool Pattern : 오브젝트 풀
·
Unity
Object Pool Pattern : 오브젝트 풀오브젝트 풀은 쉽게 말해 한 번 생성한 객체를 재사용하는 설계 패턴이다. 유니티의 Object들은 기본적으로 Transform 을 포함한 여러 컴포넌트들을 보유하고 있어 생성시에 약간의 부하가 있다.또한 오브젝트가 파괴 될 때도 GC(Garbage Collector) 에 의한 부하가 발생하여, 많은 수의 오브젝트가 생성 및 파괴가 발생하면서 성능 저하를 유발할 수 있다. 이것을 방지할 수 있는 것이 바로 오브젝트 풀이다.생성 / 파괴가 아닌 활성 / 비활성화 과정을 통해 한번 생성한 오브젝트를 재활용하여 이러한 부하를 줄여주는 기법이다. 동작 원리는 매우 간단하다.초기화 : 풀을 초기화 혹은 초기 풀 사이즈에 맞게 미리 생성할당 : 풀에서 꺼내 사용반납 ..
Unity - FSM : Finite State Machine - 유한 상태 머신
·
Unity
FSM : Finite State Machine - 유한 상태 머신오브젝트가 여러 상태 중 하나의 상태만 활성화된 상태로 존재하며, 특정 조건이 만족될 때 다른 상태로 전이하는 구조다.캐릭터의 걷기, 뛰기, 공격 등 상태 단위로 정의하고, 그 상태에 따라 애니메이션을 재생하는 기능을 예시로 들 수 있다.게임을 만들 때 현재 게임의 Playing, Paused, GameOver 등의 상태를 관리하는 것 또한 FSM이라 볼 수 있다. 이러한 FSM은 행동 단위로 분할된 구조 덕분에 구현 및 유지 보수에 강점을 갖는다. 구성 요소State (상태)시스템이 가질 수 있는 유한한 상태 (Idle, Move, Attack 등)Transition (전이)상태 간 이동을 결정하는 조건 또는 이벤트Event / Inpu..
Unity - 6000.2.10f1 - InputSystem 버그
·
Unity
버그상황 재현유니티의 new Input System을 통해 다양한 액션을 정의할 수 있다. Player 오브젝트에 Player Input을 넣고, 원하는 액션맵이 정의돼있는 inputactions 파일을 Actions에 등록해서 사용할 수 있다.별도로 설정하지 않았다면 최초에 생성되는 전역 액션인 InputSystem_Actions가 자동으로 들어가있을 것이다. Action Maps에 Player의 이동에 쓰일 Move와 Rotate를 정의해두었다.(Actions 탭 하단에 보이는 두 CamActive Actions는 본래 Camera Action Maps에 있던 액션들이다.) 우선 Player의 이동 스크립트를 아래와 같이 작성했다.using UnityEngine;using UnityEngine.I..
Unity 프로젝트 이슈 해결 - 범위내 적 타게팅 최적화
·
Unity
수 많은 적을 탐지해 리스트에 담는 경우 뱀서라이크와 They are billions를 혼합한 디펜스 장르의 팀 프로젝트를 진행하던 도 중Sphere collider를 이용해 타워 근처에 접근하는 적을 감지하여 공격하는 코드를 팀원이 작성한 바 있다. using System.Collections.Generic;using UnityEngine;public class TowerTrigger : MonoBehaviour{ [SerializeField] private Transform _towerHead; [SerializeField] private float _rotationSpeed; private List _targetEnemies = new List(); private Transfo..
Unity - Raycast (레이캐스트)
·
Unity
Raycast (레이캐스트)한 점(origin)에서 특정 방향(direction)으로 보이지 않는 선(Ray)을 쏴서 충돌체(Collider)와의 교차 여부를 검사하는 기능이다.충돌 지점의 좌표를 이용해 다양한 기능에 활용할 수 있다. 총알 및 투사체 명중 판정마우스 클릭으로 오브젝트 선택AI의 시야 감지캐릭터 이동 지점 탐지카메라 차폐 처리 (벽 뒤 가림) 기본 구조Ray ray = new Ray(origin, direction);if (Physics.Raycast(ray, out RaycastHit hit, 10f)){ Debug.Log($"충돌한 오브젝트: {hit.collider.name}");} origin: 광선의 시작 위치direction: 광선의 방향 (Vector3)distance..
Design Pattern - Observer Pattern (옵저버 패턴)
·
Unity
Observer Patter - 옵저버 패턴객체 간의 1:N(One-to-Many) 관계를 정의하여, 하나의 객체 상태가 바뀌면 그 변화를 자동으로 다른 객체들에 알리는 디자인 패턴이다.Publisher(발행자)가 변경을 통보하면, Subsriber(구독자) 들이 자동으로 반응하는 구조다. 웹 프론트엔드에서도 서버나 전역 상태관리를 구독, 구독 해제 하는 기능을 사용해왔었는데 그것과 매우 유사해 보인다. 여러 객체가 하나의 상태 변화에 동시에 반응해야 할 때 유용하게 사용된다플레이어 체력 감소 → HP UI, 사운드, 로그 시스템 모두 반응게임 종료(GameOver) → 타이머 멈춤, 버튼 활성화, 텍스트 변경데이터 변경 → UI에 즉시 반영이러한 경우, 발행자가 직접 모든 객체를 참조하고 일일이 갱신..
Unity - UGUI : Unity Graphical User Interface
·
Unity
UGUI : Unity Graphical User InterfaceUnity에서 제공하는 컴포넌트 기반 UI 시스템이다.코드 중심이었던 이전 세대의 IMGUI(Immediate Mode GUI)를 대체하는 시각적 구성 중심의 UI 개발 도구다.Hierarchy 기반 UI 트리 구조로 Scene 뷰에서 직접 조절하는 방식으로 사용한다.Canvas를 통해 화면에 출력되고, 이벤트 감지를 위해선 EventSystem이 필수적으로 Hierarchy에 있어야 한다.Script와 쉽게 연동 가능하다. 기본 구조CanvasUI를 그리는 영역이자 루트 오브젝트모든 UI는 반드시 Canvas 하위에 있어야 표시된다. (바로 만들면 Canvas가 자동으로 추가 됨)RectTransformUI 전용 Transform일반 ..
Unity - Spawner에 Singleton Pattern 적용하기
·
Unity
프로젝트 현황 현재 위 사진과 같은 닷지 게임을 유니티로 제작하는 실습 상황에 있다.이전까지 구현사항은 Bullet.csBulletSpawner.csEnemy.csEnemySpawner.csPlayer.csWeapon.csInputComponent.cs이러한 구조를 베이스로 기본적으로 다음과 같은 흐름을 갖고있다. Player → 입력을 받아 **Weapon**을 작동시킴.Weapon → 내부에서 BulletSpawner.Fire() 호출.BulletSpawner → Instantiate()로 총알 생성.Bullet → 충돌 시 자기 자신을 SetActive(false)로 비활성화.EnemySpawner → 코루틴으로 일정 간격마다 적 생성.Enemy → 체력이 0이 되면 사망 처리 후 스패너에게 콜백..
Unity - EventSystem (이벤트 시스템)
·
Unity
event 개념은 이전 C#에서 delegate를 학습하면서 다루었던 적이 있다.지금 바로 이 순간을 위한 빌드업이었다고 해도 과언이 아니다.특정 상황이 발생했을 때 다른 시스템에 알려야하는 순간이 존재하고, 이런 구조를 위해 콜백(Callback), 델리게이트(Delegate), 이벤트(Event) 가 존재한다.그리고 Unity에는 UnityEvent 라는 것이 존재한다. 델리게이트 (Delegate)메서드를 변수처럼 저장하고 호출할 수 있는 타입으로, 메서드의 참조(주소)를 담을 수 있는 콜백 구조다.public delegate void OnPlayerDie(); // 메서드 시그니처 정의public class Player{ public OnPlayerDie onPlayerDie; // 델리게..