✅  기능

유니티에서 멀티플레이를 쉽고 간편하게 구축할 수 있는 Photon 에셋을 이용하여 멀티플레이를 구축합니다. 플레이어를 식별하기 위해 플레이어 캐릭터 오브젝트 상단에 닉네임을 출력할 것인데, 유니티의 포톤에서 지원하는 기능으로 간단하게 구현합니다.

✅  도움 받은 곳

 

Player names with photon PUN - Unity Answers

 

answers.unity.com

 

✅  흐름도

✅ 사용 예시

두 클라이언트로 접속했다고 가정하고, 서로의 닉네임이 보이는것을 확인할 수 있다.

 

물론 한글도 가능하다!

 

✅ 구현

//LobbyManager.cs
 
// 룸 접속 시도
public void Connect()
{
    PhotonNetwork.NickName = mNicknameField.text;
 
    // 중복 접속 시도를 막기 위해, 접속 버튼 잠시 비활성화
    joinButton.interactable = false;
 
    // 마스터 서버에 접속중이라면
    if (PhotonNetwork.IsConnected)
    {
        // 룸 접속 실행
        connectionInfoText.text = "룸에 접속...";
        PhotonNetwork.JoinRandomRoom();
    }
    else
    {
        // 마스터 서버에 접속중이 아니라면, 마스터 서버에 접속 시도
        connectionInfoText.text = "오프라인 : 마스터 서버와 연결되지 않음\n접속 재시도 중...";
        // 마스터 서버로의 재접속 시도
        PhotonNetwork.ConnectUsingSettings();
    }
}
cs
  • ⭐️ 핵심이 되는 스크립트로, PhotonNetwork.NickName = mNicknameField.text;에서 PhotonNetwork.NickName은 Owner의 닉네임을 저장하는 곳이다. 각 클라이언트마다 Owner은 서로 다른 오브젝트에 있으며, 해당 오브젝트의 PV에서 닉네임을 가져오면 해당 값으로 나오게된다.

 

//포톤네트워크 동적 생성

//생성하려는 프리팹은 프로젝트뷰 Resources폴더에 위치해 있어야 한다
PhotonNetwork.Instantiate("PlayerPrefabs/Original Player", Vector3.up, Quaternion.identity, 0);
cs
  • 포톤에서 플레이어의 입장 및 플레이어 프리팹 동기화를 위해 PhotonNetwork.Instantiate를 통해 플레이어 프리팹을 인스턴스한다.
  • 해당 프리팹에는 PlayerController.cs가 있으며, 인스턴스가 완료되면 내부 클래스의 Start()함수가 호출되며 닉네임을 설정한다.

 

//PlayerController.cs
 
private void Start()
{
    foreach(PlayerController player in GameObject.FindObjectsOfType<PlayerController>())
    {
        player.ApplyPlayerName(player.mPV.Owner.NickName);
    }
}
cs
  • Start() 함수에서 동일 클래스에서 ApplyPlayerName(...) 함수를 통해 텍스트라벨의 텍스트를 변경하도록 한다.
  • PV.Owner.NickName는 PV의 소유자 이름을 리턴하도록 하고, 이 변수에 닉네임이 저장되어있다.
  • 해당 함수는 클라이언트에서 실행하는것이며, 서버와는 관련없는 독립적인 클라이언트 실행이다.

 

//PlayerController.cs
 
private void ApplyPlayerName(string name)
{
    mNicknameLabel.text = name;
 
    if(mPV.IsMine)
    {
        mNicknameLabel.gameObject.SetActive(false);
    }
}
cs
  • 이곳에서 닉네임을 변경하며, 만약 자기 자신인경우 자신의 닉네임은 자신에게서는 보이지 않도록 한다.
  • 클라이언트 실행이기에 각자 클라이언트에서만 작동되며, 다른 플레이어의 닉네임만 보이게 된다.

 

bonnate