Unity 77

[Unity] FSM (유한 상태 기계)

FSM FSM은 Finite State Machine의 약자로, 유한 상태 기계를 나타내는 디자인 패턴이다. 상태와 상태간의 전환을 기반으로 동작하는 동작 기반 시스템이다. 1. FSM의 구성 요소 FSM의 구성요소로는 상태, 전환조건, 동작이 있다. 상태: 상태는 시스템이 취할 수 있는 다양한 상태를 나타낸다. 기본 초기동작인 Idle을 기본으로 하여 attack, move, run등 다양한 상태를 말한다. 전환 조건: 전환 조건은 상태 간 전환을 결정하는 조건을 말한다. 가만히 있을 때는 Idle상태로 있다가 move상태를 동작하고싶다면 움직임이 전환조건이며, 여기서 나아가 run상태로 동작하기 위해 어떤 특정한 입력키를 받아 run 상태로 전환하는 것을 말한다. 동작: 상태에 따라 수행되는 동작 또..

Unity 2023.12.22

깃허브 cherry-pick

팀프로젝트에서 깃허브는 중요하다. 사람이 하는 것이기에 누구나 실수는 할 수 있어서 신중하게 하는것은 물론이지만 만약 커밋부분에서 실수를 한다면 다시 돌려야 한다. 그 중 하나가 바로 cherry-pick 이다. 1. Cherry-Pick 체리픽은 필요한 commit만을 골라서 가져올 수 있다. 다른 브랜치에서 필요한 커밋이 있다면 이를 체리픽으로 가져오는 것을 말한다. 2. 적용 이번 프로젝트에서 내가 했던 작업이 커밋하면서 모종의 이유로 날아갈뻔한 적이 있었다. 대응 방법은 아래와 같다. 1. 날아가기 이전의 히스토리로 reorder commit한다. 2. 이전에 작업했던 내 브랜치를 다시 커밋한다. 3. 다른 팀원의 커밋들을 문제의 브랜치에서 필요한 것들만 체리픽으로 가져온다. 약간 날아간부분이있지..

Unity 2023.12.20

시네머신 카메라 - 버츄얼 카메라

팀 프로젝트 진행중에 부드러운 카메라 이동을 위해 시네머신 카메라를 사용했다. 1. 시네머신 카메라 시네머신 카메라는 유니티 패키지에 있는 카메라로 영화같은 부드러운 연출을 도와주는 카메라이다. 그 중 버츄얼카메라의 우선순위를 이용하면 멋진 연출이 가능하다. 2. 버츄얼 카메라 가상 카메라로 시네머신내에서 생성 가능한 카메라이다. 이는 시네머신 브레인 컴포넌트가 달린 카메라와 연결되어있다고 생각하면 된다. 3. 시네머신 카메라 설치 Package Manager 에서 UnityRegistry의 Cinemachine을 설치해주면 사용할 수 있다. 설치가 끝났다면 Hierachy창에서 우클릭하면 아래 시네머신 카메라가 있고 다양한 종류의 카메라가 있다. virtual Camera를 생성하면 카메라가 생성되면서..

Unity 2023.12.18

프로그래머스 두 개 뽑아서 더하기( List Distinct()로 중복값 제거하기 )

