내일배움캠프/프로젝트

팀 프로젝트 - 퍼즐 관련 멀티플레이 연결

서보훈 2024. 12. 19. 21:06

맵에 퍼즐을 배치하고, 퍼즐의 내용과 힌트를 멀티플레이로 연결해주었습니다.

 

퍼즐의 경우 협업한 팀원이 제작한 내용이며, 퍼즐 결과를 만든 뒤, 정답 내용을 ServerRpc 로 송신하도록 만들어주었습니다.

Rpc의 특성상, 정답을 int값 배열로 변환하여 전달하도록 만들어주었습니다.

//다시 시작하거나 라운드를 통과하였을 때 리스트를 다시 배정하는 코드
private void SetRound()
{
    if (curRound >maxRound || Activatables.Count == curRound) return; //퍼즐이 모두 끝났거나 현재 라운드의 활성화될 오브젝트 수가 같다면 반환

    List<int> numbers = new List<int>();

    for (int i = 0; i < curRound + addtionalRound; i++)
    {
        if (i == 0)
        {
            lastNumber = -1;
        }

        int randomNumber = (Random.Range(0, Alters.Length));

        if (randomNumber == lastNumber)
        {
            i--;
            continue;
        }
        else
        {
            lastNumber = randomNumber;
            Activatables.Add(Alters[randomNumber]); //선정된 석상이 리스트안에 없는 석상이면 리스트에 집어넣는다.
            Observables.Add(candles[randomNumber]); //석상의 순서와 같게 같이 리스트에 집어넣는다.
            numbers.Add(randomNumber);
        }
    }

    if(isNetwork)
    {
        int[] ints = numbers.ToArray();
        GameManager.Instance.repeater.SynchronizePuzzle1ServerRpc(ints);
        Debug.Log("힌트 송신");
    }
}

public void SetPuzzleByNetwork(int[] numbers)
{
    if (GameManager.Instance.networkGameManager.StudentId == NetworkManager.Singleton.LocalClientId) return;
    Debug.Log("힌트 수신");

    for(int i = 0; i < numbers.Length; i++)
    {
        Activatables.Add(Alters[numbers[i]]);
        Observables.Add(candles[numbers[i]]);
    }

    StartHintCoroutine();
}

 

전달받는 플레이어는 int 배열을 받은 뒤, 그 내용을 저장하여 동기화 시켜줍니다.

 

 

퍼즐 내용을 동기화할 때 사용하는 클래스입니다.

public class NetworkPuzzleRepeater : NetworkBehaviour
{
    public override void OnNetworkSpawn()
    {
        GameManager.Instance.repeater = this;
    }

    [ServerRpc(RequireOwnership = false)]
    public void SynchronizePuzzle1ServerRpc(int[] numbers)
    {
        SynchronizePuzzle1ClientRpc(numbers);
    }

    [ClientRpc]
    public void SynchronizePuzzle1ClientRpc(int[] numbers)
    {
        //TODO : 게임 매니저 싱글톤에 Puzzle 올려서 퍼즐에 이 내용 넣어주고 작동시키기
        Puzzle1 puzzle = (Puzzle1)PuzzleManager.Instance.subPuzzleList[0];
        puzzle.SetPuzzleByNetwork(numbers);
    }
}

현재 퍼즐의 정답을 보내어 동기화시켜주는 작업만 하고있으며,

이후 정답을 맞추었을때 보낼 Rpc등을 추가 작업할 예정입니다.