Unity连Photon服务器入门详解
Photon是目前比较好用的游戏服务器。目前网上对于Photon的服务器讲解比较少,最近也对Photon做了初步的了解,做一个极其详细的入门。
首先就是得下载Photon咯
https://www.photonengine.com/en/OnPremise/Download 这个是服务器下载。(上传图片的功能崩溃了。。。)
这个服务器是有权限的,免费的有100人上限和30天免费,调试用的话,100人的还是很合算的。
https://www.photonengine.com/en/OnPremise/Dashboard (得注册账号哦。。。)
这里有个比较好的教程 http://download.csdn.net/download/a762923309/4936547 是免费的,下载就好(CSDN的)
http://www.cnblogs.com/liusuqi/category/447143.html这个博客对Photon的讲解非常好
如果你能看懂教程就可以右上角了。
现在开始正题。在服务器的deploy中是配置所有服务器的,会看到有几个启动版本bin_Win32,bin_Win32_xp,根据自己的系统环境来选择。
我系统是win10选的就是bin_Win64 里面有个PhotonControl.exe就是运行服务器。双击启动它。
在你的系统右下角就会发现一个小圆圈,这个就是服务器啦!
右键它你会发现有个Photon instance:下面有个Default就是我们要用的服务器啦,上面的教程中这里是不同的,不过没差多少。
对了,下载下来的权限就放在这个bin文件夹,我的就是bin_Win64,弄完权限记得重启服务器啊。
下面我们就来写一下服务器代码。一个简单的用户登录
Photon用的C#我们就用VS写,我用的是VS2015
首先我们新建一个C#类库我们叫MyServer,让我们引入3个dll,在Photon的lib中
ExitGamesLibs.dll
Photon.SocketServer.dll
PhotonHostRuntimeInterfaces.dll
新建一个C#类我们叫MyPeer,继承PeerBase,然后重写函数,别忘了using
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces; namespace MyServer
{
using Message;
using System.Collections; public class MyPeer : PeerBase
{ Hashtable userTabel; public MyPeer(IRpcProtocol protocol,IPhotonPeer photonPeer) : base(protocol, photonPeer)
{
userTabel = new Hashtable();
userTabel.Add("", "");
} protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
{
//失去连线时候要处理的事项,例如释放资源
} protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
//取得Client端传过来的要求加以处理
switch (operationRequest.OperationCode)
{
case (byte)OpCodeEnum.Login:
string uname = (string)operationRequest.Parameters[(byte)OpKeyEnum.UserName];
string pwd = (string)operationRequest.Parameters[(byte)OpKeyEnum.PassWord]; if (userTabel.ContainsKey(uname) && userTabel[uname].Equals(pwd))
{
SendOperationResponse(new OperationResponse((byte)OpCodeEnum.LoginSuccess, null), new SendParameters());
}
else
{
SendOperationResponse(new OperationResponse((byte)OpCodeEnum.LoginFailed, null), new SendParameters());
}
break;
}
}
}
}
然后我们再建一个C#类叫MyApplication,我们继承AppLicationBase,然后全部重写就好,每个函数的意思我都给出来了
using Photon.SocketServer; namespace MyServer
{
public class MyApplication : ApplicationBase
{
protected override PeerBase CreatePeer(InitRequest initRequest)
{
//建立连线并回传给Photon Server
return new MyPeer(initRequest.Protocol, initRequest.PhotonPeer);
} protected override void Setup()
{
//初始化GameServer
} protected override void TearDown()
{
//关闭GameServer并释放资源
}
}
}
还有个Message是用来标识状态的,同样新建一个C#类叫Message
namespace MyServer.Message
{
enum OpCodeEnum : byte
{
Login = ,
LoginSuccess = ,
LoginFailed = , Create = ,
Join = ,
Leave = ,
RaiseEvent = ,
SetProperties = ,
GetProperties =
} enum OpKeyEnum : byte
{
RoomId = ,
UserName = ,
PassWord =
}
}
然后比较重要的一步,在VS中的解决方案中,我们右键我们的MyServer(C#类库名)打开属性,选择生成,把输出中的输出路径改为bin\
因为Photon就读取bin目录中的dll。
然后我们就生成服务器就好啦~~~
然后把我们的服务器MyServer中除了bin文件夹其他都可以删除,然后放到Photon中的deploy文件夹中,然后我们来配置一下Photon
打开deploy目录中的bin目录,我就打开bin_Win64中的PhotonServer.config,用VS打开即可
建议阅读PhotonServer.config文件中的注释,不会英语的可以用有道。很有帮助
我们用的是Udp的传输方式,Photon只有一个接听端口就是5055,所以防火墙不要封这个端口还有843,是Unity和Flash的一个接通端口所以也不要封,防火墙不会开固定端口的见http://windows.microsoft.com/zh-cn/windows/open-port-windows-firewall#1TC=windows-7
然后我们要加一段代码在<Applications Default="Lite">下面
<!-- MyServer Application -->
<Application
Name="MyServer"
BaseDirectory="MyServer"
Assembly="MyServer"
Type="MyServer.MyApplication"
ForceAutoRestart="true"
WatchFiles="dll;config"
ExcludeFiles="log4net.config">
</Application>
然后保存即可。
这样我们服务器端就配置完成了,现在让我们打开Default中的Start as application,然后打开Open Logs 见到Server is running。。。表面服务器建立成功了。
然后就是Unity端了
我们新建一个工程,然后引入一个dll直接拖到Unity中就行Photon3Unity3D.dll 同样也在lib中。
让我们建一个C# Script 叫hotonSocket,同样在引用中导入Photon3Unity3D.dll
using UnityEngine;
using ExitGames.Client.Photon;
using System.Collections.Generic; public class PhotonSocket : MonoBehaviour,IPhotonPeerListener { #region 单例 private static PhotonSocket _Instance; public static PhotonSocket Instance
{
get { return _Instance; }
} #endregion private string address; //最好在Awake或Start中赋值,Unity 小问题,容易造成值不更改,还有最好写成私有
private string Server; //同上
private PhotonPeer peer; public ClientState state; void Awake ()
{
_Instance = this;
address = "localhost:5055";
Server = "MyServer";
state = ClientState.DisConnect;
peer = new PhotonPeer(this, ConnectionProtocol.Udp);
peer.Connect(address, Server);
} public void SendMessage(byte Code,Dictionary<byte,object> param)
{
peer.OpCustom(Code, param,true);
} void Update ()
{
peer.Service();
} public void DebugReturn(DebugLevel level, string message)
{
} public void OnEvent(EventData eventData)
{
} public void OnOperationResponse(OperationResponse operationResponse)
{
switch(operationResponse.OperationCode)
{
case (byte)OpCodeEnum.LoginSuccess:
Debug.Log("login Success");
state = ClientState.LoginSuccess;
break;
case (byte)OpCodeEnum.LoginFailed:
Debug.Log("login Failed");
state = ClientState.LoginFailed;
break;
}
} public void OnStatusChanged(StatusCode statusCode)
{
switch(statusCode)
{
case StatusCode.Connect:
Debug.Log("Connect");
break;
case StatusCode.Disconnect:
Debug.Log("DisConnect");
break;
}
} public enum ClientState : byte
{
DisConnect,
Connect,
LoginSuccess,
LoginFailed
} enum OpCodeEnum : byte
{
//Login
Login = ,
LoginSuccess = ,
LoginFailed = ,
}
}
这样Unity的部分也完事了,就可以来测试啦,出现Connect的Debug就表面链接服务器成功,出现LoginSuccess就OK了。
以上的都是我们在教程中都能找到的部分,然后我们来说说教程中没有的Unity部分的address。
如果想局域网联机的就要找到你的本机内网IP,然后让address = 本机IP:5055 这样就OK了,
如果要想要外网链接呢有两种情况,一种你是用路由器的,也有两种方式,一种开DMZ主机,一种开虚拟服务器。
第一种DMZ主机,不建议用这种方式,他会把你的IP完全暴露在外网,不安全, address = 外网IP:5055
第二种虚拟服务器,这种方式就是开放部分端口,比较高端的路由器可以设置端口对端口,不高端的路由器只能指定端口,address = WAN口IP:5055
没有服务器的呢,下一个花生壳软件,他会给你一个免费的域名,然后挂在你的外网IP上然后 address = 花生壳域名:5055
Unity连Photon服务器入门详解的更多相关文章
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- Redis快速入门详解
Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...
- [转]SQL注入攻防入门详解
原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...
- webpack入门详解
webpack入门详解(基于webpack 3.5.4 2017-8-22) webpack常用命令: webpack --display-error-details //执行打包 webpa ...
- 【转载】SQL注入攻防入门详解
滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园 首页 博问 闪存 联系 订阅 管理 随笔-58 评论-2028 文章-5 trackbacks-0 站长 ...
- 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- Quartz 入门详解
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
随机推荐
- 基于Spring的简易SSO设计
通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单点登录) ,java环境下已经有一些开源 ...
- 处理 EF 并发其实就这么简单
最近项目有点闲,终于可以了解点自己想了解的了,以前听同事讲面试的经历总会被问到“如何处理高并发大数据” 乍一听感觉这东西好像很有学问的样子,于是并发这个词在脑海里留深刻印像,而且在自己心中的技术地位也 ...
- SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.1
最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ...
- jQuery升级踩坑大全
jQuery升级踩坑大全 背景 jQuery想必各个web工程师都再熟悉不过了,不过现如今很多网站还采用了很古老的jQuery版本.其实如果早期版本使用不当,可能会有DOMXSS漏洞,非常建议升级到j ...
- Angular实现瀑布流的库angular-deckgrid
一. 安装 bower install --save angular-deckgrid 添加代码到你的HTML 添加到你的angular模块中: angular.module('your.module ...
- Web Api通过Route、RoutePrefix等特性设置路由
[Route("customers/{customerId}/orders")] [HttpGet] public IEnumerable<Order> FindOrd ...
- ASP.NET Web API 实现客户端Basic(基本)认证 之简单实现
优点是逻辑简单明了.设置简单. 缺点显而易见,即使是BASE64后也是可见的明文,很容易被破解.非法利用,使用HTTPS是一个解决方案. 还有就是HTTP是无状态的,同一客户端每次都需要验证. 实现: ...
- BroadcastReceiver之(手动代码注册广播)屏幕锁屏、解锁监听、开机自启
对于解锁和锁屏这种用的比较频繁action,谷歌做了限制,必须手动用代码注册 直接上代码:这是注册广播(手动代码注册广播接收者) public class MainActivity extends A ...
- 数据源DBCP一二
其实DBCP这个数据源实际上和com.alibaba.druid.pool.DruidDataSource 是差不多的
- python内置数据类型-字典和列表的排序 python BIT sort——dict and list
python中字典按键或键值排序(我转!) 一.字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序. Py ...