1. 포톤 입장한 플레이어 닉네임 가져오기
using UnityEngine;
using Photon.Pun; // new
using Photon.Realtime; // new
using System.Collections;
using System.Collections.Generic;
public class ConnectedPlayerInfo : MonoBehaviourPunCallbacks // new
{
// 입장한 플레이어 정보를 담는 리스트
public Player[] joinedPlayers;
private void Update()
{
print("플레이어 리스트 : " + PhotonNetwork.PlayerList);
foreach(var player in PhotonNetwork.PlayerList)
{
print("접속한 플레이어 정보 : " + player.NickName);
}
}
}
update문에서 위 코드를 실행시켜봤더니 작동이 잘 됐다.
2. 플레이어가 입장하면 알림해주기
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using System.Collections;
using System.Collections.Generic;
public class ConnectedPlayerInfo : MonoBehaviourPunCallbacks
{
// 입장한 플레이어 정보를 담는 리스트
public string[] joinedPlayers;
private static ConnectedPlayerInfo instance;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
public static ConnectedPlayerInfo Instance
{
get
{
return instance;
}
}
private void Start()
{
// PUN 콜백 등록
PhotonNetwork.AddCallbackTarget(this);
}
private void Update()
{
print("플레이어 리스트 : " + PhotonNetwork.PlayerList);
foreach(var player in PhotonNetwork.PlayerList)
{
print("접속한 플레이어 정보 : " + player.NickName);
}
}
private void OnDestroy()
{
// PUN 콜백 해제
PhotonNetwork.RemoveCallbackTarget(this);
}
public override void OnPlayerEnteredRoom(Player newPlayer)
{
// 새로운 플레이어가 방에 입장했을 때 실행되는 코드
Debug.Log(newPlayer.NickName + "이(가) 방에 입장했습니다!");
}
}
콜백 함수로 새로운 플레이어가 방에 입장했을 때 실행되는 코드를 작성해줬다.
방장(Master)는 들어와도 알람이 뜨지 않는데, 방에 존재하는 사람에게 새로 들어온 사람을 알림해주는 기능이니까 상관 없을 거 같다.
3. 입장한 플레이어 UI로 나타내기
resources 폴더에 각 플레이어의 사진을 담았다. (texture type은 default)
그리고 플레이어 상태를 나타낼 UI도 제작해서 프리팹으로 만들었다.
플레이어 이미지가 흰 부분에 들어가고, 뒷 배경이 접속중이라면 무지개색, 비접속이면 회색으로 나타낼 것이다.
하이어라키 창에는 PlayerState_Canvas와 PlayerStateManager를 만들고 Manager에는 스크립트를 넣어줬다.
우리는 게임방 개념이 섬이다. 서버에게 섬에 등록된 플레이어 수를 받아온 뒤, UI를 구성 할 것이다.
섬에 등록된 플레이어 수는 동적으로 변하므로, 플레이어 상태를 나타내는 UI도 동적인 숫자를 수용 가능하도록 만들어야한다.
Canvas에 위처럼 Img를 만들어서 알파값(투명도)를 0으로 만들고, Grid Layout Group을 설정해줬다.
*** 이후 img를 playerStateBox로 이름 변경함
그러면 img라는 오브젝트의 자식으로 많은 오브젝트가 들어가도 자동으로 정렬되고
캔버스(흰 경계선)을 벗어나지 않는다.
기본적인 UI구성을 마쳤으니 코드를 작성해보겠다.
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerStateManager : MonoBehaviour
{
public Transform playerStateBox;
public GameObject playerStatePrefab;
private void Start()
{
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
Member();
}
}
// 방 구성원 UI를 생성해주는 메서드
public void Member()
{
foreach (var player in PhotonNetwork.PlayerList)
{
print("접속한 플레이어 정보 : " + player.NickName);
// 프리팹 생성
GameObject go = Instantiate(playerStatePrefab, playerStateBox);
// 프리팹이 알고있는 image 게임오브젝트의 image 컴포넌트를 가져옴
Image image = go.GetComponent<PlayerState>().playerImg.GetComponent<Image>();
// resoures에서 사진을 가져옴
Texture2D picture = Resources.Load<Texture2D>("/Member" + player);
// resources에서 가져온 사진을 image에 적용하기
image.sprite = Sprite.Create(picture, new Rect(0, 0, picture.width, picture.height), new Vector2(0.5f, 0.5f));
}
}
}
게임을 실행하여 숫자 1번을 누르면, UI에 프리팹이 생성되도록 설정했다.
1을 누르면 생기긴 생기는데,, 플레이어 이름에 맞는 이미지를 찾아와서 넣어야하는데 왜 안 넣지?
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerStateManager : MonoBehaviour
{
public Transform playerStateBox;
public GameObject playerStatePrefab;
private void Start()
{
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
Member();
}
}
// 방 구성원 UI를 생성해주는 메서드
public void Member()
{
print("접속한 플레이어 정보 : " + PhotonNetwork.PlayerList[0].NickName);
// 프리팹 생성
GameObject go = Instantiate(playerStatePrefab, playerStateBox);
// 프리팹이 알고있는 image 게임오브젝트의 image 컴포넌트를 가져옴
Image image = go.GetComponent<PlayerState>().playerImg.GetComponent<Image>();
// resoures에서 사진을 가져옴
Texture2D picture = Resources.Load<Texture2D>("Member/dongsik");
// resources에서 가져온 사진을 image에 적용하기
image.sprite = Sprite.Create(picture, new Rect(0, 0, picture.width, picture.height), new Vector2(0.5f, 0.5f));
}
}
임시로 파일 이름 자체를 경로에 넣어서 사진 불러오기를 성공했다.
이제 해야 할 일이
1. 접속한 전체 플레이어 수 파악
2. 접속한 플레이어의 닉네임을 기반으로 이미지 가져오기
3. 가져온 이미지 배치하고
4. 접속 정보를 바탕으로 UI 변경하기
더 알아보면서 다음 포스팅에 작성 해야겠다.
'동식이 취업시키기 작전' 카테고리의 다른 글
[백준] 10866 덱(c#) (0) | 2024.01.22 |
---|---|
[Unity Project] 프리팹을 게임오브젝트로 변환하기(feat. 해당하는 식재료 위에 아이콘 배치하기) (0) | 2023.08.13 |
[UNITY] DestroyZone에 Player가 닿으면 게임 종료되기 (0) | 2023.07.20 |