2024/11 11

내일배움캠프: RenderTexture를 활용한 UI

RenderTexture를 사용하게 된 이유콜라이더를 사용해 UI인 듯 아닌 동전 주머니를 만들었는데, 해당 오브젝트를 화면에 계속해서 보여줘야 하는 상황을 구현하기 위해 OverlayCamera로 해당 작업을 처리했다. 이 과정에서 Culling Mask에 Defalut가 포함돼있지 않으면 동전 주머니 스프라이트가 검은색으로 보이는 현상이 생겨 튜터님을 찾아갔다.  하지만 다른 더 큰 문제가 존재했다. 해상도를 변경할 경우 Camera 위치는 고정되니 동전 주머니 위치가 일정하지 않을 수도 있다고 말씀해 주셨다. 청천벽력 같은 소리였다. 그래도 튜터님께서 RenderTexture를 한번 활용해 보라고 말씀해 주셔서 RenderTexture를 통해 UI를 제작하고 앵커를 콕 하고 박아줬더니 원하는 느낌으..

내일배움캠프 2024.11.29

내일배움캠프: 상호 작용 오브젝트 베이스 제작

오늘은 상호작용이 가능한 건축물의 베이스 클래스를 설계했다. 현재는 오브젝트 풀링이 적용되지 않은 상태라, 추후 오브젝트 풀링을 적용한 뒤 관련 코드를 수정할 예정이다. 개발 속도를 빠르게 유지하기 위해 처음부터 완벽한 구조를 설계하려고 시간을 소모하기보다는, 우선 작동 가능한 수준의 구조를 잡고 이후 리팩토링을 통해 개선하는 과정을 선택했다. 이런 접근은 빠르게 프로토타이핑하면서도 점진적으로 코드를 개선할 수 있다는 점에서 효율적이라고 느껴진다. 앞으로도 필요한 기능을 하나씩 추가하면서, 구조를 다듬어 나갈 계획이다.using UnityEngine;/// /// 상호작용 가능한 아키텍처의 기본 클래스 /// 상속을 통해 구체적인 상호작용 동작(HandleInteract)을 정의해줘야 합니다! /// p..

내일배움캠프 2024.11.28

내일배움캠프: 추상 클래스와 인터페이스

