✅ 기능
유니티에서 멀티플레이를 쉽고 간편하게 구축할 수 있는 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 |
- 이곳에서 닉네임을 변경하며, 만약 자기 자신인경우 자신의 닉네임은 자신에게서는 보이지 않도록 한다.
- 클라이언트 실행이기에 각자 클라이언트에서만 작동되며, 다른 플레이어의 닉네임만 보이게 된다.
'server > unity_photon' 카테고리의 다른 글
[유니티] 포톤(Photon) - 특정 대상에게만 RPC 호출 (0) | 2023.04.02 |
---|
✅ 기능
유니티에서 멀티플레이를 쉽고 간편하게 구축할 수 있는 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 |
- 이곳에서 닉네임을 변경하며, 만약 자기 자신인경우 자신의 닉네임은 자신에게서는 보이지 않도록 한다.
- 클라이언트 실행이기에 각자 클라이언트에서만 작동되며, 다른 플레이어의 닉네임만 보이게 된다.
'server > unity_photon' 카테고리의 다른 글
[유니티] 포톤(Photon) - 특정 대상에게만 RPC 호출 (0) | 2023.04.02 |
---|