inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

코드 정리

UI 기능 관련 질문이 있습니다!

해결된 질문

23

강현

작성한 질문수 1

0

먼저 이렇게 좋은 구조를 알려주셔서 너무 감사합니다!

그동안 UI를 매번 직접 생성하고 인스펙터에서 일일이 관리해 왔는데, 코드로 이 작업을 자동화한다는 개념 자체가 신세계였습니다!

강의를 들으며, 궁금한 점이 몇 가지 생겨 글을 남깁니다!

1. ShowPopupUI / ClosePopupUI의 빈번한 호출 시 비용

팝업의 경우 ShowPopupUI로 생성하고 ClosePopupUI로 파괴하는 구조인 것으로 이해했습니다.

예를 들어 사용자가 일시 정지-설정창 이런 식으로 게임중에 기능을 수행할 때,

팝업 내용이 무거울수록 매번 생성/파괴 비용이 커질 것 같은데, 이 정도 비용은 실제 플레이 중에는 크게 신경 쓰지 않아도 되는 수준인가요?

2. 람다식의 이벤트 등록과 해제

UI_Button의 Init 함수에서 BindEvent 호출 시 람다식으로 액션을 등록하는 것으로 보입니다.

그런데 C#에서 람다로 이벤트를 등록하면, 매번 새로운 delegate 인스턴스를 생성하여 -=로 해제가 안 되는 것으로 알고 있습니다.

매개변수로 람다를 넘기는 경우에도 같은 문제가 발생할 것 같아서 여쭤봅니다!

C# unity

답변 2

1

Rookiss

1. ShowPopupUI / ClosePopupUI의 빈번한 호출 시 비용

팝업의 경우 ShowPopupUI로 생성하고 ClosePopupUI로 파괴하는 구조인 것으로 이해했습니다.

예를 들어 사용자가 일시 정지-설정창 이런 식으로 게임중에 기능을 수행할 때,

팝업 내용이 무거울수록 매번 생성/파괴 비용이 커질 것 같은데, 이 정도 비용은 실제 플레이 중에는 크게 신경 쓰지 않아도 되는 수준인가요?
-> 신경 씁니다. 강의 교안이라 간단하게 한 것이고, 일반적으로 게임마다 다르지만 로딩할 때 일단 UI들을 다 로딩하고 있다가, 껐다 켰다 하는 식으로 많이 사용합니다.

2. 람다식의 이벤트 등록과 해제

UI_Button의 Init 함수에서 BindEvent 호출 시 람다식으로 액션을 등록하는 것으로 보입니다.

그런데 C#에서 람다로 이벤트를 등록하면, 매번 새로운 delegate 인스턴스를 생성하여 -=로 해제가 안 되는 것으로 알고 있습니다.
매개변수로 람다를 넘기는 경우에도 같은 문제가 발생할 것 같아서 여쭤봅니다!

이벤트는 참조값을 간접적으로 들고 있어서, 사용이 끝났으면 참조값을 -= 해줘야 하는 것이 맞긴 합니다.
그런 관점에서 헷갈리지 않기 위해 기본적으로 함수로 빼서 OnDestroy, OnDisable 같은 공간에 -=을 넣어주시는게 맞습니다.

Manager가 삭제되어야 하는 참조를 들고 있는 경우가 가장 큰 문제입니다. (매니저는 사라지지 않으므로). 이 경우에 UI는 한 번 만들어서 오래 쓰거나, 필요 없으면 삭제하는 경우라서 상황이 조금 다른데요. UI_Button이 소멸되면서 알아서 람다 객체도 같이 소멸될 것이고, C# 특성상 그래프 구조로 참조를 관리해서 Root에서 참조되지 않으면 알아서 해제할테니 별 문제는 없습니다. 그래도 복잡하게 생각하지 않게 위처럼 꼼꼼하게 챙기는게 좋습니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 강현님.

질문해 주신 내용에 대해 두 가지로 나누어 설명드리겠습니다.

1. ShowPopupUI / ClosePopupUI의 빈번한 호출 시 비용

팝업을 빈번하게 생성하고 파괴하는 것은 메모리 자원과 CPU 시간을 소모할 수 있습니다. 특히 무거운 리소스나 복잡한 UI 컴포넌트를 사용할 때 더더욱 그렇습니다. 이런 상황에서는 팝업을 미리 생성해 두고 화면에 보이게 하거나 가리기만 하는 방식으로 관리할 수 있습니다. 이는 SetActive(true/false) 메소드를 통해 쉽게 구현할 수 있으며, 메모리 사용을 줄이고 CPU도 절약할 수 있습니다.

관련된 질문과 답변에서는 빈번한 UI 생성과 파괴 대신 SetActive를 활용하는 방법도 권장되었습니다.

2. 람다식의 이벤트 등록과 해제

람다식을 사용한 이벤트 등록할 때, 매번 새로운 delegate 인스턴스를 생성하므로 -= 연산자를 통해 이벤트 해제가 어려운 것이 맞습니다. 이를 해결하기 위해서는 명시적인 메소드로 이벤트를 등록하고 해제하는 것이 안전한 방법입니다. 이벤트 등록 시 람다식을 직접 사용하기보다는, 람다식을 변수나 별도의 메소드로 분리하여 관리하는 것이 좋습니다.

관련 내용을 자세히 다룬 유사 질문에서는 람다와 delegate의 활용에 대해 잘 설명되어 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

픽셀 좌표 스크린 좌표

0

25

0

전체적으로 코드 읽는게 굉장히 오래 걸리네요...

0

66

2

카메라 #2 수업 캐릭터 쓰러짐 해결

0

78

1

플레이어 움직임이 끝날때, 기울어짐 현상

0

80

1

Input 적용과 관련하여 질문 있습니다.

0

72

1

디버그 불가.. Unity에 연결 불가

0

76

1

달리기 애니메이션 에러

0

85

2

오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다

0

63

1

GetKey 오류

0

108

2

에셋을 어디에 올려두신지 알 수 있나요?

0

104

1

재귀호출? 오류나는데 왜 이래요 ?

0

167

6

Animation blending 파라미터 계산

0

65

1

newPos와 to지점이 겹쳐져야 하는거 아닌가요?

0

94

3

오브젝트 복제하니까 자꾸 이런게 뜨면서 꺼집니다

0

85

2

질문있습니다

0

142

2

아 이거 소스코드 같은거 없나요?

0

140

3

질문 드립니다. string.IsNullOrEmpty(name)

0

85

2

@Managers 가 씬에 배치되어 있어도 문제가 되지 않나요?

0

133

2

유니티6 NavMesh 안되는분들

1

174

1

Unity6 Unity-Chan Material 마젠타 문제 해결법

7

523

1

GetComponent<Poolable> 질문드립니다.

0

99

2

UI 불러오지 못함

0

116

2

UI 자동화 #1 - Util.cs의 FindChild함수에서 component.name에 컴포넌트 이름이 뜹니다.

0

152

2

수업자료 다운로드 방법이 궁금합니다.

0

168

2