一, 简介

  玩过 LOL , dota2, 王者荣耀 等MOBA类的游戏,就很容易理解大厅和房间了.

  LOL中一个服务器就相当与一个大厅; 什么电一,电二 ,,, 联通一区等 每一个区就相当于一个大厅.

  而开始游戏创建一个自定义游戏的时候 , 就是创建了一个房间 对应 PhotonNetwork.CreateRoom() 函数 .

  LOL普通匹配就像是一个有对应匹配算法的 PhotonNetwork.JoinRandom() .

二, 使用

  ① 连接到服务器

  服务器的地址在这里设置

  

  勾选Auto-Join Lobby 后程序就会自动加入到房间 , 不需要再在代码中实现加入大厅

  在适当的地方调用 PhotonNetwork.ConnectUsingSettings(string _GameVersion)  ; 即可连接到大厅.

  连接大厅成功与失败对应两个函数

  首先脚本需要继承自  Photon.PunBehaviour

    public class Launcher : Photon.PunBehaviour
{ /// <summary>
/// 成功连接到大厅
/// </summary>
public override void OnConnectedToPhoton()
{ } /// <summary>
/// 连接大厅失败
/// </summary>
/// <param name="error"></param>
private void OnFailedToConnect(NetworkConnectionError error)
{
Debug.Log("fail to Connect");
}
}

  ② 监控房间列表

  重写 Photon.PunBehaviour.OnReceivedRoomListUpdate() ;

public override void OnReceivedRoomListUpdate(){

}

  ③ 设置玩家昵称  PhotonNetwork.playerName = "PlayerName";

  ④ 创建房间 PhotonNetwork.CreateRoom("roomName", new RoomOptions() { MaxPlayers = MaxPlayersPerRoom },(TypedLobby)null );

   第一个参数是房间名, 第二个参数房间参数, 第三个参数 房间所在的大厅 默认大厅是null

  ⑤ 加入房间

  /// <param name="roomName">独一无二的房间名</param>
  /// <param name="expectedUsers">玩家在房间中的顺序</param>
  /// <returns>加入是否成功</returns>
  public static bool JoinRoom(string roomName, string[] expectedUsers)

三. 完整代码

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI; namespace com.Lobby
{
public class Launcher : Photon.PunBehaviour
{
#region PUBLIC //客户端版本
public string _gameVersion = "1.0"; //玩家名字
public InputField nameField; //房间列表
public RectTransform LobbyPanel; #endregion #region PRIVATE private bool isConnecting;
#endregion private void Awake()
{
//#不重要
//强制Log等级为全部
PhotonNetwork.logLevel = PhotonLogLevel.Full; //#关键
//我们不加入大厅 这里不需要得到房间列表所以不用加入大厅去
PhotonNetwork.autoJoinLobby = true; //#关键
//这里保证所有主机上调用 PhotonNetwork.LoadLevel() 的时候主机和客户端能同时进入新的场景
PhotonNetwork.automaticallySyncScene = true;
} // Use this for initialization
void Start()
{
Connect(); SetPlayerName();
} /// <summary>
/// 连接到大厅
/// </summary>
private void Connect()
{
isConnecting = true; //已經連接上了服務器
if (PhotonNetwork.connected)
{
Debug.Log("Connected");
}
else
{
PhotonNetwork.ConnectUsingSettings(_gameVersion);
}
}
/// <summary>
/// 成功连接到大厅
/// </summary>
public override void OnConnectedToPhoton()
{
base.OnConnectedToPhoton();
} /// <summary>
/// 连接大厅失败
/// </summary>
/// <param name="error"></param>
private void OnFailedToConnect(NetworkConnectionError error)
{
Debug.Log("fail to Connect");
} public void CreateARoom()
{
if (PhotonNetwork.connected)
{
//创建房间成功
if (PhotonNetwork.CreateRoom(nameField.text, new RoomOptions { MaxPlayers = }, null))
{
Debug.Log("Launcher.CreateARoom 成功");
PhotonNetwork.LoadLevel("Room");
}
}
} public override void OnPhotonCreateRoomFailed(object[] codeAndMsg)
{
Debug.Log("Launcher Create Room faileds");
} public void PlayerNameChanged()
{
if (string.IsNullOrEmpty(nameField.text))
{
PlayerPrefs.SetString("PlayerName", "default");
}
else
{
SetPlayerName();
}
} public void SetPlayerName()
{
if (string.IsNullOrEmpty(nameField.text))
{
if (PlayerPrefs.HasKey("PlayerName"))
{
nameField.text = PlayerPrefs.GetString("PlayerName");
}
} PhotonNetwork.playerName = nameField.text;
PlayerPrefs.SetString("PlayerName", nameField.text);
} public override void OnReceivedRoomListUpdate()
{ Debug.Log("OnReceivedRoomListUpdate"); RoomInLobby[] ts = LobbyPanel.GetComponentsInChildren<RoomInLobby>();
foreach (RoomInLobby t in ts)
{
Destroy(t.gameObject);
} RoomInfo[] rooms = PhotonNetwork.GetRoomList();
foreach (RoomInfo room in rooms)
{
GameObject g = GameObject.Instantiate(Resources.Load("Lobby/RoomItem") as GameObject);
Text t = g.transform.Find("Text").GetComponent<Text>();
t.text = room.Name;
g.name = room.Name;
g.transform.SetParent(LobbyPanel);
g.transform.localScale = Vector3.one;
}
}
}
}

