Update to release 1.0.0 (#112)
* fix: Update namespaces to latest MLAPI develop and fix asmdef reference * fix for C# diff with unity beta 6 * photon update * feat: update litnetlib to latest Transport API * chore: Remove old commented code * Update photon transport to latest API changes. - Remove channels * update template transport * update facepunch (#104) * update ruffles (#107) * update websocket (#106) * update steamp2p (#105) * update photon realtime (#108) * update photon * make connect async * define payload out param as default * update enet (#103) * update enet * Add changelog bump package version * remove sockettask api * reduce channel count to 1 and add comment explaining it * update litenetlib (#110) * update litenetlib * remove sockettask API * Update extensions package (#102) * feat!: remove NetworkRigidbody as there is now a solution in the core package * update lag compensation * update discovery and hud. Don't work yet because UnityTransport does not expose read access to ip/port * update pool * remove patcher * update namespaces * rename extensions package folder * update repository documentation (#109) Co-authored-by: Samuel Bellomo <samuel.bellomo@unity3d.com> Co-authored-by: Valere91Unity <valere.plantevin@unity3d.com> Co-authored-by: Valere Plantevin <89042540+VALERE91Unity@users.noreply.github.com>
This commit is contained in:
Родитель
2583c66903
Коммит
b32ffdd464
|
@ -1 +1 @@
|
|||
The multiplayer-community-contributions repository follows the same code of conduct as the Netcode for GameObjects repository. Please read the [Netcode for GameObjects code of conduct](https://github.com/Unity-Technologies/com.unity.netcode.gameobjects/blob/master/CODE_OF_CONDUCT.md), thank you!
|
||||
The multiplayer-community-contributions repository follows the same code of conduct as the Netcode for GameObjects repository. Please read the [Netcode for GameObjects code of conduct](https://github.com/Unity-Technologies/com.unity.netcode.gameobjects/blob/main/CODE_OF_CONDUCT.md), thank you!
|
|
@ -12,7 +12,7 @@ Here are our guidlines for contributing:
|
|||
|
||||
## <a name="coc"></a> Code of Conduct
|
||||
|
||||
Please help us keep Unity Multiplayer Networking open and inclusive. Read and follow our [Code of Conduct](https://github.com/Unity-Technologies/com.unity.netcode.gameobjects/blob/master/CODE_OF_CONDUCT.md).
|
||||
Please help us keep Unity Multiplayer Networking open and inclusive. Read and follow our [Code of Conduct](https://github.com/Unity-Technologies/com.unity.netcode.gameobjects/blob/main/CODE_OF_CONDUCT.md).
|
||||
|
||||
## <a name="ways"></a> Ways to Contribute
|
||||
|
||||
|
@ -27,13 +27,13 @@ If you would like to add new content to the contributions repository or improve
|
|||
|
||||
#### Creating a new Netcode for GameObjects Transport
|
||||
- Clone the multiplayer-community-contributions repository
|
||||
- Copy the com.mlapi.contrib.transport.template folder
|
||||
- Copy the com.community.netcode.transport.template folder
|
||||
- Rename the folder to better reflect your transport's name.
|
||||
- Update CHANGELOG.md, package.json, README.md with information about your transport
|
||||
- Rename TemplateTransport.cs and implement your transport. Rename the .asmdef file to the name of your transport as well.
|
||||
- If your transport needs any additional user actions to run please specific them in README.md
|
||||
|
||||
#### Adding an extension to the com.mlapi.contrib.extensions package
|
||||
#### Adding an extension to the com.community.netcode.extensions package
|
||||
- Create a new folder in the extension's package runtime folder.
|
||||
- Add your code to the folder.
|
||||
- Put a short README.md into the folder explaining what your extension does and how to use it.
|
||||
|
|
40
README.md
40
README.md
|
@ -4,7 +4,7 @@ The Multiplayer Community Contributions repository contains extensions provided
|
|||
|
||||
[Installing a Community Transport (Netcode for GameObjects)](/Transports/README.md)
|
||||
|
||||
[Installing the Community Extensions Package (Netcode for GameObjects)](/com.mlapi.contrib.extensions/README.md)
|
||||
[Installing the Community Extensions Package (Netcode for GameObjects)](/com.community.netcode.extensions/README.md)
|
||||
|
||||
### Community and Feedback
|
||||
For general questions, networking advice or discussions about Unity Multiplayer Networking or Netcode for GameObjects, please join our [Discord Community](https://discord.gg/FM8SE9E) or create a post in the [Unity Multiplayer Forum](https://forum.unity.com/forums/multiplayer.26/).
|
||||
|
@ -12,7 +12,7 @@ For general questions, networking advice or discussions about Unity Multiplayer
|
|||
### Maintenance
|
||||
The contributions repository is a community repository and not an official Unity product. What this means is:
|
||||
- We will accept new content and bug fixes and try to keep the content in this repository up to date.
|
||||
- We do not guarantee that any of the content in this repository will be supported by future MLAPI versions.
|
||||
- We do not guarantee that any of the content in this repository will be supported by future Netcode for GameObjects versions.
|
||||
- We ask the community and authors to maintain the content in this repository. Unity is not responsible for fixing bugs in community content.
|
||||
|
||||
### Adding new content
|
||||
|
@ -21,29 +21,26 @@ Check our [contribution guidelines](CONTRIBUTING.md) for information on how to c
|
|||
### Existing Content
|
||||
|
||||
#### Transports
|
||||
| **Name** | **Platforms** | **Version Specifics** | **0.1.0** | **v12** |
|
||||
|:------------:|:---------:|:-------------:|:-------:|:---:|
|
||||
| **[Ruffles](/Transports/com.mlapi.contrib.transport.ruffles)**| Desktop, Mobile | | :heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[Enet](/Transports/com.mlapi.contrib.transport.enet)**| Desktop, Mobile\* | |:heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[LiteNetLib](/Transports/com.mlapi.contrib.transport.litenetlib)**| Desktop, Mobile | | :heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[SteamP2P](/Transports/com.mlapi.contrib.transport.steamp2p)**| Steam || :heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[WebSocket](/Transports/com.mlapi.contrib.transport.websocket)**| Desktop, Mobile, WebGL\** | | :heavy_check_mark:||
|
||||
|**[Photon Realtime](/Transports/com.mlapi.contrib.transport.photon-realtime)**| Desktop, Mobile, WebGL\*** || :heavy_check_mark: | |
|
||||
|**[Facepunch](/Transports/com.mlapi.contrib.transport.facepunch)**| Steam || :heavy_check_mark: | :heavy_check_mark: |
|
||||
| **Name** | **Platforms** | **1.0.0** | **0.1.0** | **v12** |
|
||||
|:------------:|:---------:|:-------:|:-------:|:---:|
|
||||
| **[Ruffles](/Transports/com.community.netcode.transport.ruffles)**| Desktop, Mobile | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[Enet](/Transports/com.community.netcode.transport.enet)**| Desktop, Mobile\* | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[LiteNetLib](/Transports/com.community.netcode.transport.litenetlib)**| Desktop, Mobile | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[SteamP2P](/Transports/com.community.netcode.transport.steamp2p)**| Steam | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
|**[WebSocket](/Transports/com.community.netcode.transport.websocket)**| Desktop, Mobile, WebGL | :heavy_check_mark: | :heavy_check_mark:||
|
||||
|**[Photon Realtime](/Transports/com.community.netcode.transport.photon-realtime)**| Desktop, Mobile, WebGL\** | :heavy_check_mark: | :heavy_check_mark: | |
|
||||
|**[Facepunch](/Transports/com.community.netcode.transport.facepunch)**| Steam | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
|
||||
\* Needs manual binary compilation.<br>
|
||||
\** MLAPI 0.1.0 does currently not support building for WebGL. A version of the `develop` branch has to be used.<br>
|
||||
\*** Other platforms such as console platforms are also supported but require communication with Exit Games.
|
||||
\** Other platforms such as console platforms are also supported but require communication with Exit Games.
|
||||
|
||||
#### Extensions
|
||||
| **Name** | **Version Specifics** | **0.1.0** | **v12** |
|
||||
| **Name** | 1.0.0 | **0.1.0** | **v12** |
|
||||
|:------------:|:-------------:|:-------:|:---:|
|
||||
|**[LagCompensation](/com.mlapi.contrib.extensions/Runtime/LagCompensation)**| | :heavy_check_mark: | |
|
||||
|**[NetworkObjectPool](/com.mlapi.contrib.extensions/Runtime/NetworkObjectPool)**| | :heavy_check_mark: | |
|
||||
|**[NetworkManagerHud](/com.mlapi.contrib.extensions/Runtime/NetworkManagerHud)**| | :heavy_check_mark: | |
|
||||
|**[NetworkRigidbody](/com.mlapi.contrib.extensions/Runtime/NetworkRigidbody)**| | :heavy_check_mark: | |
|
||||
|**[NetworkRigidbody2D](/com.mlapi.contrib.extensions/Runtime/NetworkRigidbody2D)**| | :heavy_check_mark: | |
|
||||
|**[NetworkDiscovery](/com.mlapi.contrib.extensions/Runtime/NetworkDiscovery)**| | :heavy_check_mark: | |
|
||||
|**[LagCompensation](/com.community.netcode.extensions/Runtime/LagCompensation)**| :heavy_check_mark: | :heavy_check_mark: | |
|
||||
|**[NetworkObjectPool](/com.community.netcode.extensions/Runtime/NetworkObjectPool)**| :heavy_check_mark: | :heavy_check_mark: | |
|
||||
|**[NetworkManagerHud](/com.community.netcode.extensions/Runtime/NetworkManagerHud)**| :heavy_check_mark: | :heavy_check_mark: | |
|
||||
|**[NetworkDiscovery](/com.community.netcode.extensions/Runtime/NetworkDiscovery)**| :heavy_check_mark: | :heavy_check_mark: | |
|
||||
|
||||
|
||||
### Releases
|
||||
|
@ -51,4 +48,5 @@ Content for a specifc major version of Netcode for GameObjects can be found in t
|
|||
exist:
|
||||
| **Release**|
|
||||
|:------------:|
|
||||
| **[v12](https://github.com/Unity-Technologies/MLAPI.Transports/tree/release-v12)**|
|
||||
| **[v12](https://github.com/Unity-Technologies/multiplayer-community-contributions/tree/release-v12)**|
|
||||
| **[0.1.0](https://github.com/Unity-Technologies/multiplayer-community-contributions/tree/release-0.1.0)**|
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
This package contains third-party software components governed by the license(s) indicated below:
|
||||
---------
|
||||
|
||||
## Package: Transports/com.mlapi.contrib.transport.enet
|
||||
## Package: Transports/com.community.netcode.transport.enet
|
||||
|
||||
---------
|
||||
|
||||
|
@ -33,7 +33,7 @@ SOFTWARE.
|
|||
|
||||
---------
|
||||
|
||||
## Package: Transports/com.mlapi.contrib.transport.litenetlib
|
||||
## Package: Transports/com.community.netcode.transport.litenetlib
|
||||
|
||||
---------
|
||||
|
||||
|
@ -65,7 +65,7 @@ SOFTWARE.
|
|||
|
||||
---------
|
||||
|
||||
## Package: Transports/com.mlapi.contrib.transport.ruffles
|
||||
## Package: Transports/com.community.netcode.transport.ruffles
|
||||
|
||||
---------
|
||||
|
||||
|
@ -97,7 +97,7 @@ SOFTWARE.
|
|||
|
||||
---------
|
||||
|
||||
## Package: Transports/com.mlapi.contrib.transport.steamp2p
|
||||
## Package: Transports/com.community.netcode.transport.steamp2p
|
||||
|
||||
---------
|
||||
|
||||
|
@ -129,7 +129,7 @@ THE SOFTWARE.
|
|||
|
||||
---------
|
||||
|
||||
## Package: Transports/com.mlapi.contrib.transport.photon-realtime
|
||||
## Package: Transports/com.community.netcode.transport.photon-realtime
|
||||
|
||||
---------
|
||||
|
||||
|
@ -166,7 +166,7 @@ USE OF THE MATERIALS IN THIS FILE.
|
|||
|
||||
---------
|
||||
|
||||
## Package: Transports/com.mlapi.contrib.transport.websocket
|
||||
## Package: Transports/com.community.netcode.transport.websocket
|
||||
|
||||
---------
|
||||
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
# Changelog
|
||||
All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
|
||||
## 2.0.0
|
||||
|
||||
### Changed
|
||||
- Targets the Netcode for GameObjects 1.0.0 package.
|
||||
|
||||
### Removed
|
||||
- Removed support for channels.
|
||||
|
||||
## 1.0.0
|
||||
First version of the Enet transport as a Unity package.
|
|
@ -1,14 +1,13 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using ENet;
|
||||
using MLAPI.Transports;
|
||||
using MLAPI.Transports.Tasks;
|
||||
using Unity.Netcode;
|
||||
using Unity.Profiling;
|
||||
using UnityEngine;
|
||||
using Event = ENet.Event;
|
||||
using EventType = ENet.EventType;
|
||||
|
||||
namespace MLAPI.Transports.Enet
|
||||
namespace Netcode.Transports.Enet
|
||||
{
|
||||
[DefaultExecutionOrder(1000)]
|
||||
public class EnetTransport : NetworkTransport
|
||||
|
@ -31,28 +30,13 @@ namespace MLAPI.Transports.Enet
|
|||
static ProfilerMarker s_Flush =
|
||||
new ProfilerMarker("Enet.Flush");
|
||||
#endif
|
||||
|
||||
[Serializable]
|
||||
public struct EnetChannel
|
||||
{
|
||||
[HideInInspector]
|
||||
public byte Id;
|
||||
public EnetDelivery Delivery;
|
||||
}
|
||||
|
||||
public enum EnetDelivery
|
||||
{
|
||||
UnreliableSequenced,
|
||||
ReliableSequenced,
|
||||
Unreliable
|
||||
}
|
||||
|
||||
|
||||
public override bool IsSupported => Application.platform != RuntimePlatform.WebGLPlayer;
|
||||
|
||||
public ushort Port = 7777;
|
||||
public string Address = "127.0.0.1";
|
||||
public int MaxClients = 100;
|
||||
public List<EnetChannel> Channels = new List<EnetChannel>();
|
||||
public int MessageBufferSize = 1024 * 5;
|
||||
|
||||
[Header("ENET Settings")]
|
||||
|
@ -65,33 +49,26 @@ namespace MLAPI.Transports.Enet
|
|||
// Runtime / state
|
||||
private byte[] messageBuffer;
|
||||
private WeakReference temporaryBufferReference;
|
||||
|
||||
|
||||
|
||||
private readonly Dictionary<uint, Peer> connectedEnetPeers = new Dictionary<uint, Peer>();
|
||||
|
||||
private readonly Dictionary<NetworkChannel, byte> channelNameToId = new Dictionary<NetworkChannel, byte>();
|
||||
private readonly Dictionary<byte, NetworkChannel> channelIdToName = new Dictionary<byte, NetworkChannel>();
|
||||
private readonly Dictionary<byte, EnetChannel> internalChannels = new Dictionary<byte, EnetChannel>();
|
||||
|
||||
private Host host;
|
||||
|
||||
private uint serverPeerId;
|
||||
|
||||
private SocketTask connectTask;
|
||||
|
||||
private bool hasServiced;
|
||||
|
||||
public override ulong ServerClientId => GetMLAPIClientId(0, true);
|
||||
|
||||
public override void Send(ulong clientId, ArraySegment<byte> data, NetworkChannel channel)
|
||||
public override void Send(ulong clientId, ArraySegment<byte> data, NetworkDelivery delivery)
|
||||
{
|
||||
Packet packet = default(Packet);
|
||||
Packet packet = default;
|
||||
|
||||
packet.Create(data.Array, data.Offset, data.Count, PacketFlagFromDelivery(internalChannels[channelNameToId[channel]].Delivery));
|
||||
packet.Create(data.Array, data.Offset, data.Count, NetworkDeliveryToPacketFlag(delivery));
|
||||
|
||||
GetEnetConnectionDetails(clientId, out uint peerId);
|
||||
|
||||
connectedEnetPeers[peerId].Send(channelNameToId[channel], ref packet);
|
||||
connectedEnetPeers[peerId].Send(0, ref packet);
|
||||
}
|
||||
|
||||
public void Update()
|
||||
|
@ -106,7 +83,7 @@ namespace MLAPI.Transports.Enet
|
|||
#endif
|
||||
}
|
||||
|
||||
public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel channel, out ArraySegment<byte> payload, out float receiveTime)
|
||||
public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment<byte> payload, out float receiveTime)
|
||||
{
|
||||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_PollEvent.Begin();
|
||||
|
@ -125,7 +102,6 @@ namespace MLAPI.Transports.Enet
|
|||
if (hasServiced || host.Service(0, out @event) <= 0)
|
||||
{
|
||||
clientId = 0;
|
||||
channel = 0;
|
||||
payload = new ArraySegment<byte>();
|
||||
receiveTime = Time.realtimeSinceStartup;
|
||||
|
||||
|
@ -151,7 +127,6 @@ namespace MLAPI.Transports.Enet
|
|||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_Connect.Begin();
|
||||
#endif
|
||||
channel = 0;
|
||||
payload = new ArraySegment<byte>();
|
||||
receiveTime = Time.realtimeSinceStartup;
|
||||
|
||||
|
@ -159,13 +134,6 @@ namespace MLAPI.Transports.Enet
|
|||
|
||||
@event.Peer.PingInterval(PingInterval);
|
||||
@event.Peer.Timeout(TimeoutLimit, TimeoutMinimum, TimeoutMaximum);
|
||||
|
||||
if (connectTask != null)
|
||||
{
|
||||
connectTask.Success = true;
|
||||
connectTask.IsDone = true;
|
||||
connectTask = null;
|
||||
}
|
||||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_Connect.End();
|
||||
#endif
|
||||
|
@ -176,18 +144,10 @@ namespace MLAPI.Transports.Enet
|
|||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_Disconnect.Begin();
|
||||
#endif
|
||||
channel = 0;
|
||||
payload = new ArraySegment<byte>();
|
||||
receiveTime = Time.realtimeSinceStartup;
|
||||
|
||||
connectedEnetPeers.Remove(@event.Peer.ID);
|
||||
|
||||
if (connectTask != null)
|
||||
{
|
||||
connectTask.Success = false;
|
||||
connectTask.IsDone = true;
|
||||
connectTask = null;
|
||||
}
|
||||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_Disconnect.End();
|
||||
#endif
|
||||
|
@ -198,7 +158,6 @@ namespace MLAPI.Transports.Enet
|
|||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_Receive.Begin();
|
||||
#endif
|
||||
channel = channelIdToName[@event.ChannelID];
|
||||
receiveTime = Time.realtimeSinceStartup;
|
||||
int size = @event.Packet.Length;
|
||||
|
||||
|
@ -236,7 +195,6 @@ namespace MLAPI.Transports.Enet
|
|||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_Timeout.Begin();
|
||||
#endif
|
||||
channel = 0;
|
||||
payload = new ArraySegment<byte>();
|
||||
receiveTime = Time.realtimeSinceStartup;
|
||||
|
||||
|
@ -252,7 +210,6 @@ namespace MLAPI.Transports.Enet
|
|||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
s_NoEvent.Begin();
|
||||
#endif
|
||||
channel = 0;
|
||||
payload = new ArraySegment<byte>();
|
||||
receiveTime = Time.realtimeSinceStartup;
|
||||
#if DEVELOPMENT_BUILD || UNITY_EDITOR
|
||||
|
@ -270,40 +227,36 @@ namespace MLAPI.Transports.Enet
|
|||
}
|
||||
}
|
||||
|
||||
public override SocketTasks StartClient()
|
||||
public override bool StartClient()
|
||||
{
|
||||
SocketTask task = SocketTask.Working;
|
||||
|
||||
host = new Host();
|
||||
|
||||
host.Create(1, MLAPI_CHANNELS.Length + Channels.Count);
|
||||
host.Create(1, 16);
|
||||
|
||||
Address address = new Address();
|
||||
address.Port = Port;
|
||||
address.SetHost(Address);
|
||||
|
||||
Peer serverPeer = host.Connect(address, MLAPI_CHANNELS.Length + Channels.Count);
|
||||
Peer serverPeer = host.Connect(address, 1); // Currently Netcode for GameObjects does not use transport level channels.
|
||||
|
||||
serverPeer.PingInterval(PingInterval);
|
||||
serverPeer.Timeout(TimeoutLimit, TimeoutMinimum, TimeoutMaximum);
|
||||
|
||||
serverPeerId = serverPeer.ID;
|
||||
|
||||
connectTask = task;
|
||||
|
||||
return task.AsTasks();
|
||||
return true;
|
||||
}
|
||||
|
||||
public override SocketTasks StartServer()
|
||||
public override bool StartServer()
|
||||
{
|
||||
host = new Host();
|
||||
|
||||
Address address = new Address();
|
||||
address.Port = Port;
|
||||
|
||||
host.Create(address, MaxClients, MLAPI_CHANNELS.Length + Channels.Count);
|
||||
host.Create(address, MaxClients, 1); // Currently Netcode for GameObjects does not use transport level channels.
|
||||
|
||||
return SocketTask.Done.AsTasks();
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void DisconnectRemoteClient(ulong clientId)
|
||||
|
@ -346,91 +299,26 @@ namespace MLAPI.Transports.Enet
|
|||
Library.Deinitialize();
|
||||
}
|
||||
|
||||
public override void Init()
|
||||
public override void Initialize()
|
||||
{
|
||||
Library.Initialize();
|
||||
|
||||
internalChannels.Clear();
|
||||
channelIdToName.Clear();
|
||||
channelNameToId.Clear();
|
||||
|
||||
connectedEnetPeers.Clear();
|
||||
|
||||
// MLAPI Channels
|
||||
for (byte i = 0; i < MLAPI_CHANNELS.Length; i++)
|
||||
{
|
||||
channelIdToName.Add(i, MLAPI_CHANNELS[i].Channel);
|
||||
channelNameToId.Add(MLAPI_CHANNELS[i].Channel, i);
|
||||
internalChannels.Add(i, new EnetChannel()
|
||||
{
|
||||
Id = i,
|
||||
Delivery = MLAPINetworkDeliveryToPacketFlag(MLAPI_CHANNELS[i].Delivery)
|
||||
});
|
||||
}
|
||||
|
||||
// Internal Channels
|
||||
for (int i = 0; i < Channels.Count; i++)
|
||||
{
|
||||
byte id = (byte)(i + MLAPI_CHANNELS.Length);
|
||||
|
||||
channelIdToName.Add(id, (NetworkChannel)Channels[i].Id);
|
||||
channelNameToId.Add((NetworkChannel)Channels[i].Id, id);
|
||||
internalChannels.Add(id, new EnetChannel()
|
||||
{
|
||||
Id = id,
|
||||
Delivery = Channels[i].Delivery
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
messageBuffer = new byte[MessageBufferSize];
|
||||
}
|
||||
|
||||
private PacketFlags PacketFlagFromDelivery(EnetDelivery delivery)
|
||||
public PacketFlags NetworkDeliveryToPacketFlag(NetworkDelivery delivery)
|
||||
{
|
||||
switch (delivery)
|
||||
return delivery switch
|
||||
{
|
||||
case EnetDelivery.UnreliableSequenced:
|
||||
return PacketFlags.None;
|
||||
case EnetDelivery.ReliableSequenced:
|
||||
return PacketFlags.Reliable;
|
||||
case EnetDelivery.Unreliable:
|
||||
return PacketFlags.Unsequenced;
|
||||
default:
|
||||
return PacketFlags.None;
|
||||
}
|
||||
}
|
||||
|
||||
public EnetDelivery MLAPINetworkDeliveryToPacketFlag(NetworkDelivery type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case NetworkDelivery.Unreliable:
|
||||
{
|
||||
return EnetDelivery.Unreliable;
|
||||
}
|
||||
case NetworkDelivery.Reliable:
|
||||
{
|
||||
// ENET Does not support ReliableUnsequenced.
|
||||
// https://github.com/MidLevel/MLAPI.Transports/pull/5#issuecomment-498311723
|
||||
return EnetDelivery.ReliableSequenced;
|
||||
}
|
||||
case NetworkDelivery.ReliableSequenced:
|
||||
{
|
||||
return EnetDelivery.ReliableSequenced;
|
||||
}
|
||||
case NetworkDelivery.ReliableFragmentedSequenced:
|
||||
{
|
||||
return EnetDelivery.ReliableSequenced;
|
||||
}
|
||||
case NetworkDelivery.UnreliableSequenced:
|
||||
{
|
||||
return EnetDelivery.UnreliableSequenced;
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
}
|
||||
}
|
||||
NetworkDelivery.Unreliable => PacketFlags.Unsequenced,
|
||||
NetworkDelivery.Reliable => PacketFlags.Reliable, // ENET csharp Does not support ReliableUnsequenced. https://github.com/MidLevel/MLAPI.Transports/pull/5#issuecomment-498311723
|
||||
NetworkDelivery.ReliableSequenced => PacketFlags.Reliable,
|
||||
NetworkDelivery.ReliableFragmentedSequenced => PacketFlags.Reliable,
|
||||
NetworkDelivery.UnreliableSequenced => PacketFlags.None, // unreliable sequenced according to docs here https://github.com/nxrighthere/ENet-CSharp
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(delivery), delivery, null)
|
||||
};
|
||||
}
|
||||
|
||||
public ulong GetMLAPIClientId(uint peerId, bool isServer)
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"name": "LiteNetLib MLAPI Transport",
|
||||
"rootNamespace": "MLAPI.Transports.LiteNetLib",
|
||||
"name": "ENET Transport for Netcode for GameObjects",
|
||||
"rootNamespace": "Netcode.Transports.Enet",
|
||||
"references": [
|
||||
"Unity.Multiplayer.MLAPI.Runtime"
|
||||
"Unity.Netcode.Runtime"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"name": "com.community.netcode.transport.enet",
|
||||
"displayName": "ENET Transport for Netcode for GameObjects",
|
||||
"version": "2.0.0",
|
||||
"unity": "2019.4",
|
||||
"description": "ENET Transport for Netcode for GameObjects",
|
||||
"author": "Albin Corén (transport adapter), Stanislav Denisov (fork and C# wrapper), Lee Salzman (original implementation).",
|
||||
"dependencies": {
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
# Changelog
|
||||
All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
|
||||
## 2.0.0
|
||||
|
||||
### Changed
|
||||
- Targets the Netcode for GameObjects 1.0.0 package.
|
||||
- Renamed namespaces from MLAPI to Netcode.
|
||||
|
||||
### Removed
|
||||
- Removed support for channels.
|
||||
- No longer send 1 byte of channel information in each message.
|
||||
|
||||
## 1.0.0
|
||||
First version of the Facepunch Transport as a Unity package.
|
|
@ -1,4 +1,4 @@
|
|||
# Facepunch Transport for MLAPI
|
||||
# Facepunch Transport for Netcode for GameObjects
|
||||
|
||||
By **Nico Thomas**, **Floris van Onna**<br>
|
||||
Credits to **Garry Newman** (Author of Facepunch.Steamworks)
|
|
@ -1,26 +1,21 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using MLAPI.Logging;
|
||||
using MLAPI.Transports.Tasks;
|
||||
using Steamworks;
|
||||
using Steamworks.Data;
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
namespace MLAPI.Transports.Facepunch
|
||||
namespace Netcode.Transports.Facepunch
|
||||
{
|
||||
using SocketConnection = Steamworks.Data.Connection;
|
||||
using SocketConnection = Connection;
|
||||
|
||||
public class FacepunchTransport : NetworkTransport, IConnectionManager, ISocketManager
|
||||
{
|
||||
private ConnectionManager connectionManager;
|
||||
private SocketManager socketManager;
|
||||
private Dictionary<ulong, Client> connectedClients;
|
||||
private Dictionary<NetworkChannel, SendType> channelSendTypes;
|
||||
|
||||
[SerializeField] private List<TransportChannel> channels = new List<TransportChannel>();
|
||||
|
||||
[Space]
|
||||
[Tooltip("The Steam App ID of your game. Technically you're not allowed to use 480, but Valve doesn't do anything about it so it's fine for testing purposes.")]
|
||||
|
@ -104,25 +99,22 @@ namespace MLAPI.Transports.Facepunch
|
|||
return 0;
|
||||
}
|
||||
|
||||
public override void Init()
|
||||
public override void Initialize()
|
||||
{
|
||||
connectedClients = new Dictionary<ulong, Client>();
|
||||
channelSendTypes = new Dictionary<NetworkChannel, SendType>();
|
||||
}
|
||||
|
||||
foreach (TransportChannel channel in MLAPI_CHANNELS.Concat(channels))
|
||||
private SendType NetworkDeliveryToSendType(NetworkDelivery delivery)
|
||||
{
|
||||
return delivery switch
|
||||
{
|
||||
SendType sendType = channel.Delivery switch
|
||||
{
|
||||
NetworkDelivery.Reliable => SendType.Reliable,
|
||||
NetworkDelivery.ReliableFragmentedSequenced => SendType.Reliable,
|
||||
NetworkDelivery.ReliableSequenced => SendType.Reliable,
|
||||
NetworkDelivery.Unreliable => SendType.Unreliable,
|
||||
NetworkDelivery.UnreliableSequenced => SendType.Unreliable,
|
||||
_ => SendType.Reliable
|
||||
};
|
||||
|
||||
channelSendTypes.Add(channel.Channel, sendType);
|
||||
}
|
||||
NetworkDelivery.Reliable => SendType.Reliable,
|
||||
NetworkDelivery.ReliableFragmentedSequenced => SendType.Reliable,
|
||||
NetworkDelivery.ReliableSequenced => SendType.Reliable,
|
||||
NetworkDelivery.Unreliable => SendType.Unreliable,
|
||||
NetworkDelivery.UnreliableSequenced => SendType.Unreliable,
|
||||
_ => SendType.Reliable
|
||||
};
|
||||
}
|
||||
|
||||
public override void Shutdown()
|
||||
|
@ -142,54 +134,51 @@ namespace MLAPI.Transports.Facepunch
|
|||
}
|
||||
}
|
||||
|
||||
public override unsafe void Send(ulong clientId, ArraySegment<byte> data, NetworkChannel networkChannel)
|
||||
public override unsafe void Send(ulong clientId, ArraySegment<byte> data, NetworkDelivery delivery)
|
||||
{
|
||||
if (!channelSendTypes.TryGetValue(networkChannel, out SendType sendType))
|
||||
if (!channelSendTypes.TryGetValue(NetworkChannel.DefaultMessage, out sendType))
|
||||
sendType = SendType.Reliable;
|
||||
var sendType = NetworkDeliveryToSendType(delivery);
|
||||
|
||||
byte* buffer = stackalloc byte[data.Count + 1];
|
||||
byte* buffer = stackalloc byte[data.Count];
|
||||
fixed (byte* pointer = data.Array)
|
||||
Buffer.MemoryCopy(pointer + data.Offset, buffer, data.Count, data.Count);
|
||||
buffer[data.Count] = (byte)networkChannel;
|
||||
|
||||
if (clientId == ServerClientId)
|
||||
connectionManager.Connection.SendMessage((IntPtr)buffer, data.Count + 1, sendType);
|
||||
connectionManager.Connection.SendMessage((IntPtr)buffer, data.Count , sendType);
|
||||
else if (connectedClients.TryGetValue(clientId, out Client user))
|
||||
user.connection.SendMessage((IntPtr)buffer, data.Count + 1, sendType);
|
||||
user.connection.SendMessage((IntPtr)buffer, data.Count, sendType);
|
||||
else if (LogLevel <= LogLevel.Normal)
|
||||
Debug.LogWarning($"[{nameof(FacepunchTransport)}] - Failed to send packet to remote client with ID {clientId}, client not connected.");
|
||||
}
|
||||
|
||||
public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment<byte> payload, out float receiveTime)
|
||||
public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment<byte> payload, out float receiveTime)
|
||||
{
|
||||
connectionManager?.Receive();
|
||||
socketManager?.Receive();
|
||||
|
||||
clientId = 0;
|
||||
networkChannel = default;
|
||||
receiveTime = Time.realtimeSinceStartup;
|
||||
payload = default;
|
||||
return NetworkEvent.Nothing;
|
||||
}
|
||||
|
||||
public override SocketTasks StartClient()
|
||||
public override bool StartClient()
|
||||
{
|
||||
if (LogLevel <= LogLevel.Developer)
|
||||
Debug.Log($"[{nameof(FacepunchTransport)}] - Starting as client.");
|
||||
|
||||
connectionManager = SteamNetworkingSockets.ConnectRelay<ConnectionManager>(targetSteamId);
|
||||
connectionManager.Interface = this;
|
||||
return SocketTask.Working.AsTasks();
|
||||
return true;
|
||||
}
|
||||
|
||||
public override SocketTasks StartServer()
|
||||
public override bool StartServer()
|
||||
{
|
||||
if (LogLevel <= LogLevel.Developer)
|
||||
Debug.Log($"[{nameof(FacepunchTransport)}] - Starting as server.");
|
||||
|
||||
socketManager = SteamNetworkingSockets.CreateRelaySocket<SocketManager>();
|
||||
socketManager.Interface = this;
|
||||
return SocketTask.Done.AsTasks();
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -204,7 +193,7 @@ namespace MLAPI.Transports.Facepunch
|
|||
|
||||
void IConnectionManager.OnConnected(ConnectionInfo info)
|
||||
{
|
||||
InvokeOnTransportEvent(NetworkEvent.Connect, ServerClientId, NetworkChannel.ChannelUnused, default, Time.realtimeSinceStartup);
|
||||
InvokeOnTransportEvent(NetworkEvent.Connect, ServerClientId, default, Time.realtimeSinceStartup);
|
||||
|
||||
if (LogLevel <= LogLevel.Developer)
|
||||
Debug.Log($"[{nameof(FacepunchTransport)}] - Connected with Steam user {info.Identity.SteamId}.");
|
||||
|
@ -212,7 +201,7 @@ namespace MLAPI.Transports.Facepunch
|
|||
|
||||
void IConnectionManager.OnDisconnected(ConnectionInfo info)
|
||||
{
|
||||
InvokeOnTransportEvent(NetworkEvent.Disconnect, ServerClientId, NetworkChannel.ChannelUnused, default, Time.realtimeSinceStartup);
|
||||
InvokeOnTransportEvent(NetworkEvent.Disconnect, ServerClientId, default, Time.realtimeSinceStartup);
|
||||
|
||||
if (LogLevel <= LogLevel.Developer)
|
||||
Debug.Log($"[{nameof(FacepunchTransport)}] - Disconnected Steam user {info.Identity.SteamId}.");
|
||||
|
@ -222,7 +211,7 @@ namespace MLAPI.Transports.Facepunch
|
|||
{
|
||||
byte[] payload = new byte[size];
|
||||
Marshal.Copy(data, payload, 0, size);
|
||||
InvokeOnTransportEvent(NetworkEvent.Data, ServerClientId, (NetworkChannel)payload[size - 1], new ArraySegment<byte>(payload, 0, size - 1), Time.realtimeSinceStartup);
|
||||
InvokeOnTransportEvent(NetworkEvent.Data, ServerClientId, new ArraySegment<byte>(payload, 0, size - 1), Time.realtimeSinceStartup);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -247,7 +236,7 @@ namespace MLAPI.Transports.Facepunch
|
|||
steamId = info.Identity.SteamId
|
||||
});
|
||||
|
||||
InvokeOnTransportEvent(NetworkEvent.Connect, connection.Id, NetworkChannel.ChannelUnused, default, Time.realtimeSinceStartup);
|
||||
InvokeOnTransportEvent(NetworkEvent.Connect, connection.Id, default, Time.realtimeSinceStartup);
|
||||
|
||||
if (LogLevel <= LogLevel.Developer)
|
||||
Debug.Log($"[{nameof(FacepunchTransport)}] - Connected with Steam user {info.Identity.SteamId}.");
|
||||
|
@ -260,7 +249,7 @@ namespace MLAPI.Transports.Facepunch
|
|||
{
|
||||
connectedClients.Remove(connection.Id);
|
||||
|
||||
InvokeOnTransportEvent(NetworkEvent.Disconnect, connection.Id, NetworkChannel.ChannelUnused, default, Time.realtimeSinceStartup);
|
||||
InvokeOnTransportEvent(NetworkEvent.Disconnect, connection.Id, default, Time.realtimeSinceStartup);
|
||||
|
||||
if (LogLevel <= LogLevel.Developer)
|
||||
Debug.Log($"[{nameof(FacepunchTransport)}] - Disconnected Steam user {info.Identity.SteamId}");
|
||||
|
@ -270,7 +259,7 @@ namespace MLAPI.Transports.Facepunch
|
|||
{
|
||||
byte[] payload = new byte[size];
|
||||
Marshal.Copy(data, payload, 0, size);
|
||||
InvokeOnTransportEvent(NetworkEvent.Data, connection.Id, (NetworkChannel)payload[size - 1], new ArraySegment<byte>(payload, 0, size - 1), Time.realtimeSinceStartup);
|
||||
InvokeOnTransportEvent(NetworkEvent.Data, connection.Id, new ArraySegment<byte>(payload, 0, size), Time.realtimeSinceStartup);
|
||||
}
|
||||
|
||||
#endregion
|
|
@ -3,7 +3,7 @@ using UnityEngine;
|
|||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace MLAPI.Transports.Facepunch
|
||||
namespace Netcode.Transports.Facepunch
|
||||
{
|
||||
public class ReadOnlyAttribute : PropertyAttribute { }
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"name": "Facepunch MLAPI Transport",
|
||||
"rootNamespace": "MLAPI.Transports.Facepunch",
|
||||
"name": "Facepunch Transport for Netcode for GameObjects",
|
||||
"rootNamespace": "Netcode.Transports.Facepunch",
|
||||
"references": [
|
||||
"Unity.Multiplayer.MLAPI.Runtime"
|
||||
"Unity.Netcode.Runtime"
|
||||
],
|
||||
"includePlatforms": [
|
||||
"Editor",
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"name": "com.community.netcode.transport.facepunch",
|
||||
"displayName": "Facepunch Transport for Netcode for GameObjects",
|
||||
"version": "2.0.0",
|
||||
"unity": "2019.4",
|
||||
"description": "Facepunch Transport for Netcode for GameObjects",
|
||||
"author": "Nico Thomas (Transport Adapter), Floris van Onna (Transport Adapter), Garry Newman (Author of Facepunch.Steamworks)",
|
||||
"dependencies": {
|
||||
"com.unity.netcode.gameobjects": "0.2.0-preview.1"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
# Changelog
|
||||
All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
|
||||
## 2.0.0
|
||||
|
||||
### Changed
|
||||
- Targets the Netcode for GameObjects 1.0.0 package.
|
||||
- Renamed namespaces from MLAPI to Netcode.
|
||||
|
||||
### Removed
|
||||
- Removed support for channels.
|
||||
|
||||
## 1.0.0
|
||||
First version of the LiteNetLib transport as a Unity package.
|
|
@ -0,0 +1 @@
|
|||
LiteNetLib Transport for Netocde for GameObjects.
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче