네트워크 2일차
포톤 공부 시작
기본적인 이론과 사용법만 배워두자
패스
포톤 설치하고
새 애플리케이션 추가해서 서버 만들고
임포트 하고~
하히어라키에 이거 추가

Play 눌러보면?

이렇게 뜸

시작 설정
네트워크 이벤트

멀티게임에서 중요한 건 식별자 할당
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;
Fusion의 시뮬레이션 루프에 참여해야 하지만, 동기화할 변수(상태)가 없는 컴포넌트에 사용
플레이어 객체 컴포넌트 부착

각 컴포넌트 설명

추가
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 + "님이 방에 들어왔습니다");
}
}
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에 대해 알아보자