Unity 77

A* 알고리즘 및 최적화

디펜스 게임 등 몬스터가 출발지점과 도착지점을 알고, 이를 찾아가야 할 경우에 길찾기 알고리즘을 사용하는데 3D 에서는 navmesh를 이용하여 AI의 길을 찾아줄 수 있지만, 2D에서는 navmesh를 이용하기 보다는 A* 알고리즘이 더 유용하다고 하여 이를 구현해보았다. 먼저 들어가기에 앞서 몇몇 용어를 알고 가면 좋은데 이는 A* 알고리즘과 휴리스틱 그리고 맨해튼 거리이다. 1.  A* 알고리즘최단 경로 탐색 문제를 해결하는 알고리즘 중 하나로, 시작점부터 목표점이 주어지면 최적화된 경로를 찾는 알고리즘이다. A*의 중요점은 경로의 각 노드에 대해 두 가지 비용을 계산하여 탐색을 진행한다. 1. g: 시작 노드에서 현재 노드까지의 실제 비용 (경로의 거리)2. h: 현재 노드에서 목표 노드까지의 추..

Unity 2024.08.15

[Unity] 화살표로 타겟 가리키기 (Quaternion.LookRotation)

게임내에서 타겟을 가리키는 화살표를 구현하는 내용이다. 화살표가 타겟에 고정되며 이 화살표는 플레이어의 주변을 멤돌게 된다. 1. 오브젝트오브젝트는 타겟을 가리킬 화살표와 움직일 캐릭터, 그리고 타겟이 될 오브젝트 3개가 있으면 준비가 끝이다. 2. 스크립트스크립트에 필요한 내용은 다음과 같다. 1. 타겟 오브젝트2. 타겟의 Transform3. 화살표의 Transform4. 플레이어와 화살표의 거리5. 플레이어6. 플레이어와 타겟 사이의 거리값- 화살표의 높이는 게임의 기획따라 달라지는데 이 글에서는 바닥에 놓도록 구현하였다.  [SerializeField] private GameObject Target; [SerializeField] private Transform TargetP..

Unity 2024.07.31

Extension Method

확장 메서드 ( Extension Method ) 는 기존 클래스에서 새로운 메서드를 추가하는 기능을 제공한다. 이 방법을 사용할 경우에 코드를 수정하지 않고도 클래스의 기능을 확장할 수 있다. 사용 방법은 메서드의 첫번째 매개변수에서 this키워드와 함께 확장할 클래스의 인스턴스를 나타내고, static 정적 클래스로 만들어서 정의하면 쉽게 사용할 수 있다. public static bool IsNullOrEmpty(this string str){ return string.IsNullOrEmpty(str);}string test = null;bool result = test.IsNullOrEmpty(); 이렇게 뒤에 확장 메서드를 참조하여 호출하여 사용할 수 있다. Unity에서도 gameObje..

Unity 2024.06.25

오브젝트 풀링 정리

개요자주 사용되는 ObjectPooling을 정리해둔 것을 찾아보려 했으나 의외로 없어서 정리하는 시간을 가지기 위해 블로그에 정리하기로 하였다. ObjectPooling이란?유니티 게임 개발에서 최적화 방식 중 하나로 객체를 파괴하고 다시 생성하는것을 반복하는 비용을 줄이기 위한 방법 중 하나이다. 이는 일정 수의 객체를 미리 생성해두고 필요할 때 풀에서 객체를 가져와 사용한 후, 다시 반환하는 방식이다.즉, 프로그램이 시작되거나 첫 번째 요청시에 풀을 초기화하며 객체를 생성하고, 사용이 끝난 객체는 파괴하는 것이 아니고 반환되어 재사용대기를 한다.  ObjectPooling의 이점당연히 객체의 생성과 파괴에 드는 비용이 줄기 때문에 애플리케이션의 성능이 향상된다. 또한 메모리 관리 비용이 줄고 객체를..

Unity 2024.06.21

스택과 힙, 복사와 참조

