저주 객체를 이용한 동기화
프로젝트 중 저주 및 몬스터 동기화에 대한 로직을 정리.
저주
1. 사람 플레이어들에게 랜덤하게 적용.
2. 플레이어가 죽거나 괴물이 되면 다시 랜덤하게 플레이어에게 적용
3. 저주 적용 상태의 플레이어는 다른 사람에게 저주 넘기기 가능
4. 저주가 걸린 로컬 플레이어에게만 개별적인 UI 보이기
저주 적용 시점과 옮기기까지 과정
1. 저주 객체를 GameState 에서 관리했다. GameState 는 각 pc 별로 1씩 존재 가능하기 때문.
GameState 에서는 무작위로 사람 플레이어를 선택 및 저주를 적용하여준다.
이 함수는 서버에서만 실행되므로 밑에 호출되는 함수들 또한 서버에서만 호출된다.
2. 저주가 시작되기 때문에 저주 객체는 자신을 가지고 있는 Owner 캐릭터를 설정한다.
해당 함수도 서버에서 실행되기 때문에 해당 player 객체를 복제하여 사용 중인 클라이언트에게 저주가 적용되었음을 알린다.
3. 위에서는 서버에서만 bHasCurse 함수를 true 로 만들어주지만
Replicated 를 이용한 bHasCurse 변수를 동기화.
이제 모든 클라가 특정 플레이어 인스턴스가 저주에 걸려 있음을 알 고 있다.
4. 저주를 옮기려는 시도를 할 때 bHasCurse 는 이미 Replicated 로 동기화 되어 있으니 클라에서 정상 작동
그리고 로컬 클라에서 ServerRPC 로 저주를 옮긴다.
저주의 남은 시간에 따른 Post - Process Matrial 값 수정 및 UI
저주가 시작되면 저주에 걸린 플레이어의 클라이언트에게만 전용 UI 와 머터리얼을 적용한다.
현재 남은 저주 시간이 줄어드는 것에 따라 보간 값을 scalr 를 정하고 Post - Process Matrial 의 Density 값을 수정한다.
시간에 따라 저주가 점점 깊어지는 것이 보이게 만듬.
저주 시간이 끝나면 Controller 로부터 플레이어를 괴물로 바꾸는 함수를 실행.
저주는 서버에서 동작하므로 ServerRPC 를 사용하지 않아도 괜찮다.
괴물로 변신할 클라이언트의 저주 관련 UI 와 머터리얼 를 숨긴다.
그리고 저주를 다시 시작하여 게임 진행 중에는 저주가 계속 돌게 만든다.