인프런 커뮤니티 질문&답변

굿데이님의 프로필 이미지
굿데이

작성한 질문수

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

입력관련 질문입니다.

해결된 질문

작성

·

216

0

안녕하세요. 강의 잘 듣고 있습니다.

궁금한것은 입력이 왔을때 inputmanager 에서 바로 invoke를 하면 subscribe하고 있는 객체들의 함수들이 바로 호출 될꺼같은데,

그렇게 되면 해당 객체들의 update전이나 후에 불릴텐데 괜찮을까요? transform등을 변경하게 되는거 같은데요.

invoke되었을때 각 객체의 큐에 입력을 넣고 update 에서 큐에 있는지 판단해서 처리하는건 좀 이상할까요?

답변 부탁드립니다. 감사합니다.

답변 2

0

굿데이님의 프로필 이미지
굿데이
질문자

빠르고 자세한 답변 감사드립니다.

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

안녕하세요,

어차피 InputManager도 동일한 프레임으로 Update하고 있으니,
굳이 객체들의 Update에 맞춰서 해당 객체를 움직여야 할 필요는 없습니다.
물론 객체의 Update에서도 동일하게 Transform을 변경하고 있다면
동시에 2 군데에서 하니 문제가 될 수는 있겠지만,
그게 아니라 1 군데에서만 실제 좌표 계산을 하면 특별히 문제가 된다고 보긴 어렵습니다.
예를 들면 역할을 분담해서 InputManager에서는 마우스 입력을 받아 목적지를 지정하는 용도로 사용하고, 
실제 좌표 계산은 다음 틱에 호출되는 Update에서 하는 방식으로 분담할 수 있겠죠.
물론 말씀주신대로 1틱 전/후의 차이가 날 수는 있지만,
스타크래프트와 같이 틱 단위로 정확하게 위치를 맞출 필요가 없는 게임이라면 크게 신경쓸 필요가 없어 보입니다.

말씀주신 큐를 이용한 방법은 싱글 게임이라면
역시나 굳이 그 정도까지 정확하게 맞출 필요는 없어 보이지만,
온라인 게임이라면 충분히 고려할 수 있는 방법이 됩니다.
Part3은 싱글 게임이니 inputManager에서 객체들을 조종하고 있는데,
사실 나중에 서버가 붙으면 패킷을 받은 network 쪽에서 비슷하게 객체들을 조종하게 됩니다.
그런데  네트워크 송수신은 별도 쓰레드에서 비동기로 처리하는 경우가 많은데
유니티 정책상 백그라운드 쓰레드에서 게임 쓰레드에 접근해 조작할 수 없습니다.
그러니 중간에 있는 어떤 경로(ex. 큐)를 통해서 인풋을 전달해주고,
나중에 큐에서 내용물을 꺼내서 움직이는 방법은 괜찮은 방법이라 할 수 있겠습니다.


굿데이님의 프로필 이미지
굿데이

작성한 질문수

질문하기