inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Input Manager

안녕하세요 update()가 이해가 가질않아서 질문드립니다.

해결된 질문

684

boxman

작성한 질문수 32

0

처음 이동에 관한 조건문을 PlayerController Class의 Update()문에 작성하여 매 프레임마다 확인하였는데

이벤트를 사용하여 Managers에서 관리하는 것 까지는 이해를 하였습니다.

그런데  이제 이 이벤트 호출 검사를 Start()에서 하게되는데 이럴 경우 실행시 한번만 체크를 한다고 하셨는데 계속적으로 입력하는 값을 어떻게 검출하는 건가요? Managers의 Update()함수와 상관관계가 있을것 같은데 무슨 관계인지 이해가 가질않습니다.

 

PlayerController의 Start()함수에 작성하여도 그 안에 호출하는 기능이 다른 클래스의 Update()함수에 있으면 매 프레임마다 검사하는 것인가요?

그럴경우에는 그냥 PlayerController의 Update() 함수에서 바로 검사하는 것과 성능상 차이가없을 것 같은데 이 부분이 이해가 가질않아서 문의드립니다.

C# unity

답변 2

0

boxman

강사님 제가 c#도 다시 보고 책도 보고 이 강의도 다시 처음부터 보고 다시 생각해보았습니다.

문제점

// 아래와 같이 Update()문에서 체크를 계속하면 부하가 심하다.

        // 즉 플레이어가 만일 100개가 있다면 100개의 업데이트문마다 체크하므로 비효율적이다.

        // 차라리 매니저에 넣어서 공용으로 사용해 이벤트로 넘겨주는것이 성능상에 좋다.

아래 Managers의 업데이트에서 관리

void Update()

    {

        // 여기서 체크하면 공용인 Update()문 하나가 계속 돌면서 체크해 이벤트를 넘겨줘서 처리하지만

        // 이렇게 하지 않으면 Player의 수만큼의 Update()문이 생겨난뒤 그 모든 Update()문이 계속 돌면서 체크해 성능상 부하가 걸린다.

        _input.OnUpdate();

    }

아래 PlayerController

Managers.Input.KeyAction -= OnKeyboard; // 혹시라도 다른 곳에서 OnKeyboard를 구독신청하고 있다면 구독취소

        // 실행하자마자 구독신청.

        Managers.Input.KeyAction += OnKeyboard;

 

        // 혹시라도 Managers의 update문을 매틱마다 돌다가 키가 눌리면

        // OnKeyboard 함수를 실행해주세요.

        // 우리 Update()문은 쉬고 있을게요.

이렇게 해서 모든 많은 수의 ex)Player가 100개여도

하나의 update()문으로 관리한다가 맞나요?

0

Rookiss

네 근데 중요한 부분은 아니니 가볍게 넘어가시기 바랍니다.
어차피  PlayerController를 100개 사용하는 상황은 현실적이지 않아
그냥 평소대로 해도 되긴 합니다.

0

Rookiss

네 그냥 PlayerController의 Update에서 체크해도 됩니다.

Managers의 Update에서 체크한 다음 이벤트를 뿌리는 방식의 장점은,
마우스 기반의 게임에서 원하는 특정 행동 (Drag라거나, 더블클릭이라거나)이 발생했을 때
그 사실을 이벤트 방식으로 뿌려서 구독한 애들이 반응하도록 하는 것인데요.
이렇게 되면 중앙에서 관리해서 Update 체크를 한 번만 해도 되니,
경우에 따라 이점이 있을 수 있습니다.
다만 키보드처럼 프레임 단위로 뭔가를 체크해야 하는 경우라면
그냥 PlayerController의 Update문에서 하는게 사실 낫긴 합니다.

이 부분은 너무 많은 분들의 혼동을 야기해서 Part7부터는 삭제되었습니다.

 

0

boxman

답변 감사드립니다. 아직 이해안가는 부분이 있어서 질문드립니다!

그럼 Start()함수에 있어서 한번만 실행된다고 생각했는데 그것이 아니라

실행시에 이벤트 구독등록을 해서 Managers의 update함수가 계속 돌아가게 만들어서

입력시에 검출하는것인가요~?

제가 Start()함수는 한번만 실행한다 이것때문에 구독연결을하고 체크하고 끝나는거라고

생각했는데 그게아니라 시작시에 바로 연결하고 그 이후에 Managers의 update함수가 계속 돌아가면서

체크하는것인가요~?

감사합니다~!

 

0

Rookiss

Input 여부는 어디선가에 체크 해야 하니 
그것을 InputManager의 Update에서 해주고 있는 것입니다.
PlayerController가 100개 라면 100개의 Update문에서 하는게 아니라
대표로 InputManager의 Update에서 한번 해주는 것이죠.
그런데 다시 말씀드리지만 곧 사라질 예정이므로 적당히 넘어가주시기 바랍니다.

ResourceManager 클래스 관련 질문

1

21

2

몬스터 HP 게이지바 이동

0

20

1

매니저 관련 질문이 있습니다.

0

69

2

비쥬얼 스튜디오에서 unity연결이 없습니다.

0

74

2

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

0

70

2

픽셀 좌표 스크린 좌표

0

48

0

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

0

105

2

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

0

96

1

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

0

100

1

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

0

91

1

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

0

98

1

달리기 애니메이션 에러

0

98

2

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

0

75

1

GetKey 오류

0

128

2

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

0

114

1

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

0

178

6

Animation blending 파라미터 계산

0

75

1

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

0

112

3

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

0

96

2

질문있습니다

0

155

2

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

0

152

3

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

0

94

2

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

0

139

2

유니티6 NavMesh 안되는분들

1

193

1