2025/04 11

[Unity/TIL] C#에서 클래스 다중 상속을 지원하지 않는 이유

C#에서 클래스 다중 상속을 지원하지 않는 이유=> 다이아몬드 상속 문제 때문.!! 다이아몬드 상속 문제 클래스 A를 상속받는 B와 C 클래스가 있다. 클래스 D가 B와 C를 모두 상속받은 경우, D에서 A의 함수를 호출하면 B와 C 중 어느 쪽의 오버라이딩된 구현을 사용할지 모호해지는 문제가 발생한다. 이걸 다이아몬드 상속 문제라고 한다. 이런 모호성 때문에 C#에서는 근본적으로 막아놨다. C#에서는 클래스 다중 상속을 지원하지 않아서 처음 공부할 때 당황스러웠던 기억이 난다!!! 그럼 클래스 하나만 상속받아가면서 답답해서 어떻게 짜지? 라고 생각했었다. 그대신 인터페이스는 다중 상속이 가능하다. 현재는 꽤 적응해서 abstract과 interface를 사용해가며 잘만 코딩하며 사는 중이다. 그런데 오..

공부 기록/C# 2025.04.17

[Unity/TIL] '오집마' 최종 프로젝트 개발일지

맵 수정맵 스크롤 가능 여부, UI 자리를 고려한 맵으로 수정제작했다. UX에 대해 공부해보고 싶을지도. 타워 Base 제작타워 로직(Brain)과 외형(Body)의 Base들을 완성하고 구체화 테스트를 조금이나마 해봤다. 고민했던 부분들 작성함. RangeTowerController범위형 공격을 하기 때문에 범위 내에 있는 모든 적에게 타워 자신의 Cooldown에 맞춰 공격한다.범위 내 적을 탐지할 때는 콜라이더의 Trigger를 사용했다. Enemy가 OnTriggerEnter 되면 타겟에 포함시키고, OnTriggerExit 될 때는 타겟에서 제거한다. 타겟을 담고 있을 자료구조를 선택할 때 다음과 같은 사항들을 고려했다.삽입, 삭제가 자주 일어난다. 전체 순회를 돌아야 한다.위 두가지를 충족..

[Unity/TIL] 프리팹 Variant

명민 튜터님께 (또) 유용한 기능을 주워들었따. 그거슨 바로 Prefab Variant. 프리팹의 효율적인 재사용과 유연한 수정을 위한 기능이다. Prefab VariantPrefab Variant를 이용하면 원본이 되는 프리팹의 파생된 버전을 만들 수 있다. 일부 속성만 다르게 설정할 수 있는 프리팹을 쉽게 만들 수 있는 것이다. 원본 프리팹에 변경사항이 있을 때, Variant에도 반영되지만 오버라이드한 부분은 유지된다. 그러니 프리팹의 상속이라고 이해해도 괜찮을듯!! 나는 우선 맵을 제작할 때 사용해봤다. 모든 맵이 가져야 하는 공통적인 구조가 정해져있기 때문에 LevelBase 프리팹에 구조를 만들어놓고 맵을 제작할 때마다 Variant로 생성해서 제작했다. Variant 만드는 방법 이렇게 ..

[Unity/TIL] 방치형 게임에서 유닛 스폰 최적화 구조 설계하기

오늘 배운 것 (by 명민 튜터님)전투에 필요한 유닛 로직을 먼저 생성하고, 외형 리소스는 비동기로 따로 로드하는 구조를 사용하면,방치형 게임에서 빠르고 효율적인 유닛 스폰이 가능하다. 왜 이런 구조?방치형 게임에서 전투는 멈추지 않고 유닛이 자주 등장한다. 유닛을 생성할 때 프리팹 전체를 로드해서 스폰하면 다음과 같은 문제들이 있다.Addressable에서 비동기로 받아와서 생성하기 때문에 완전히 로드될 때까지 딜레이가 발생. (-> 그동안 전투를 시작할 수 없음)메모리 낭비 및 프레임 드랍 가능성 발생. 문제를 방지하려면 모든 유닛의 애니메이션, 사운드, VFX와 같은 외형 데이터를 미리 로드해야 함.해결 전략로직 전용 프리팹과 외형 전용 프리팹을 분리. 1. 어떠한 유닛들의 웨이브를 스폰하는 곳에서..

[Unity/TIL] MonoBehaviour 상속받지 않는 곳에서 코루틴 사용하는 방법

이전에 MonoBehaviour를 상속받지 않는 클래스에서 코루틴을 사용하고 싶었지만 코드에서 Coroutine이 찾아지지 않았다(에러났다는 뜻). 그래서 이 때 처음 알게 된 사실은 코루틴은 MonoBehaviour에 종속되어 있다는 것이다!!! 당시에는 당황스러워서 그냥 해당 클래스에 MovoBehaviour를 상속받았다..ㅋㅋ  오늘은 Managers에서 통합 관리당하는(?) WaveManager 클래스에서 코루틴을 사용하고 싶었다. 오늘은 다른 방법으로 MonoBehaviour를 상속받지 않는 클래스에서 코루틴을 사용할 수 있었다. 우리팀 팀원분께서 알려주신 방법인데 감동받아서 TIL로 남긴다. 상윤님 천재세요!?!?직접 실행하려면 반드시 MonoBehaviour의 StartCoroutine()을..