프로그래밍에서 흔히 사용되는 내용이지만 중요한 것 중 하나가 복사와 참조이다. 간단히 말해서 복사의 경우는 값을 복사하여 사용하기 때문에 본체에 영향을 주지 않은 채로 값을 사용하는 것이며, 참조의 경우는 값을 가져와서 사용하기 때문에 본체에 대한 영향을 주게 되어있다. class Knight { public int hp; public int attack; } struct Mage { public int hp; public int attack; } static void Main(string[] args) { Mage mage; mage.hp = 100; mage.attack = 10; Knight knight = new Knight(); knight.hp = 100; knight.attack = 10; ..

Unity 2024.04.18

[AR/VR] AR Foundation 설정

유니티로 AR 설치하려면 먼저 3D Core 로 프로젝트를 생성하고 패키지 매니저에서 설치해야 할 항목이 있다. 패키지 매니저 설치 Window에서 PackageManager로 가서 ARFoundation과 ARCore를 설치한다. ProjectSetting 설치했다면 Edit의 ProjectSetting에서 XRPluginManageMent 의 안드로이드 탭에서 Android ARCore를 체크해준다. 그리고 Player에서 몇개를 체크해주도록 하자 - Auto Graphics API 해제 > Vulkan 삭제 : AR Core는 Vulkan 지원 x - identification - minimum api level - android 7.0 nougat 으로 설정 (구글 정책에 의해 level 24 이..

Unity 2024.04.01

퀘스트 로드에서 사용했던 FirstOrDefalut 함수

문제 상황 서론 게임 시간으로 일일 퀘스트인데, 일차가 지날때마다 랜덤으로 생성되는 퀘스트를 순차가 아닌 원하는대로 퀘스트를 받으면 우측 퀘스트 목록에 받은 퀘스트의 순서가 나타나게 된다. 이때 퀘스트의 아이디가 사냥퀘스트는 10001, 10002 / 채집퀘스트는 20001, 20002 었는데 10001, 20002, 10002 를 수락하고 게임을 저장했다고 가정해 보자. 그렇다면 리스트에서 저장한 순서대로 10001, 20002, 10002 퀘스트를 리스트에 저장하고, 이를 다시 로드했을 때 어떤식으로 로드해야 하는지에 대한 고민이었다. 필자가 사용한 로직에서는 수락된 퀘스트 뿐만아니라, 수락되지 않고 일일마다 생성되는 퀘스트도 있어야 하기 때문에 먼저 일일생성퀘스트를 로드해주었고, 퀘스트들은 Ques..

Unity 2024.02.27

CoolTimeManager 만들기

1. 이전 코드 및 문제사항 이전 코드에서 Player에서 각각 쿨타임을 계산해주는 식으로 해주었다. 그러나 문제점 중 하나가 플레이어가 로딩 씬에서 플레이어를 잠시 꺼줬다가 켜주기 때문에 코루틴으로 쿨타임을 계산하는 것이 Player내에있으면 문제가 생겨 버린다. 아래는 이전에 썼던 쿨타임 컨트롤러이다. 물약사용과 스킬 대쉬 모두가 이런식으로 코드를 쓴 후 Player가 들고있는 식이었다. 예시(스킬, 대쉬, 포션사용 등 쿨타임이 들어가는 부분은 대부분 코루틴이 이런 로직이었다.) using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public cla..

Unity 2024.02.14

UI 최적화

유니티에서 UI요소를 화면에 배치하고 구성하는 것이 일반적이지만, 결국 프로젝트가 진행되면 될수록 UI요소는 많아지고 복잡해질 수 밖에 없다. 그래서 UI 최적화에 대해서는 한번쯤은 정리해보자 해서 포스팅하게 됐다. 유니티에 보면 윈도우 -> analysis -> FrameDebugger나 Game창의 Stats에서 Batches 와 Setpass calls 수치를 통해 UI가 최적화가 잘 되는지 아닌지를 잘 파악할 수 있다. FrameDebugger에서는 실행 후 enable을 해보면 얼마나 드로우 콜이 일어나는지 알 수 있다. 드로우콜은 CPU에서 GPU에게 그림을 그려달라고 하는 것을 말하며 이를 줄이는 것이 최적화에 도움이 된다. 마찬가지로 Batches는 드로우콜이나 쉐이더등을 그리는 것을 합친..

Unity 2024.02.13

유니티 EditorWindow로 개발자 툴 만들기

유니티에서 제공되는 EditorWindow를 사용하면 자신이 원하는대로 인스펙터 창을 꾸밀 수 있다. 게임사이클을 어느정도 진행하여 만들었는데 플레이어를 씬 이동한다던가, 골드등을 다시 하나하나 모으면서 테스트하기에는 시간이 너무 오래 걸린다. 그래서 테스팅용으로 개발자 툴을 만들어서 자신이 원하는 값을 넣고 테스팅하기 용이하게 해주는 방법이 있다. EditorWindow 상속을 받아서 메뉴 항목에 추가하고, OnGUI 메서드로 개발자 툴을 생성할 수 있다. public class TestEditor : EditorWindow { [MenuItem("Window/Custom Developer/Scene")] public static void Open() { GetWindow("인스펙터 이름"); } pr..

Unity 2024.02.01