• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

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

21.11.14 21:46 작성 조회수 514

0

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

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

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

 

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

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

답변 2

·

답변을 작성해보세요.

0

손기명님의 프로필

손기명

질문자

2021.12.03

강사님 제가 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()문으로 관리한다가 맞나요?

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

0

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

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

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

 

손기명님의 프로필

손기명

질문자

2021.11.14

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

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

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

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

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

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

체크하는것인가요~?

감사합니다~!

 

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