[Unity/TIL] 싱글톤 매니저 관리

이번 프로젝트에서는 싱글톤 매니저의 관리 방식을 다르게 한다. 원래 내가 사용하던 방식은 제네릭 싱글톤 클래스를 만들고, 싱글톤으로 만들어져야 하는 매니저 클래스들이 그 싱글톤 클래스를 상속받는 방식이었다.  이번에는 통합 Managers에서 모든 매니저를 관리해주는 방식을 사용하기로 했다. 이렇게 관리했을 때 매니저 클래스들의 초기화 순서를 지정할 수 있다는 점이 큰 장점으로 느껴졌다. 매니저 클래스를 개별 관리할 때 의존성 순서가 꼬이면 골치아팠기 때문에 이 방식이 마음에 들었다!using System.Resources;using UnityEditor.EditorTools;using UnityEngine;public class Managers : MonoBehaviour{ public stati..

[Unity/TIL] Addressable 연구(2)

2025.04.08 - [공부 기록/유니티 Unity] - [Unity/TIL] Addressable 연구 [Unity/TIL] Addressable 연구이번 프로젝트에서는 Addressable을 사용할 것이다. 빌드 시 Resources.Load를 사용하는 것보다 무조건 빌드 용량에 이점이 있기 때문이다. 그외에도 다음과 같은 장점들이 있다. 서버와 Addressable을 함ramenkirby.tistory.com Addressables.ResourceManager.CreateGenericGroupOperation(operations);어드레서블에서 제공하는 위 함수를 사용하면 operations 리스트를 하나의 Group Operation으로 묶어준다. 이것도 로딩이 완료될 때 Completed를 제..

[Unity/TIL] Addressable 연구

이번 프로젝트에서는 Addressable을 사용할 것이다. 빌드 시 Resources.Load를 사용하는 것보다 무조건 빌드 용량에 이점이 있기 때문이다. 그외에도 다음과 같은 장점들이 있다. 서버와 Addressable을 함께 사용하면 빌드 후에 원격에서 리소스를 수정하는 것이 가능해진다. 클라 재배포 없이 패치가 가능한 것이 짱 큰 이점이다. (우리는 서버를 사용하지 않을 수도 있지만)비동기 로딩이 가능하다. 프레임 드랍 없이 자연스러운 로딩화면을 구현할 수 있다. 내부적으로 에셋 번들을 별도로 관리해준다.리소스마다 라벨, 키 지정 가능해서 리소스 그룹 관리 편리하다. Addressable 이해를 도와주신(사실 떠먹여주신) 짱동료 송석호님께 왕큰감사를 드림미댜... (●'◡'●)전반적인 프레임워크 구..

[Unity/TIL] 2D 최적화(2) - 드로우 콜 줄이기, 캔버스 중첩

드로우 콜 줄이기Frame Debugger 에서 지금 화면이 어떤 과정을 거쳐서 그려졌는지 볼 수 있다. Window > Analysis > Frame Debugger현재 예시 프로젝트에서 UI의 드로우콜이 33회 발생하고 있다. Sprite들을 한 번에 묶어서 그릴 수 있게 묶어줄 수 있는 Sprite Atlas가 있다.=> 묶여있는 Sprite끼리는 한 번에 그려짐=> 드로우 콜을 줄일 수 있다.! Sprite Atlas 만드는 방법Sprite Atlas를 Create하고, 한 번에 그릴 Sprite들을 넣어준다. 폴더째로 넣어줘도 된다. Tight Packing 끄기 (선택사항)Tight Packing을 켜주면 가운데가 비어있는 프레임 이미지같은 것들과 다른 이미지가 겹치기도 한다. Tight P..

[Unity/TIL] 2D 최적화(1) - 사이즈 관련

2D 최적화 - 사이즈 관련Memory Profiler에서 Profiler보다 메모리 측면에서 더 자세히 볼 수 있다.Package manager에서 Memory Profiler 설치 후 Window > Analysis > Memory Profiler 방법 1. MaxSize 줄이기예시 프로젝트의 팀원분께서 직접 만드신 이미지라서 Sprite의 용량이 큰 리소스가 몇가지 있다.MaxSize가 2048로 되어있는 이미지를 512로 줄여주면 이것만해도 17MB에서 0.6MB로 줄어든다. 방법 2. POT 맞추기 Sprite 사이즈가 4의 배수가 아니면 경고가 뜬다. 가로, 세로의 사이즈가 4의 배수로 맞추는 POT세팅을 해야 유니티에서 최대 압축이 된다. (NPOT는 Not POT)방법 1, 2를 해서 이전..

반응형