Unity 8

[Unity] Color 팔레트 UI

스프라이트 색깔 바꾸는 기능을 구현할 거다. 우리 플레이어들이 자유롭게 흑인 캐릭터를 만들 수 있도록 해보자! 0. 근데 어떻게 만들지  일단, 이 색깔 팔레트 UI는 어떻게 만들어야 하지? 아이디어는 다음과 같다.  256 * 256 사이즈의 그리드를 만들어 각 칸에 색깔을 넣어버리자!  음 좋아 좋아. 쉽고 간단하다.   그럼 게임 오브젝트를 256 * 256  개 스폰하고 그걸 잘 붙여 넣는 식으로 구현... ... ... 이건 좀 아닌 거 같은데?  그래서 다른 방법을 찾아봤다.  그리고 구원 투수 Texture2D 등장!   Texture2D는 놀랍게도 SetPixel() 함수를 이용해 픽셀 단위로 색깔을 조절할 수 있다. 즉, 256*256 사이즈의 Texture2D 하나만 있으면 256*25..

Unity 2025.02.28

[Unity][Netcode] 앙박의 멀티 구현 도전기

소소한 메타벅스 프로젝트를 진행했다. 유니티 넷코드와 큰 흐름에서의 스크립팅 기술에 관해 고민하고 적용하며 문제를 해결해나갔다. 본 포스팅에서는 내가 겪었던 과정을 처음부터 차근차근 짚어볼 거다. 독자들은 남의 일기 훔쳐 본다는 느낌으로 읽으면 좋고, 나는 복습하는 용도로 글을 쓸 거다. 참고로 트러블 슈팅의 성격을 지키면서 글을 쓰려 노력할 건데, 소소한 문제가 너무 많았고 대부분이 공부가 덜 되서 발생한 거라 나중 가면 그냥 일기처럼 될 거 같다.0. 시작 프로젝트는 모 부트캠프에서 과제로 준 거다. 받자마자 "메타버스는 멀티지!" 라는 생각으로 멀티 구현에 돌입했다. 1년 전에 NETCODE를 사용하는 친구를 본 적이 있었는데, 그게 궁금해서 netcode를 써보자 결정했다. 패키지를 설치하고 예제..

Unity 2025.02.20

[Unity][Error] 솔루션의 프로젝트 중 하나 이상이 제대로 로드되지 않았습니다. 자세한 내용은 출력 창을 참조하십시오.

언리얼 잠깐 만지고 왔더니 유니티가 삐졌다. 크아악 내가 미안해!   언리얼이랑 비쥬얼 스튜디오를 연결하느라 여러 패키지를 설치했는데 이게 문제인 걸까?    유니티 프로젝트 파일 안에 있는 Assembly-CSharp.csproj를 열 수 없다고 한다. 근데 파일 자체는 멀쩡히 있다. 단순히 연결이 끊긴 것으로 보인다.  해결법 1 Assets -> Reimport ALL  이러면 프로젝트 내의 모든 에셋, 스크립트, 텍스처, 오디오 파일 등을 다시 한 번 유니티가 처리하여 캐시와 메타데이터를 재생성한다.  내 경우엔 이게 통하지 않는다.해결법 2  나의 경우 솔루션 탐색기를 보면  Assembly-CSharp가 언로드되었다고 나온다.   그래서 프로젝트 다시 로드를 눌렀지만 이 또한 통하지 않았다. ..

Unity 2024.09.07

1억 번 연산, CPU vs GPU

보통은 O(1억)은 1초를 소모한다고 한다. 근데 요즘같이 하드웨어가 발달한 시대에도 그럴까? 내 CPU는 라이젠 7800x3d로 클럭 속도가 4.2GHz이다. 이 클럭이면 이론상 1초에 약 42억 번의 연산이 가능하다고 한다. 너무 다르잖아... 그럼 GPU는 어떨려나? 직접 해봐야겠다.  병렬 연산에서 GPU는 CPU보다 수십배 빠르다. 그 이유는 압도적인 코어 수의 차이에서 비롯한다. 현재 내 컴퓨터의 CPU는 라이젠 7800x3D로 8개의 메인 코어를 가지고 있고, GPU는 4070TI 7680개의 CUDA 코어를 가지고 있다. CPU 코어가 CUDA 코어보단 강력하긴 하지만, 애초에 CUDA 코어는 간단한 병렬 연산을 위한 작은 유닛이기 때문에 병렬 연산에선 큰 문제가 없다.  게임 분야에서는 ..

