Photon

감사콩·2026년 1월 6일

유니티

목록 보기
23/29

서론


네트워크 2일차
포톤 공부 시작
기본적인 이론과 사용법만 배워두자



TIL 요약

패스



Photon


포톤 설치하고
새 애플리케이션 추가해서 서버 만들고
임포트 하고~

하히어라키에 이거 추가

Play 눌러보면?

이렇게 뜸


시작 설정



Protype Runner


네트워크 이벤트



스크립트 작성


멀티게임에서 중요한 건 식별자 할당

Instantiate는 그냥 로컬에 게임 오브젝트를 만드는 것
Runner.Spawn을 해야 네트워크 ID가 부여되어 다른 사람 화면에도 똑같이 등장하고 동기화

using UnityEngine;
using Fusion;

public class PlayerSpawner : SimulationBehaviour, IPlayerJoined
{
    [SerializeField] GameObject playerPrefab;
    [SerializeField, Range(0, 10)] float spawnRandomLocation;
    [SerializeField] float spawnHeight;
    //플레이어 참여시 호출
    public void PlayerJoined(PlayerRef player)
    {
        if (player != Runner.LocalPlayer)
        {
            return;
        }

        Vector3 spawnPoint = new Vector3(
            Random.Range(-spawnRandomLocation, spawnRandomLocation),
            spawnHeight,
            Random.Range(-spawnRandomLocation, spawnRandomLocation));

        //Instantiate(playerPrefab, spawnPoint, Quaternion.identity); //로컬용
        //타인에게도 보여야 할 거
        Runner.Spawn(playerPrefab, spawnPoint, Quaternion.identity); //네트워크에 출력
    }
}

초기 설정
using Fusion;

SimulationBehaviour

Fusion의 시뮬레이션 루프에 참여해야 하지만, 동기화할 변수(상태)가 없는 컴포넌트에 사용

플레이어 객체 컴포넌트 부착

각 컴포넌트 설명

추가



PUN2


MonoBehaviourPunCallbacks 를 상속받아야
"서버에 연결됨(OnConnected)", "방에 들어옴(OnJoinedRoom)"
같은 특정 사건이 터졌을 때 유니티가 자동으로 해당 함수를 실행시켜 줌

using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using System.Collections;

//네트워크에 적합하게끔 뜯어고침
public class Runner : MonoBehaviourPunCallbacks
{
    string gameVer = "1"; //게임 켤 때 버전 안 맞으면 블로킹용

    private void Awake()
    {
        PhotonNetwork.AutomaticallySyncScene = true; //방장이 씬 바꾸면 다른 클라도 씬 변경
        //모든 파일에 존재하는 스크립트이므로 로컬
    }


    public void ConnectedToServer()
    {
        
    }
    private void Start()
    {
        //현재 빌드의 버전 정보를 포톤 네트워크 객체에 기억
        PhotonNetwork.GameVersion = gameVer;
    }

    public void ConnectToPhoton()
    {
        Debug.Log("이제 서버 연결을 시작...");
        PhotonNetwork.ConnectUsingSettings();
    }

    //OnCollision처럼 조건 만족하면, 즉 연결되면 알아서 콜백호출
    //로비 입장
    public override void OnConnectedToMaster()
    {
        Debug.Log("Pun 마스터 서버 연결 성공");
        PhotonNetwork.JoinRandomOrCreateRoom();
    }

    //또 콜백, 로비왔으면?
    public override void OnJoinedRoom()
    {
        Debug.Log("방 이몸 입장");
        Debug.Log(PhotonNetwork.NickName);
    }
    //플레이어가 들어왔을 때 자동 호출메서드

    public override void OnPlayerEnteredRoom(Player newPlayer)
    {
        Debug.Log(newPlayer.NickName + "님이 방에 들어왔습니다");
    }
}



흐름 정리

  • Start(): 게임 버전 설정.
  • ConnectUsingSettings(): 포톤 서버 문을 두드림.
  • OnConnectedToMaster(): (자동호출) 문이 열리고 로비에 도착.
    바로 JoinRandomOrCreateRoom()으로 방 찾기 시도.
  • OnJoinedRoom(): (자동호출) 방 입장 완료. 이제 게임 시작 가능.



PlayerNameInputField

using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using TMPro;

public class PlayerNameInputField : MonoBehaviour
{
    InputField inputField;
    const string playerNamePrefKey = "PlayerName";

    private void Start()
    {
        string defaultName = string.Empty;
        inputField = GetComponent<InputField>();

        if (inputField != null)
        {
            if (PlayerPrefs.HasKey(playerNamePrefKey))
            {
                defaultName = PlayerPrefs.GetString(playerNamePrefKey);
                inputField.text = defaultName;
            }
            //입력창에 적힌 텍스트를 포톤 네트워크상에서의 내 이름으로 결정
            PhotonNetwork.NickName = inputField.text;
        }

    }

    public void SetPlayerName(string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            Debug.Log("이름 비어있읆");
            return;
        }
        PhotonNetwork.NickName = value;
        PlayerPrefs.SetString(playerNamePrefKey, value);
    }

}

PhotonNetwork.NickName 으로 설정한 이름이 플레이어의 닉네임



마무리


실습 위주로 진행했기에 간단하게만 알아보았다.
내일은 Remote Procedure Call RPC에 대해 알아보자

profile
안녕하시와요

0개의 댓글