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

[Unity] 포톤네트워크를 활용해서 닉네임 다른 사람들에게도 보이게 하기 본문

코자이너/Unity

[Unity] 포톤네트워크를 활용해서 닉네임 다른 사람들에게도 보이게 하기

쓰리디사람3Dperson 2024. 6. 14. 10:29
반응형

안녕하세요 오늘은 제가 며칠동안 꽤 애먹었던 포톤네트워크 닉네임에 대한 스크립트를 공유하겠습니다.

using Photon.Pun;
using Photon.Pun.Demo.Cockpit;
using Photon.Realtime;
using UnityEngine;
using UnityEngine.SceneManagement;
using Hashtable = ExitGames.Client.Photon.Hashtable;

public class PhotonManager : MonoBehaviourPunCallbacks
{
    string _nickname; // 사용자들의 닉네임을 받을 변수명

    public static PhotonManager Instance;

    [HideInInspector]
    public string NextRoomName = string.Empty; // 방 이동할 때 쓰일 변수명

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void Start()
    {
        StartButton?.SetActive(false);
        _nickname = PlayerPrefs.GetString("LoggedInId", "Player"); // 로그인 할 때 기억할 닉네임

        PhotonNetwork.GameVersion = "0.0.1";
        PhotonNetwork.NickName = _nickname; // 로그인 할 때 닉네임을 받겠다는 의미

        // Custom Properties 설정
        Hashtable customProperties = new Hashtable { { "Nickname", _nickname } };
        PhotonNetwork.LocalPlayer.SetCustomProperties(customProperties);

        PhotonNetwork.AutomaticallySyncScene = false;
        if (!PhotonNetwork.IsConnected)
        {
            PhotonNetwork.ConnectUsingSettings();
        }
        PhotonNetwork.SendRate = 50;
        PhotonNetwork.SerializationRate = 30;
    }

원래는 포톤네트워크.닉네임 = 닉네임; 으로 해두면 된다고 했는데 이게 저는 보이는데 남들은 보이지가 않아서 커스텀프로퍼티까지 썼었습니다. 커스텀 프로퍼티로 해도 되긴 하지만 그전에 간단하게 끝내는 방법도 있어서 일단 두개를 알려드릴게요.

 

using Photon.Pun;
using UnityEngine;
using Hashtable = ExitGames.Client.Photon.Hashtable;

public class PlayerAbility : MonoBehaviourPunCallbacks
{
    protected Player _owner { get; private set; }
    protected void Awake()
    {
        _owner = GetComponentInParent<Player>();
    }
    public override void OnPlayerPropertiesUpdate(Photon.Realtime.Player targetPlayer, Hashtable changedProps)
    {
        // 이 메서드는 PlayerCanvasAbility에서 오버라이드 됩니다.
    }
}

플레이어 스크립트에 포톤뷰를 넣었었고 그걸 플레이어 어빌리티에서 소환하는 방식을 사용했었습니다.

반응형
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using Hashtable = ExitGames.Client.Photon.Hashtable;

public class PlayerCanvasAbility : PlayerAbility
{
    public Canvas PlayerCanvas;
    public TextMeshProUGUI NicknameTextUI;

    private void Start()
    {
        // 커스텀프로퍼티 없이 사용할 수 있는 코드
        SetNickname(_owner.photonView.Owner.NickName);


        return;

        /*if (_owner.photonView.IsMine) // 사용하지 않는 코드
        {
            SetNickname(PhotonNetwork.LocalPlayer.NickName);
        }
        else
        {
            SetNickname(_owner.photonView.Owner.NickName);
        }*/
    }

    private void Update()
    {
        transform.forward = Camera.main.transform.forward;
    }

    public void SetNickname(string nickname)
    {
        NicknameTextUI.text = nickname;
    }

    // 커스텀 프로퍼티는 사용하지 않으나 이렇게 사용해도 실행은 됨
    public override void OnPlayerPropertiesUpdate(Photon.Realtime.Player targetPlayer, Hashtable changedProps)
    {
        if (changedProps.ContainsKey("Nickname") && targetPlayer == _owner.photonView.Owner)
        {
            //SetNickname((string)changedProps["Nickname"]);
        }
    }
}

이런식으로 사용하면 두개의 방식을 사용할 수 있는데 커스텀 프로퍼티 사용 없이도 다른 사용자들의 닉네임이 보이고 제 닉네임이 보일수 있도록 할 수 있습니다.

반응형
Comments