Unity 2024.08.31

[Unity] ISerializationCallbackReceiver

유니티에는 '직렬화'라고 불리우는 프로세스가 있다. 이 프로세스에서는 데이터 구조 및 오브젝트 정보를 저장과 복구가 가능한 포맷으로 변환한다. 직렬화를 거치면 씬, 에셋, 에셋 번들을 메모리에 저장하거나 로드하며, 클라이언트가 만든 ScriptableObject 스크립트 오브젝트 및 [Monobehaviour] 컴포넌트도 이에 속한다. 그리고 인스펙터 창은 직렬화된 필드 값을 보여준다. 인스펙터에서 값을 변경하면 인스펙터는 직렬화된 필드 값을 업데이트하는 역직렬화를 트리거한다. (공식문서 LINK)  위는 유니티 공식문서에서 발췌했다. 문서에는 이것 말고도 중요한 내용이 무척 많아서 두고두고 공부할만하다.   아무튼 여기서 내가 강조하고 싶은 것은 인스펙터 창이다. 인스펙터 창은 '직렬화된 필드 값을 보..

Unity 2024.08.29

[Unity] A* 알고리즘이 필요해

디펜스 게임을 만들던 중 길찾기 알고리즘을 만들 필요가 생겼다.   먼저 필요한 것과 주어진 것을 되짚어 보았고, 나는 맵을 Grid단위로 쪼개서 관리하고 있었다.  그러곤 Gird 길찾기 알고리즘을 구글링 해보니까 A* 알고리즘이 가장 무난하다는 걸 알게되었고, 이건 대학교 때 이미 몇 번 다뤄본 알고리즘이다. (솔직히 기억은 안 난다)  그래서 A* 알고리즘을 선택했다.   정말 별 거 없는 이유로 선택했다는 생각이 잠깐 든다. 이론 내 맵은 Grid이고 A* 알고리즘이 적합하지만, A* 알고리즘 자체는 grid를 넘어 다양한 맵에 적용할 수 있다. 맵은 path, graph의 형태를 띄면 되고, Path/Graph Search Algorithm 키워드로 검색을 하면 A*는 단골로 등장한다.   그럼..

Unity 2024.08.25

[Unity] Serialize, 유니티식 세이브&로드

유니티 에디터로 게임을 만들 떄 Save&Load 기능을 구현하고 싶다면 직렬화(Serialize)를 사용하면 된다. (그렇다고 이게 정답이란 건 아니다. 상황에 맞게 선택하자)  직렬화는 Unity가 데이터를 저장하고 불러오는 프로세스이며, 이에 대한 자세한 내용은 다음 유니티 공식문서 링크에서 확인할 수 있다. 링크 ( +직렬화가 되어야 유니티 인스펙터에서 해당 변수를 확인하고 수정할 수 있다. Dictionary같이 직렬화되지 않는 타입들은 인스펙터에서 볼 수 없어서 여간 불편한게 아닌데, 다행히도 직렬화 되게끔 해주는 인터페이스를 유니티에서 제공한다. 링크)  이 글에선 내가 직렬화를 사용해 어떻게 세이브 로드 기능을 구현했는지 다룰 거다.  내가 Save&Load 기능이 필요했던 이유는 맵 에디..

Unity 2024.08.11

[Unity][Design Pattern] Singleton, GameManager

싱글톤이 뭘까?The Singleton pattern ensures that a class has only one instance, and provides a global point of access to it.싱글톤 패턴은 클래스에 인스턴스가 하나만 있도록 보장하며, 이에 대해 어디서든 접근할 수 있는 global point를 제공합니다.언제 쓸까?플레이어의 HP는 딱 하나 존재한다. MP, 공격력, 인벤토리도 그러하다. 이런 데이터를 만들 때 쓴다.몬스터를 소환해주는 매니저가 있으면 좋겠다. 이럴 때 쓴다.등등 무궁무진한 활용법이 존재한다.간단한 유니티 싱글톤 코드using UnityEngine;public class GameManager : MonoBehaviour{ //Singleton in..

Unity 2024.07.04