这里有整个工程的代码 https://github.com/Luckeee/mahjong

Photon PUN 二 大厅 & 房间的更多相关文章

  1. Photon PUN 三 RPCs & RaiseEvent

    官方文档地址 https://doc.photonengine.com/en-us/pun/current/manuals-and-demos/rpcsandraiseevent 一, RPC   P ...

  2. Photon PUN 一 介绍

    有句话说的好 , 官网永远是最好的学习地方 . 虽然国内的资料不多 , 但是官网的资料还是很充足 , 这就带着英汉词典就着作阅读理解的劲头去官网学习吧 https://doc.photonengine ...

  3. Unity - Photon PUN 本地与网络同步的逻辑分离 (二)

    上篇实现了事件系统的设计,这篇就来结合发送RPC消息 并且不用标记 [PunRPC] 先来看下上编的代码 GameEnvent.cs private static Dictionary<Comm ...

  4. Unity - Photon PUN 本地与网络同步的逻辑分离 (一)

    服务器大家可以使用Photon官网提供的,这样会变得很简单,直接搭建下就好.或者下载到本地开启本地端Photon服务器 (大家也可以使用和我一样方式有时间做了个winform 程序用来管理本地服务器开 ...

  5. 使用Photon引擎进行unity网络游戏开发(三)——网络游戏大厅及房间

    使用Photon引擎进行unity网络游戏开发(三)--网络游戏大厅及房间 Photon PUN Unity 网络游戏开发 连接到Photon ConnectUsingSettings 设置你的客户端 ...

  6. 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍

    使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...

  7. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  8. 使用Photon引擎进行unity网络游戏开发(一)——Photon引擎简介

    使用Photon引擎进行unity网络游戏开发(一)--Photon引擎简介 Photon PUN Unity 网络游戏开发 Photon引擎简介: 1. 服务器引擎: 服 务 器 引 擎 介 绍 服 ...

  9. Unity3d客户端与Photon服务器数据通信

    今天先介绍一下Photon服务器是什么,可以做什么,为什么要使用它? Photon:开发多人联网游戏最轻松的方案!可以迅速简单实现多人实时在线网络游戏(pvp). Photon:透过位于各地的Phot ...

随机推荐

  1. 面试必问的volatile关键字

    原文: 卡巴拉的树   https://juejin.im/post/5a2b53b7f265da432a7b821c 在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度, ...

  2. MyBatis-Plus使用(3)-条件构造器

    说明: 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中 以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true 以下出现的泛型P ...

  3. 企业签名和TF签名哪个好?TF签名和企业签名怎么选?

    很多开发者在App无法上架Appstore,需要内测或者开放给苹果用户使用的时候,需要选择企业签名来帮助自己的App开放下载链接,给苹果用户使用.苹果企业签名的类型有很多,TF签名最近又很火爆,那么企 ...

  4. Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)

    废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...

  5. 记一次LayUI中Table动态添加列数据

    这次在开发中遇到,有列数不固定的情况.废话不多说,先上图,在上代码. 下面上JS代码 function SearchData() { var dYear = $("#DYear") ...

  6. C#经典算法实践,回顾往生,更是致敬《算法导论》

    该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/666 访问. 概述 本系列博文将会向大家介绍本人在钻研<算法导论 ...

  7. windows安装cnpm步骤

    1.首先前往nodejs官网下载nodejs 2.安装nodejs 3.打开cmd,输入npm -v,检查npm是否安装成功.成功返回的话返回输出版本号 4.安装cnpm,输入npm install ...

  8. name 'xrange' is not defined

    出现这个错误是因为examples使用的是Python2 在Python3中,移除了在Python2中的range, 并将 xrange 命名为 range 将代码中的xrange改为range就可以 ...

  9. WeakHashMap的应用场景

    WeakHashMap是啥: WeakHashMap和HashMap都是通过"拉链法"实现的散列表.它们的源码绝大部分内容都一样,这里就只是对它们不同的部分就是说明.  WeakR ...

  10. Python-Opencv 图像处理基本操作

    Python-Opencv 图像处理基本操作 1.图像读取 使用cv2.imread(filepath,flags)读入图像 filepath: 读入图像完整路径(绝对路径,相对路径) flags: ...