photon基础配置
生成游戏玩家
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
//得到反馈资料MonoBehaviourPunCallbacks
public class Launcher : MonoBehaviourPunCallbacks
{
// Start is called before the first frame update
void Start()
{
//连接服务器
PhotonNetwork.ConnectUsingSettings();
}
// Update is called once per frame
void Update()
{
}
//是否连接到主要服务器
public override void OnConnectedToMaster()
{
base.OnConnectedToMaster();
Debug.Log("Welcome Michael");
//创建或者加入房间
PhotonNetwork.JoinOrCreateRoom("Room", new Photon.Realtime.RoomOptions() { MaxPlayers = 4 }, default);
}
public override void OnJoinedRoom()
{
base.OnJoinedRoom();
PhotonNetwork.Instantiate("Player", new Vector3(1, 1, 0), Quaternion.identity, 0);
}
}
挂载:
建立玩家对象
扔到这个文件夹下做预制体
现在可以每个客户端生成一个玩家
给名字
完整框架
代码
RoomListManager
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;
public class RoomListManager : MonoBehaviourPunCallbacks
{
public GameObject roomNamePrefeb;
public Transform gridLayout;
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
for (int i = 0; i < gridLayout.childCount; i++)
{
if(gridLayout.GetChild(i).gameObject.GetComponentInChildren<Text>().text == roomList[i].Name)
{
Destroy(gridLayout.GetChild(i).gameObject);
if (roomList[i].PlayerCount==0)
{
roomList.Remove(roomList[i]);
}
}
}
foreach (var room in roomList)
{
GameObject newRoom = Instantiate(roomNamePrefeb, gridLayout.position, Quaternion.identity);
newRoom.GetComponentInChildren<Text>().text = room.Name+"("+room.PlayerCount+")";
newRoom.transform.SetParent(gridLayout);
}
}
}
GameManager
using UnityEngine;
using Photon.Pun;
public class GameManager : MonoBehaviourPunCallbacks
{
public GameObject readyButton;
public void ReadyToPlay()
{
readyButton.SetActive(false);
PhotonNetwork.Instantiate("Player",new Vector3(1,1,0),Quaternion.identity,0);
}
}
PlayerController_My
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class PlayerController_My : MonoBehaviourPun
{
public TextMesh nameText;
private void Awake()
{
//nameText = GetComponent<TextMesh>();
if (photonView.IsMine)
nameText.text = PhotonNetwork.NickName;
else
nameText.text=photonView.Owner.NickName;
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(!photonView.IsMine&&PhotonNetwork.IsConnected)
return;
}
}
挂载
预制体制作
效果
补充
搞到一个服务器下
参考网址
Pun 2 2 - Lobby UI | Photon Engine
测试:
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
namespace Com.MyCompany.MyGame
{
public class Launcher : MonoBehaviourPunCallbacks
{
/// <summary>
/// The maximum number of players per room. When a room is full, it can't be joined by new players, and so new room will be created.
/// </summary>
[Tooltip("The maximum number of players per room. When a room is full, it can't be joined by new players, and so new room will be created")]
[SerializeField]
private byte maxPlayersPerRoom = 4;
#region Private Serializable Fields
#endregion
#region Private Fields
/// <summary>
/// This client's version number. Users are separated from each other by gameVersion (which allows you to make breaking changes).
/// </summary>
string gameVersion = "1";
#endregion
#region MonoBehaviour CallBacks
/// <summary>
/// MonoBehaviour method called on GameObject by Unity during early initialization phase.
/// </summary>
void Awake()
{
// #Critical
// this makes sure we can use PhotonNetwork.LoadLevel() on the master client and all clients in the same room sync their level automatically
PhotonNetwork.AutomaticallySyncScene = true;
}
/// <summary>
/// MonoBehaviour method called on GameObject by Unity during initialization phase.
/// </summary>
void Start()
{
Connect();
}
#endregion
#region Public Methods
/// <summary>
/// Start the connection process.
/// - If already connected, we attempt joining a random room
/// - if not yet connected, Connect this application instance to Photon Cloud Network
/// </summary>
public void Connect()
{
// we check if we are connected or not, we join if we are , else we initiate the connection to the server.
if (PhotonNetwork.IsConnected)
{
// #Critical we need at this point to attempt joining a Random Room. If it fails, we'll get notified in OnJoinRandomFailed() and we'll create one.
PhotonNetwork.JoinRandomRoom();
}
else
{
// #Critical, we must first and foremost connect to Photon Online Server.
PhotonNetwork.ConnectUsingSettings();
PhotonNetwork.GameVersion = gameVersion;
}
}
#endregion
public override void OnConnectedToMaster()
{
Debug.Log("PUN Basics Tutorial/Launcher: OnConnectedToMaster() was called by PUN");
// #Critical: The first we try to do is to join a potential existing room. If there is, good, else, we'll be called back with OnJoinRandomFailed()
PhotonNetwork.JoinRandomRoom();
}
public override void OnDisconnected(DisconnectCause cause)
{
Debug.LogWarningFormat("PUN Basics Tutorial/Launcher: OnDisconnected() was called by PUN with reason {0}", cause);
}
public override void OnJoinRandomFailed(short returnCode, string message)
{
Debug.Log("PUN Basics Tutorial/Launcher:OnJoinRandomFailed() was called by PUN. No random room available, so we create one.\nCalling: PhotonNetwork.CreateRoom");
// #Critical: we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.
//PhotonNetwork.CreateRoom(null, new RoomOptions());
// #Critical: we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.
PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = maxPlayersPerRoom });
}
public override void OnJoinedRoom()
{
Debug.Log("PUN Basics Tutorial/Launcher: OnJoinedRoom() called by PUN. Now this client is in a room.");
}
}
}
PlayerNameInputField
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;
using System.Collections;
namespace Com.MyCompany.MyGame
{
/// <summary>
/// Player name input field. Let the user input his name, will appear above the player in the game.
/// </summary>
[RequireComponent(typeof(InputField))]
public class PlayerNameInputField : MonoBehaviour
{
#region Private Constants
// Store the PlayerPref Key to avoid typos
const string playerNamePrefKey = "PlayerName";
#endregion
#region MonoBehaviour CallBacks
/// <summary>
/// MonoBehaviour method called on GameObject by Unity during initialization phase.
/// </summary>
void Start()
{
string defaultName = string.Empty;
InputField _inputField = this.GetComponent<InputField>();
if (_inputField != null)
{
if (PlayerPrefs.HasKey(playerNamePrefKey))
{
defaultName = PlayerPrefs.GetString(playerNamePrefKey);
_inputField.text = defaultName;
}
}
PhotonNetwork.NickName = defaultName;
}
#endregion
#region Public Methods
/// <summary>
/// Sets the name of the player, and save it in the PlayerPrefs for future sessions.
/// </summary>
/// <param name="value">The name of the Player</param>
public void SetPlayerName(string value)
{
// #Important
if (string.IsNullOrEmpty(value))
{
Debug.LogError("Player Name is null or empty");
return;
}
PhotonNetwork.NickName = value;
PlayerPrefs.SetString(playerNamePrefKey, value);
}
#endregion
}
}
设置画布为全局的,可以一直跟着走