프로그래머스를 풀면서 중복되는 수의 값을 제거해야하는 경우가 생겼다. 그래서 중복값을 제거하는 함수가 있는지 검색을 해보니 Distinct 라는 함수가 있었다. 이번 포스트에서는 프로그래머스 풀이와 Distinct 함수에 대해 알아보도록 하자. 1. Distinct() 함수 Distinct 는 Enumerable 클래스의 메서드로 List의 중복되는 값을 없애주는 편리한 함수이다. 역시 말로만하면 어렵기 때문에 어떻게 쓰이는지 알아보도록 하자 2. 예제 internal class Program { static void Main(string[] args) { List list = new List(); list.Add(1); list.Add(2); list.Add(3); list.Add(6); list.Ad..

Unity 2023.12.15

Dictionary 정리 및 활용

이번에 연습겸 프로젝트를 하면서도 Dictionary를 사용했다. 하지만 어떤 느낌인지는 알고 정확한 정의라던지 새로운 예시를 알고싶어서 포스트에 정리하고자 한다. 그렇다면 유니티의 자료구조중에서 유용하게 쓰이는 Dictionary에 대해 알아보도록 하자. Dictionary는 시간복잡도로 계산해보면 효율성이 상당히 높다. 물론 검색 등에서 수가 작으면 List가 효율적이긴 하지만, 개수의 어느 기점부터 Dictionary의 효율이 확실하게 나타난다. 그러면 이 사기같은 Dictionary는 무엇인가? 이렇게 표현하면 맞는지 모르겠지만 Java 의 Map과 비슷하다. 이렇게 Key와 Value를 이용하며 Key값을 통해 Value를 필요할 때 딱 가져올 수 있다. 아래는 Dictionary의 활용 예시와..

Unity 2023.12.13

LayMask와 비트연산자 처리

유니티에서 Layer에 등록하여 처리하는 경우가 종종 있다. 이를 처리하는 방법으로 LayerMask를 활용한다. 유니티에는 총 32의 레이어를 활용할 수 있으며, 이를 한번에 처리하기 위해 정수형 변수의 각 비트(32비트)를 할당하여 처리한다. bool값으로 먼저 true false구분하여 처리할 수 있다. // 1바이트인 bool로 저장하는 의사(pseudo)코드 bool[] layerList; foreach(bool i in LayerList){ // bool : 1바이트 if(i) Render(); } 하지만 bool값으로 처리하게 된다면 적은 수의 Layer면 크게 상관없지만, 32개를 모두 검사해야 하는 상황이라면 0부터 31까지 모조리 검사하여 진행해야하기 때문에 불필요하게 연산량이 커지게 ..

Unity 2023.12.11

[Unity] 투사체 구현하기

이전에 했던 것들의 연장선이다. 이번에는 투사체를 구현하는 것을 해보도록 하자 1. 코드 수정 먼저 CharacterController에서 움직임과 에임 등을 다루고 있는데 여기서 Attack 이벤트도 바꿔줘야 한다. 이유는 ScriptableObject로 커스텀했던 캐릭터 정보를 이제는 Attack에도 적용시켜줘야 하기 때문이다. * TopDownCharacterController.cs using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class TopDownCharacterController : MonoBehaviour { // event 외부에서는 호출하지 못하게 막는다...

Unity 2023.12.08

[프로그래머스] 숫자 문자열과 영단어 C#

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다. 이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요. 참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다. 1478 → "one4seveneight" 234567 → "23four5six7" 10203 → "1zerotwozero3" 0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight..

Unity 2023.12.08

[Unity] 캐릭터 스탯 만들기

캐릭터 스탯을 만드는 과정이다. 자주 쓰이는 패턴이니 잘 기록해두고 어떤 방식으로 흘러가는지 알아보자. 사용될 것은 ScriptableObject 사용 및 Class Serializable 이다. 1. ScriptableObject 스크립터블 오브젝트는 유니티에서 제공하는 대량의 데이터를 사용할 수 있는 컨테이너이다. 스크립터블 오브젝트를 사용하면 값의 사본이 생성되는 것을 방지하여 메모리 사용을 줄이며 특히 프리팹을 사용하는 프로젝트에서 유용하다고 한다. 변경되지 않는 데이터를 사용하는 프리팹의 데이터를 일반 변수로 구현할 경우 인스턴스화 할때마다 프리팹에 이데이터에 대한 자체 사본이 생성되는데, 스크립터블 오브젝트를 사용하면 메모리에 스크립터블 오브젝트의 데이터 사본만을 저장하고 이를 참조하는 방식으..

Unity 2023.12.07

[유니티] 벽돌깨기 - 벽돌(몬스터) 풀링

몬스터를 무한히 풀링하기 위해 MonsterManager를 만들어 Prefab을 풀링을 하는 작업이 필요해 이 포스트를 작성했다. 1. MonsterManager 생성 MonsterManager 오브젝트와 스크립트를 각각 생성 (1) MonsterManager 스크립트 작성 public GameObject[] prefabs; private List[] monstersList; private void Awake() { monstersList = new List[prefabs.Length]; // List 초기화 for(int i = 0; i < monstersList.Length; i++) { monstersList[i] = new List(); } } 먼저 풀링에 필요한 prefabs를 선언, 랜덤한 여..

Unity 2023.12.07