8년차 모션그래픽디자이너의 고군분투

[Unity] 포톤네트워크 사용해서 씬 이동했을 때 전 씬 값 받아서 현재 씬에 로드하기 본문

코자이너/Unity

[Unity] 포톤네트워크 사용해서 씬 이동했을 때 전 씬 값 받아서 현재 씬에 로드하기

쓰리디사람3Dperson 2024. 6. 17. 12:29
반응형

안녕하세요 오늘은 전의 씬에서 생성된 값을 저장해서 포톤네트워크로 이동한 현재 씬에서 로드하는 방법을 알려드리겠습니다.

 

using ExitGames.Client.Photon;
using Photon.Pun;
using System.Linq;
using TMPro;
using UnityEngine;
using Hashtable = ExitGames.Client.Photon.Hashtable;

public class EndCollider : MonoBehaviourPunCallbacks
{
    public Transform Start2, Start3;
    private Rigidbody _rb;
    private bool isFirstPlayerDetected = false;
    private string firstPlayerNickName;

    private Animator animator;

    public TextMeshProUGUI CountNumber;
    private void OnTriggerEnter(Collider other)
    {
        PhotonView playerPhotonView = other.GetComponentInParent<PhotonView>();
        if (other.CompareTag("Player") && playerPhotonView.IsMine)
        {
            _rb = other.GetComponent<Rigidbody>();
            if (gameObject.name == "End3")
            {
                if (!isFirstPlayerDetected)
                {
                    FallGuysManager.Instance.SetGameState(GameState.Over);
                    isFirstPlayerDetected = true;
                    firstPlayerNickName = playerPhotonView.Owner.NickName;
                    Debug.Log($"{firstPlayerNickName} reached the end first!");
                    PersonalManager.Instance.CoinUpdate(playerPhotonView.Owner.NickName, 100);

                    if (PhotonNetwork.IsMasterClient)
                    {
                        Hashtable firstPlayerName = new Hashtable { { "FirstPlayerName", firstPlayerNickName } };
                        PhotonNetwork.CurrentRoom.SetCustomProperties(firstPlayerName);
                        Debug.Log($"{firstPlayerName} 저장");
                    }
                }

                Debug.Log("게임 끝");
            }
        }
    }
}

해시테이블로 저장하는 것이 중요합니다.

저는 첫번째로 도착한 플레이어를 저장한 뒤에 그 플레이어를 다음 씬에서 그대로 불러와야했기 때문에

첫번째 플레이어의 이름을 해시테이블로 저장했습니다.

저장할 때에는 포톤네트워크.현재방.커스텀프로퍼티 설정을 했고 이걸 마스터에게 전달하는 방식으로 했습니다.

반응형
public class WinningPlayerScene : MonoBehaviour
{
    private string _firstPlayerName;

    public Transform PlayerSpawn;
    public TextMeshProUGUI WinningName;
    private GameObject winningPlayer;

    void Start()
    {
        if (PhotonNetwork.CurrentRoom.CustomProperties.ContainsKey("FirstPlayerName"))
        {
            _firstPlayerName = (string)PhotonNetwork.CurrentRoom.CustomProperties["FirstPlayerName"];

            // 첫 번째 플레이어만 생성
            if (PhotonNetwork.LocalPlayer.NickName == _firstPlayerName)
            {
                int characterIndex = PersonalManager.Instance.CheckCharacterIndex();
                string firstCharacter = $"Player {characterIndex}";
                winningPlayer = PhotonNetwork.Instantiate(firstCharacter, PlayerSpawn.position, Quaternion.Euler(0, -180, 0));
                WinningName.text = _firstPlayerName;
                Debug.Log($"{_firstPlayerName} 님이 이겼습니다.");
                Animator animator = winningPlayer.GetComponent<Animator>();
                animator.SetBool("Win", true);
            }
        }
  }

이런식으로 제가 저장한 첫번째 플레이어 이름을 다시 불러와서 나의 로컬 닉네임과 비교하고 맞다면 첫번째 플레이어의 설정값을 불러오고 캐릭터 번호값을 불러와서 캐릭터를 생성하는 방법으로 했습니다.

 

 

이런식으로 첫번째 플레이어가 불러와지는 모습입니다.

반응형
Comments