Steamworks and Unity – P2P多人游戏
|
1
|
// class SteamNetworkingpublic static bool SendP2PPacket(CSteamID steamIDRemote, byte[] pubData, uint cubData, EP2PSend eP2PSendType, int nChannel = 0) |
|
1
2
3
4
5
6
7
|
CSteamID receiver = ...;string hello = "Hello!";// allocate new bytes array and copy string characters as bytesbyte[] bytes = new byte[hello.Length * sizeof(char)];System.Buffer.BlockCopy(hello.ToCharArray(), 0, bytes, 0, bytes.Length);SteamNetworking.SendP2PPacket(receiver, bytes, (uint) bytes.Length, EP2PSend.k_EP2PSendReliable); |
- k_EP2PSendUnreliable – 小包,可以丢失,不需要依次发送,但要快
- k_EP2PSendUnreliableNoDelay – 跟上面一样,但是不做链接检查,因为这样,它可能被丢失,但是这种方式是最快的传送方式。
- k_EP2PSendReliable – 可靠的信息,大包,依次收发。
- k_EP2PSendReliableWithBuffering – 跟上面一样,但是在发送前会缓冲数据,如果你发送大量的小包,它不会那么及时。(可能会延迟200ms)
如果一个人发送了数据,另一个会以某种方式收到数据。当然,他们都有保密的安全措施。你不会发送数据到你范围之外的其他Steamworks的客户端上。一个Client能接收你的数据之前,他已经和你接受了你的请求,建立起一个P2P会话。
P2P会话请求发生在你第一次向SteamWork客户端发送数据时。当你还有发送任何数据时,这个过程会自动重复(通常是几分钟一次),你应该只接受你希望的连接,例如,你所在大厅(lobby)的其他玩家。
如何接受一个会话请求?非常简单!你可以像下面这样写代码:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
// create a callback field. Having a field will make sure that the callback// handle won't be eaten by garbage collector.private Callback<P2PSessionRequest_t> _p2PSessionRequestCallback;void Start(){ // setup the callback method _p2PSessionRequestCallback = Callback<P2PSessionRequest_t>.Create(OnP2PSessionRequest);}void OnP2PSessionRequest(P2PSessionRequest_t request){ CSteamID clientId = request.m_steamIDRemote; if (ExpectingClient(clientId)) { SteamNetworking.AcceptP2PSessionWithUser(clientId); } else { Debug.LogWarning("Unexpected session request from " + clientId); }} |
所有消息都存在Steamwork消息对队列中。你准备取它时就可以读它。一般在Update()函数中要处理这些,你的应用可以尽快的检查到是否有新消息。
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
void Update() { uint size; // repeat while there's a P2P message available // will write its size to size variable while (SteamNetworking.IsP2PPacketAvailable(out size)) { // allocate buffer and needed variables var buffer = new byte[size]; uint bytesRead; CSteamID remoteId; // read the message into the buffer if (SteamNetworking.ReadP2PPacket(buffer, size, out bytesRead, out remoteId)) { // convert to string char[] chars = new char[bytesRead / sizeof(char)]; Buffer.BlockCopy(buffer, 0, chars, 0, length); string message = new string(chars, 0, chars.Length); Debug.Log("Received a message: " + message); } }} |
这个指南没有覆盖清理部分(这不是必须的,因为没有用到的会话会被自动清理)和异常处理。你可以在官方文档读到它们 official Steamworks documentation,。记住你需要成为Steam的伙伴才可能获得,如果你还不是,我希望你读完本文之后,可以考虑成为其中一员。
原文链接:http://blog.theknightsofunity.com/steamworks-and-unity-p2p-multiplayer/
Steamworks and Unity – P2P多人游戏的更多相关文章
- GJM : Unity3D - NetWork - Hight Level API ( HLAPI) [转载]
介绍在本系列教程中,我们将使用的网络高级API(HLAPI)来构建一个小型的多人网络案例.即使我们的例子很简单,但也会涵盖以下关键概念,这应该可以帮助大家使用HLAPI构建大型游戏项目. 在第一部分, ...
- 基于 WebRTC 创建一款多人联机游戏
本项目的目标旨在尽可能少用服务器资源的前提下研发一款在线多人游戏,同时期望在一个用户的浏览器上运行游戏,同时让另一个玩家来连接.此外还希望程序尽可能简单以便于在博客中分析. 运用的技术 在我刚接触 P ...
- Unity接入Steamworks
一.将scrpts/Steamworks.net/SteamManager组件添加到游戏物体上 二.修改SteamManager的代码为游戏的id如图所示 三.Unity,打开项目根目录,修改stea ...
- 关于Unity的网络框架
注:Unity 5.1里引入了新的网络框架,未来目标应该是WOW那样的,现在还只是个P2P的架子. 网络的框架,无非是如何管理网络数据的收发,通信双方如何约定协议.之前做的框架与GameObject无 ...
- Unity Networking API文档翻译(二):The High Level API
高级API (HLAPI) 是用来提供给Unity 创建多人在线游戏的组件.它是在底层传输层的基础上构建的, 对多人在线游戏提供了很多通用的功能.当传输层支持各种网络拓扑结构的时候,HLAPI是一个功 ...
- Unity Networking API文档翻译(一):Networking概述
写在翻译前的话: 我使用过Photon,研究过Ulink这些Unity提供的多人在线游戏服务器组件,这些商业组件虽然很好很强大.但是对于一个独立开发者来说,4000多软妹币还是点多.总想找一 ...
- unity的坑
http://dearymz.blog.163.com/blog/static/20565742013341916919/ 编辑器: Hierarchy窗口中是场景中的Game Object列表 Pr ...
- Unity多玩家网络游戏开发教程1章Unity带有网络功能
Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件.专门提供了对网络功能的支持. 可是.大部分开发人员第一次接触到的还是Unity自带的网络功能.也就是大家常 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
随机推荐
- WP REST API: 设置和使用OAuth 1.0a Authentication(原文)
In the previous part of the series, we set up basic HTTP authentication on the server by installing ...
- 以太坊系列之五: p2p的nat模块--以太坊源码学习
p2p的nat模块 该模块相对比较简单,因为nat的真正实现并不在此模块,主要是使用了第三方的nat-upnp和nat-pmp来实现真正的穿透(端口映射). 对外公布的接口 ```go // An i ...
- Day3作业 .
,))::])]): :-])# 3,使用while和for循环分别打印字符串s=’asdfer’中每个元素. # 4,实现一个整数加法计算器:# 如:content = input(‘请输入内容:’ ...
- EF进阶篇(一)——概述
前言 以前在ITOO里面和图书馆项目开发的时候,采用的这个技术,但是总是对上下文那里不是特别清楚.上下文这个概念很是模糊,所以这次再次拿起这个技术点儿,然后复习了一遍,发现我以前想的好简单. 内容 E ...
- WKWebView 的使用和封装
WKWebView 的使用和封装 前言 项目中有个新闻资讯模块展示公司和相关行业的最新动态. 这个部分基本是以展示网页为主,内部可能会有一些 native 和 JS 代码的交互. 因为是新项目,所以决 ...
- Python3入门之软件安装
获得更多资料欢迎进入我的网站或者 csdn或者博客园 最近将我的Python笔记整理下,希望能对他人有所帮助,这是第一课,安装入门篇: windows下安装Python 1.下载,从这里下载:[下载链 ...
- 学习TypeScript,笔记一:TypeScript的简介与数据类型
该文章用于督促自己学习TypeScript,作为学笔记进行保存,如果有错误的地方欢迎指正 2019-03-27 16:50:03 一.什么是TypeScript? TypeScript是javasc ...
- SDUT OJ 顺序表应用3:元素位置互换之移位算法
顺序表应用3:元素位置互换之移位算法 Time Limit: 1000 ms Memory Limit: 570 KiB Submit Statistic Discuss Problem Descri ...
- Query on a tree II 倍增LCA
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...
- linux opencv版本查询
查看opencv安装路径: sudo find / -iname "*opencv*" 查看opencv版本: pkg-config opencv --modversion 查看o ...