강의에서 구현되는 스킬의 방식을 만약 멀티플레이로 구현해야 한다면 어떤 부분들을 수정해야 해야 좋을지 생각하시는지 궁금합니다.
제가 생각해본 방식은 skill의 Statemachine흐름에서
targetSearcher의 Target SelectAction을 분리하여 이 부분만 클라이언트에서 실행한 뒤 서버는 클라이언트로 부터 Target SelectAction의 결과만 받아 그 이후의 Target Search Action부터의 흐름만 구현하는 방식인데 자꾸 막히는 부분이 있어 강사님의 생각이 궁금합니다.
멀티플레이에서 Skill 을 구현한다 했을 때 궁금한 점이 있습니다
최성호
작성일
24.10.24 16:12
수정일
24.10.24 16:18
조회수
99
댓글 3
안녕하세요.
먼저 저는 서버보다 클라이언트를 더 많이 해온 사람이기에 제 말이 꼭 정답은 아니구요,
하나의 참고 의견으로만 봐주시면 좋겠습니다.
저라면 먼저 서버와 클라이언트의 StateMachine을 동기화하는 작업부터 할거구요,
클라측의 TargetSelectionResult를 서버로 동기화해서 서버측의 SearchingTargetState를 넘기거나, 클라쪽 Input 정보(마우스 좌표 등)를 서버로 넘겨서 서버에서 SearchingTargetState를 완료할 것 같습니다(State의 OnReceiveMessage 함수 활용).
클라측 SelectionResult를 동기화하는 방식은 변조의 우려가 있기 때문에(사거리 밖의 적을 Target으로 삼거나 안보이는 적을 Target으로 삼는 등) Input 정보를 서버쪽에 보내서 서버가 작업을 완료하는게 좀 더 정석적인 방식이라는 생각이 드네요.
이 경우,
클라측에서 Select 완료시 Select 정보를 서버에 보냄 ->
받은 정보로 서버에서 SelectImmediate를 실행(State의 OnReceiveMessage 함수 활용) ->
결과를 Client로 보내서 동기화
순으로 진행될 것 같습니다.
Skill의 Apply와 같은 실제 동작은 서버에서만 진행하고, Skill을 여러 번 사용하는 Input의 경우 SearchingTargetState 때처럼 Input 정보를 서버로 보내주면 될거구요, CustomAction 같이 연출적 요소와 Particle, Projectile 같은 것들은 RPC로 처리할 것 같습니다.
그 외 Cooldown이나 Duration, SearchTargets 같이 UI에 적용되야하는 요소들을 정리해서 동기화 작업을 진행할 것 같습니다.
막히시는 부분이 어떤 부분이신지 정확히 모르는 상태에서 두루뭉실하게 얘기 드리는 감이 있어 도움이 되셨을지 모르겠네요.
답글
정말 좋은 답변 감사합니다. 추가적으로 하고 싶은 질문이 있습니다.
멀티 플레이에서의 스킬 구현이 정상적으로 끝났다면 다음은 Effect의 적용 방식도 고려해봐야 할거라 생각합니다.
그래서 제 생각은 Effect의 경우 모든 캐릭터의 Effect적용과 처리를 서버에서 관리하고
클라이언트는 서버의 Effect에서 필요한 부분만(적용 중인 Effect UI표시 등) 동기화 하여 사용하는 것이 좋을 것 같다 생각하는데 이 부분에서도 강사님의 생각이 궁금합니다.
답글
Developer G
2024.10.24Effect 같은 경우에는 적용 중인 Effect 목록만 서버와 동기화 시키면 사실 크게 처리할 게 없습니다.
Effect의 동작만 서버 측에서 처리해주면 체력, Stat, State 이런 것들은 이미 각자 동기화되고 있을테니 따로 뭘 안해줘도 동기화가 되겠죠. Skill처럼 CustomAction 정도만 RPC로 처리하고, Action에 따라서 필요한 동기화는 Action 쪽에서 RPC로 개별적으로 동기화해주면 될거구요, 말씀하신 것처럼 UI에 필요한 변수들만 동기화해주면 될 것 같습니다.
답변 감사합니다!
답글