전체 글 26

유니티 - 캐릭터를 따라다니는 텍스트 박스(1)

산나비처럼 초상화 없이 캐릭터 머리 위에 뜨는 미니 텍스트 박스를 구현해보자  우선 설정한 조건은 아래와 같다.1. 텍스트 사이즈에 따라 텍스트 상자 길이가 달라짐 2. 너무 길면 2줄로 표기 3. 글자가 순서대로 출력 예시)    선     선생     선생님     선생님이4. 만약에 아직 텍스트가 출력중일때 입력 다시 들어오면 전부 출력5. 이미 출력 완료인 상태면 Enter 눌렀을때 다음 대사 출력 6. 캐릭터의 머리 위에 출력(좌표 지정) 텍스트가 순차적으로 출력되는 것부터 구현했는데 늘 하던대로 Update에서 전체 문장 중 출력할 부분 까지만 TMP에 입력하는 방식으로 구현했다. 처음엔 IsTextFlow IsTextEnded 같은 bool값 몇개 사용해서 진행해보려고 했는데 텍스트 박스의 ..

유니티 - 제네릭(Generic Type), 델리게이트(Delegate)

오늘은 내가 맨날 헷갈려하는 두 골칫덩이에 대해 설명한다... 사용법을 이해는 했는데 아직 내 코드에 넣으려고 하면 매번 까먹어서 정리해둬야 할 것 같다. 우선, 제네릭 타입(Generic Type). 제네릭은 클래스, 인터페이스, 함수 등에서 동일하게 작동하지만 매개변수의 타입만 다른 경우에 사용하는, 말하자면 공용 타입? 인 셈이다. 예를 들어 a와 b 두 숫자를 더하는 함수를 작성하는데 int 형식일수도, float 형식일수도 있다. int SUM(int a. int b) float SUM(float a, float b) 이런 경우 형식에 따라 매번 다른 함수를 만들어주는 것보다 T SUM(T a, T b) //이렇게 쓰는게...? 맞나? 암튼 이렇게 해두면 한 함수로 여러 타입 우려먹을 수 있다...

유니티 - 비트 플래그

제작을 하다보면 여러가지 변수가 필요해진다. 비트 플래그를 어떻게 쓰는지는 익힌 적이 있었지만 굳이? 그렇게 복잡하게? 그냥 변수 n개 만들면 되는 걸... 같은 안일한 생각으로 실사용하지 않았었다. 하지만 이번에 총 12개의 껐다 켰다 할 수 있는 토글을 만들어야하게 되었는데 비트 플래그로 만들면 된다는 조언을 바탕으로 사용해보게 되었다. 비트 플래그 값 지정하기 x1 = 1 x2 = 2 x3 = 4 x4 = 8 이런식으로 2의 배수로 정해주면 3 → x1, x2 / 5 → x1, x3 / 6 → x2, x3 / 7 → x1, x2, x3 / 8 → x4 즉, 모든 경우의 수가 1부터 순차적으로 저장됨 값 다루기 특정 위치 비트 상태값 바꾸기 Value ^= Option1 → 옵션 1번만 토글하기 00..

유니티 - 배열 혹은 리스트 마지막 번호 <-> 0번 자동화