오늘은 상호작용 기능을 인터페이스와 추상클래스 중 어떤 것을 선택해야할 지 고민하였다. 이 과정에서 결국 추상 클래스를 선택하긴 했지만,더 명확하게 인터페이스와 추상클래스 선택점을 만들면 좋을 것 같아서 해당 내용에 관해 공부해 보았다.인터페이스 vs 추상클래스  추상 클래스인터페이스사용 키워드abstract classinterface사용 가능 변수인스턴스 필드, 정적 필드, 상수 모두 가능const (상수만 가능)사용 가능 접근 제어자제한 없음 (public, protected, private, internal 등)암묵적으로 public (명시적 접근 제어자 사용 불가)사용 가능 메서드추상 메서드, 일반 메서드, 정적 메서드 사용 가능추상 메서드, 기본 구현 메서드(default), 정적 메서드속성 (..

내일배움캠프 2024.11.27

내일 배움 캠프: 안 좋은 코드 습관(2)

이전 글안 좋은 코드 습관(1) 저번 글에 이어서 유니티 엔진을 사용해 게임 개발하는 과정에서 안 좋은 코드 습관에 대해 정리를 해 보았다.올바른 캐싱 순서( Ex. Camera.main, new WaitForSeconds )유니티에서 캐싱을 업데이트문 혹은 코루틴 같은 잦은 호출이 있는 곳에서 캐싱을 할 경우 메모리 성능을 많이 잡아 먹는 경우가 생길 수 있다. 다음 두가지 예시에서 확인할 수 있다  1. Camera.main을 사용한 캐싱 Camera.main은 하이어라키 창에서 전체 탐색을 통해 카메라를 찾는 방식을 사용한다. 이는 연산 성능이 매우 좋지 않은 편에 속하기 때문에 Update문이 돌아갈 때마다 캐싱을 하게 된다면 엄청난 성능 낭비를 발생 시킬 것 이다. 따라서, Update문이나 코..

내일배움캠프 2024.11.26

내일 배움 캠프: 안 좋은 코드 습관(1)

유니티 엔진을 사용해 게임 개발하는 과정에서 안 좋은 코드 습관에 관해 강의를 들어 해당 내용을 리마인드 하자는 느낌에서 정리해 보았다. 벡터 연산다음 두 식은 dir이라는 이름을 가진 Vecor3 값에 속도(speed)와 Time.deltaTime을 곱해주고 있다. 겉보기에는 큰 차이가 없어 보이는 두 식이 실제로 차이가 존재할까? transform.position += dir * speed * Time.deltaTime; transform.position += speed * Time.deltaTime * dir;더보기실제로 두식은 연산 순서에 따른 차이가 존재한다.  Vecot3 dir = new Vector3(1,1,1);이라고 가정 하겠다.  dir은 Vector3 탑이기 때문에 dir은 각 축(..

내일배움캠프 2024.11.25

내일배움캠프: 유니티 Character Controller

Character Controller유니티 환경에서 제공하는 클래스로 캐릭터 움직임을 더 쉽게 제어할 수 있도록 도와주는 기능rigidbdoy가 없어도 쉽게 움직임을 제어할 수 있도록 메서드를 제공 한다. 이 외에도 다양한 기능들을 제공 해준다. 단점으로는 중력, 질량등 물리적인 처리를 원한다면 별도로 구현해 줘야한다는 점있다. Character Controller 설정 값 Slope Limit:  이동할 수 있는 최대 경사각, 이 값보다 가파를 경우 캐릭터가 미끄러지거나 이동이 불가능Step Offset:  올라갈 수 있는 장애물(계단) 최다 높이, 이 값보다 낮은 높이의 장애물은 넘어갈 수 있음Skin Width: 캐릭터의 콜라이더 표면과 충돌 검사에 사용되는 공간Min Move Distance: 캐..

내일배움캠프 2024.11.11

내일배움캠프: object와 generic

C#에서 object, generic타입은 모두 유연한 데이터형을 사용하기 위한 타입이다. object는 모든 데이터형의 최상위 타입으로 어떤 데이터 형이든 저장할 수 있는 유연성을 제공한다.  하지만 object를 사용할 때는 값 타입을 참조형으로 변환할 때 박싱/언박싱이 발행하여 성능에 영향이 끼친다. 제네릭 타입의 경우에는 컴파일 타임에 타입을 지정해줘 object에 비해 타입 안전성이 높고, 값 타입을 박싱 / 언박싱 하지도 않아 유연성을 높여준다.  다만, .NET Framework 2.0  보다 낮아 제네릭을 지원하지 않는 경우에는 object 타입을 사용해야할 수도 있다.

내일배움캠프 2024.11.08

내일배움캠프: for문을 통한 AddListener 등록 시 인자 전달 문제 해결 방법

문제 상황Unity에서 for문을 통해 UI 버튼에 이벤트 리스너를 등록하던 중 내가 생각한 값이 아니라 이상한 값이 들어가는 현상이 생겼다. 코드상에서 원인을 찾을 수 없어서 중단점을 통해 확인해보니 메서드에 전달해준 인자 값이 계속 증가한다는 것을 확인 했다. 해당 문제를 해결하기위해 구글링을 통해서 자료를 찾아보니 람다식은 인자를 참조 해서 그 문제가 생긴다는 것을 알았다.  문제 코드 for (int i = 0; i SomeMethod(i));}AddListenr를 통해 인자 값을 넘겨줄 때는 람다식 혹은 델리게이트를 사용해 넘겨줘야하는데 람다식과 델리게이트 모두 참조형으로 값을 가지고 있기 때문에 문제가 발생했다. 해결 코드for (int i = 0; i SomeMethod(index));}..

내일배움캠프 2024.11.07

내일배움캠프: 이벤트 버스 패턴 (Event Bus Pattern)

이벤트 버스 패턴이란?이벤트 버스는 발행자(Publisher)와 구독자(Subscriber) 사이에서 중간 매개체(hub) 역할을 하는 패턴이다.  예를 들어, 이벤트 버스는 기사를 발행하고 이를 구독자에게 전달하는 신문사라고 생각하면 된다.신문사가 없다면 발행자가 직접 기사를 작성해 구독자들에게 전달해야 하지만, 신문사(이벤트 버스)를 통해 기사를 발행할 수 있게 된다. 즉, 구독자는 발행자가 누구인지 알 필요가 없고, 발행자도 구독자의 정보를 알 필요가 없어진다. 다만, 이벤트 버스를 통해 신문의 발행과 구독이 이뤄지기 때문에 약간의 비용이 발생할 수 있다. 일종의 수수료라고 생각하면 된다.  또한, 신문사를 통해 모든 발행과 구독이 이뤄지고 있다. 즉, 모든 기사(이벤트)의 중심이 신문사(이벤트버스..

내일배움캠프 2024.11.02

내일배움캠프: 유니티 JsonUtility을 활용한 데이터 저장 및 불러오기

JSON 간단 개념  JsonUtility를 사용해보자유니티 엔진은 json을 활용해 데이터를 저장하고 불러오는 작업을 손쉽게 할 수 있도록 JsonUtility 를 제공하고 있다. JsonUtility는 사용자가 Json 형식으로 데이터를 다루는 것을 편리하게 할 수 있게 해준다. JsonUtility 사용법1.   JSON 데이터에 저장할 변수 -유니티에서는 구조화된 Json의 개념을 중심으로 json 직렬화 기능을 설계 했다고 한다.  덕분에 JsonUtility를 통해 클래스나 구조체 형태로 데이터를 쉽게 JSON으로 직렬화하고 역직렬화가 가능하다. 예를 들어, 플레이어의 데이터를 저장하려면 PlayerData라는 클래스를 만들고, 그 안에 이름,스탯 등의 속성을 정의 해주면 된다.[System...

내일배움캠프 2024.11.01