1
|
// class SteamNetworking public 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 bytes byte [] 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/