📁 개발 히스토리 22

유니티 - 캐릭터를 따라다니는 텍스트 박스(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를 위해 카메라를 기준 좌표가 필요해지면서 복잡해진다. 스크린 좌표(..

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

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

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

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

유니티 - 텍스트메쉬프로 사용하기

지난 이틀간 얼렁뚱땅 만들어왔던 매치3 게임을 얼추 완성했다. 애니메이션이나 이펙트 하나도 없고 사운드나 게임시작, 게임종료 버튼도 없기 때문에 그닥 게임같진 않지만 어쨌든 기능적으로는 구현하는 매치3 게임이다. 그래도 점수는 표시해줘야하지 않겠나 하는 생각에 터진 주니모 숫자 세주는 점수판을 박았다. 문제는 텍스트 만드려고 하니까 유니티가 이거 새로 나왔는데 깔아볼래? 해서 등장한 TMP, TextMeshPro다. 그래도 사용법이 막 어렵진 않아서 바로 적용함. 보니까 스프라이트도 텍스트처럼 등록에서 작성할 수 있고 html코드처럼(?) 텍스트 색상 크기 굵기 이런것도 붙여넣어서 할 수 있어보인다. (이모티콘 텍스트처럼 넣는거 보고 엄청 땡겼음 언젠가 꼭 써볼듯) 스크립트는 딱 이렇게 두 줄 넣고 필요..

유니티 - 내 오브젝트에 있는 리스트에 있는 게임 오브젝트에 있는 스크립트에 있는 리스트에 있는 게임 오브젝트에 있는 스크립트에 있는 변수 가져와줘

내가 하고 싶었던 것 = 오브젝트 하나하나를 프리펩으로 해서 행마다 하나씩 프리펩 만들어주는 제너레이터 만들어야지 어? 제너레이터도 프리펩으로 만들어버려서 열별로 묶어서 관리 해야겠답 매니저 만들어서 제너레이터 넣어버리면~ 짜잔~ 깔끔하고 좋은데? 이제 랜덤하게 생성도 되고 파괴될때 제너레이터가 새로 주니모도 뽑아주고 이제 주니모들끼리 서로 확인해서 3마리 되면 스스로를 파괴하게 만들면 되겠다. 어? 말하자면 할머니 매니저 - 엄마 제너레이터 - 나 주니모 인건데 엄마 스크립트에 있는 다른 자식들(자매 주니모)와 내 색상 비교하는것만 이정도인데 옆줄 사촌들이랑은 어케 비교해야할지 까마득한데.........? 그... 우리 할머니 스크립트에 엄마들(이모들) 리스트가 있는데 거기에 이모 딸들(사촌들) n번째..