리스트나 배열을 사용하다 보면 0번 이전의 마지막 인덱스나 마지막 인덱스 이후의 0번 인덱스를 검사해야하는 일이 자주 생긴다. 그때 매번 if ( 인덱스가 0보다 작아지면... ) 같은 방어코드를 짜야만 인덱스가 음수로 가거나 null이 뜨지 않는다. 이런 일이 자주 발생해서 그냥 자동으로 0보다 작은 값이면 마지막 인덱스로, 마지막 인덱스보다 큰 값이면 0번으로 보내주는 함수를 사용하면 코드가 간단해진다. 아래는 실제 사용한 벡터 리스트 버전 함수다. 값이 필요한 부분에 ListItem( List, index )를 넣으면 알아서 넘치거나 음수가 된 인덱스를 계산해서 값을 반환해준다. Vector3 ListItem (List array, int index) { if (index >= array.Count..

유니티 - 좌표계

유니티 3D의 좌표계는 총 3가지. 또 모든 오브젝트는 월드 좌표와 로컬 좌표 2가지를 각각 가지고 있다. 기본적으로 월드 좌표는 new Vector3 (100, 10, 100) 처럼 그 월드의 0, 0, 0 좌표를 기준으로 절대적인 위치를 뜻한다. 반면에 로컬 좌표는 부모 좌표를 기준으로 내가 가지고 있는 상대 좌표다. (하이어라키에 뜨는 좌표는 대체로 로컬좌표다. 아마?) 예) 부모 좌표가 10, 10, 10 / 내 로컬 좌표 0, 10, 0 이라면 내 월드 좌표 : 10, 20, 10 내 로컬 좌표 : 0, 10, 0 이런식으로 변해서 부모 좌표가 이동되면 자식들도 고대로 따라서 이동하는 원리다. 이건 뭐 간단하다... 그런데 UI를 위해 카메라를 기준 좌표가 필요해지면서 복잡해진다. 스크린 좌표(..

아는 만큼 보인다.

마지막으로 글을 쓴 지 2개월, 회사에 입사하고 작은 프로젝트 하나를 맡아 거의 마무리하고 있다. 호기롭게 회사에서 작업 끝날때마다 백업해두겠어! 라는 마음은 퇴근 직전에 겨우 해결되는 버그들과 한꺼번에 많은 정보값 입력으로 금붕어가 되어버린 뇌 덕분에 사실상 무지성 필기노트가 되어버렸다. 그나마 더 잊어버리기 전에 주말에도 작게 시간을 내서 정리해두고자 한다. 초심으로 돌아가서 변하려고 하는 나를 붙잡고 기억하려고 노력해본다.

🌌 동기 부여 2022.12.31

C++ - 벡터 클래스 구현하기(2)

빨리 해치우고 유니티 디자인 패턴 공부해야한다. 미룰라고 했지만 벡터 클래스 안써놓으면 무조건 까먹을 거 같아서... 지금 지식의 정수를 남겨놓아야만 한다. 요기까진 간단하다. Capacity 달라길래 리턴해주고 size 달라길래 리턴해줬다. id를 추가하는 것도 우선 capacity에 데이터가 가득 차 있는지 확인하고 가득 안 차있으면 바로 새 요소를 추가해준다. 가득 차있으면 capacity를 두배로 늘리고 현재 값을 temp에 넣어서 capacity, temp, size에 맞춰 다시 재할당. 그리고 요소를 추가한다. 꽤 고생한 함수. 일단 반환형이 포인터라서 found라는 놈을 지정해줬다. 원래는 포인터 두개 넣고 A가 이동하면서 찾다가 찾으면 B에 값을 전달. B를 리턴, 하려고 했는데 좀 생각해..

C++ - 벡터 클래스 구현하기(1)

제가 C++을 할 줄 안다고 했던가요? struct랑 cout 정도는 아는데 말입니다. 선행과제로 내준 벡터 클래스 직접 구현하기. 회사는 상상도 못했겠지만 난 벡터를 모른다ㅋ 클래스도 대충 함수를 담을 수 있는 구조체 정도로만 인식하고 있는데..... 정말 다행인건 거짓말처럼 이 선행과제 도전하기 하루 전날 알고리즘 책을 사와서 자료구조가 뭔지 이해하고 시작했다. 스택이랑 힙. 내가 평상시 쓰는 함수들은 스택에 저장했다가 함수가 종료되면 자동삭제 된다고 한다. 힙은 내가 직접 사이즈를 정해서 저장하고 내가 삭제해주지 않으면 계속 비어있다 -> 이게 '할당'의 뜻이다. 여기서부터 저기까지 자료 저장할 거라고 구역을 정해주는 게 [할당] 그러니까 동적 할당은 내가 입력한 사이즈로 자동으로 할당해주는 함수를..