본문 바로가기
728x90

분류 전체보기79

Unity, 베지에 곡선으로 포물선 만들기 (Bezier Curve) 베지에 곡선 게임 제작에 있어서, 포물선 구현이 필요한 경우가 생기는데 이는 베지에(Bezier) 곡선을 통해서 구할 수 있습니다. 이는 4개의 정점을 통해서 간단하게 구현이 가능합니다. 베지에 곡선을 구하는 원리 위 이미지를 예시로 들어, Value 값이 0.5의 Lerp되는 값을 구한다고 가정합시다 'P1, P2, P3, P4'를 위 그림처럼 이어 3개의 변을 만들어줍니다. 처러 각 변의 각각 0.5 구간이 되는 구간인 'a, b, c' 구해 옵니다. 이번에는 각각 구해진 'a, b, c'를 이어 새로운 2개의 변을 만들어 0.5 구간이 되는 'd, e'를 구합니다. d와 e의 0.5가 되는 구간인 f를 구합니다. Value값이 0.5에 해당하는 베지에 f를 얻을 수 있습니다. 이렇게 각 구간의 베지.. 2023. 3. 1.
Unity, 현재 입력된 KeyCode 가져오기 입력된 KeyCode가 필요할 때 개인적으로 키입력이 어떻게 들어오나 테스트 케이스가 필요한 경우가 있었는데, Input.GetKey(KeyCode)를 입력하는 방식으로는 일일이 체크하기 어려운 상황이 있었습니다. 다양하게 들어오는 상황이어서 여러 케이스로 반환을 해주는 함수가 필요했습니다. 스크립트 public class Utils { /// /// 감지된 KeyCode를 반환한다. /// /// 현재 틱에서 입력된 키코드를 반환 private KeyCode DetectPressedKeyCode() { foreach (KeyCode kcode in Enum.GetValues(typeof(KeyCode))) { if (Input.GetKeyDown(kcode)) { return kcode; } } ret.. 2022. 12. 28.
Unity, 유니티 버전 업그레이드 이후 전체 파일 및 에셋 갱신하기 (Refresh) 유니티 버전 업그레이드 ex) Unity2020 -> Unity2022 프로젝트를 업그레이드하는 경우, 유니티 버전 별로 각 메타(.meta)파일 또는 프리팹, 메테리얼 등 지원하는 포맷이 약간씩 다릅니다. 유니티 업데이트 이후, 해당 에셋(파일)에 접근하지 경우에만 최신 갱신을 해주는 형태입니다. 그래서인지 건들지도 않았던 에셋들이 변경되어있고, 이는 자세히 알 수도 없습니다. 이를 위해 깔끔하게 전체적으로 갱신을 해주는 작업이 필요해집니다. 스크립트 아래와 같이 ForceReserializeAssets()을 호출하면 프로젝트 내의 모든 에셋 갱신을 시도합니다. using UnityEditor; public class UtilsWindow : EditorWindow { /// /// 윈도우 열기 ///.. 2022. 12. 22.
C#, List 랜덤으로 섞기 확장함수 (Shuffle) 리스트 랜덤 섞기 리스트를 랜덤으로 섞을 때, 사용하는 확장 함수입니다. 원리는 랜덤으로 생성되는 GUID를 기준으로 Linq를 통해 다시 정렬하는 방식입니다. 스크립트 public static class Utils { /// /// 리스트 랜덤으로 섞기 /// /// /// public static void Shuffle(this List list) { var temp = list.OrderBy(item => Guid.NewGuid()).ToList(); list.Clear(); list.AddRange(temp); } } 예제 private static void Main(params string[] args) { List list = new List() { 0, 1, 2, 3, 4 }; // list.. 2022. 10. 24.
C#, 여러 개의 결과 값을 받아오기 (out, Tuple) 결과 값 여러 개로 받아오는 방법 함수를 통해 원하는 값이 여러 개일 경우 아래와 같은 방법들이 존재합니다. out 예약어를 통한 여러 개 반환 Tuple 문법을 통한 여러 개 반환 out 을 통해서 두 개의 결과값이 필요하다면 아래와 같은 문법으로 사용해야합니다. 스크립트 (out) public void GetMulipleBoolean(out bool item1, out bool item2) { item1 = true; item2 = false; } 기본적으로 배우게되는 out을 사용한 문법입니다. 필요한 인자가 많아질 수록 사용이 불편해질 수 있습니다. 예제 private static void Main(params string[] args) { GetMulipleBoolean(out bool item.. 2022. 10. 24.
Unity, 배경 스크롤링(Background Scrolling) 자연스러운 배경 슈퍼마리오나 평범한 2D 게임이면 배경이 자연스럽게 흘러갑니다. 이러한 배경들을 자세히 관찰하면 반복이 되고 있습니다. 이는 리소스 절약도 되며, 이미지가 흐르고 있기 때문에 단조로움에서도 벗어나는 효과를 주기도 합니다. 방법 유니티로 표현하는 방법은 총 2가지입니다. 같은 배경 이미지 2개를 사용하여 반복한다. Shader의 기능을 사용하여 Offset을 조절한다. 1. 같은 배경 이미지를 2개를 반복한다. 생각보다 단순합니다. 스크롤링에 자연스럽운 2개의 이미지를 이어주는 것입니다. 1번 이미지 -> 2번 이미지 -> 1번 이미지 -> 2번 이미지 위 그림과 같이 화면 밖으로 벗어난 이미지는 다시 앞으로 이동시켜주면 되겠습니다. 스크립트 using System.Collections; .. 2022. 9. 28.
Unity, 오브젝트 풀링(Object Pooling) Object Pooling 게임을 제작을 하다보면 '오브젝트 풀'이라는 것을 접하게됩니다. 먼저 풀(Pool)이라는 것에 대해서 알아보자면, 하나의 거대한 공간을 의미합니다. 또는 단어 의미 자체로만 본다면 수영장의 풀을 의미합니다. 이러한 풀(Pool)에 오브젝트를 담은 것을 '오브젝트 풀(Object Pool)'이라고 합니다. 이러한 오브젝트들을 모아두는 이유는 무엇일까요? 정확히 말을 하자면, 사용되지 않은 오브젝트들이 대기하고 있는 것을 의미합니다. 이를 재활용하기 위해서 풀이라는 곳에 담아두고 있습니다. 사용 대기를 하면서 두는 주목적은 리소스 또는 데이터의 재활용이라고 볼 수 있습니다. 예시 "전략 시물레이션 게임(RTS)에서 현재 50 vs 50 마리의 유닛이 서로 전투를 진행하고 있다. 얼.. 2022. 9. 27.
RTS-Craft, 3. 유닛(Unit) 구성 유닛 구성 유닛을 구성하려면 3가지가 필요합니다. 유닛 이미지 리소스 유닛 스테이터스(Status) 데이터 유닛 움직임을 심어줄 Monobehaviour 클래스 1. 유닛 이미지 리소스 이전 게시물에서 다룬 아래와 같은 형태로 먼저 구성을 해줍니다. Sprite Renderer로 오브젝트의 이름을 "(Order in Layer 값).Sprite - Name" 형식으로 가시적으로 구성해주었습니다. 위의 이미지를 참고하여 구성합니다. 2. 유닛 스테이터스(Status) 데이터 우리가 사용할 수 있는 원시적인 데이터(Raw Data)가 필요합니다. 여기서 말하는 데이터는 단순하게 말하자면 "체력, 공격력, 방어력"과 같은 순수한 데이터를 의미합니다. 이러한 데이터 형식은 유니티의 ScriptableObject.. 2022. 9. 24.
RTS-Craft, 2. 유닛(Unit)와 맵(Tile) 구성하기 기본적인 오브젝트 리소스 사용하기 우리가 처리해야할 부분은 아래와 같습니다. 유닛 오브젝트 만들기 타일맵(Tilemap) 만들기 1. 유닛 오브젝트 전투기(Fighter Plane)와 전차(Tank)의 예시입니다. 오브젝트 안에 모델이라는 부모를 만들어서 이미지만 넣어준 형태입니다. 애니메이션 또는 파티클등 사용할 때는 모델과 같은 선상에서 넣어줄 수 있는 형태로 구성합니다. (추후 유지보수) 유닛 프리팹 Resources 안에 위와 같이 폴더 구성을 하여, 프리팹으로 생성해줍니다. (오브젝트를 그대로 드레그해주세요.) 앞으로 이러한 형태로 유닛을 사용할 예정입니다. 2. 타일맵(Tilemap) 타일 팔레트(Tile Palette) 세팅 1. 타일맵을 이용하기 위해서는 먼저 [Window] > [2D] .. 2022. 9. 22.
반응형