Netcode Bootstrap
This commit is contained in:
+84
@@ -0,0 +1,84 @@
|
||||
#if RUKHANKA_WITH_NETCODE
|
||||
|
||||
using Unity.Collections;
|
||||
using Unity.Entities;
|
||||
using Unity.NetCode;
|
||||
using Unity.Burst;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Rukhanka.Samples
|
||||
{
|
||||
|
||||
public struct GoInGameRequest : IRpcCommand {}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
[BurstCompile]
|
||||
[WorldSystemFilter(WorldSystemFilterFlags.ClientSimulation | WorldSystemFilterFlags.ThinClientSimulation)]
|
||||
public partial struct GoInGameClientSystem : ISystem
|
||||
{
|
||||
[BurstCompile]
|
||||
public void OnCreate(ref SystemState state)
|
||||
{
|
||||
var builder = new EntityQueryBuilder(Allocator.Temp)
|
||||
.WithAll<NetworkId>()
|
||||
.WithNone<NetworkStreamInGame>();
|
||||
state.RequireForUpdate(state.GetEntityQuery(builder));
|
||||
}
|
||||
|
||||
[BurstCompile]
|
||||
public void OnUpdate(ref SystemState state)
|
||||
{
|
||||
var commandBuffer = new EntityCommandBuffer(Allocator.Temp);
|
||||
foreach (var (id, entity) in SystemAPI.Query<RefRO<NetworkId>>().WithEntityAccess().WithNone<NetworkStreamInGame>())
|
||||
{
|
||||
commandBuffer.AddComponent<NetworkStreamInGame>(entity);
|
||||
var req = commandBuffer.CreateEntity();
|
||||
commandBuffer.AddComponent<GoInGameRequest>(req);
|
||||
commandBuffer.AddComponent(req, new SendRpcCommandRequest { TargetConnection = entity });
|
||||
}
|
||||
commandBuffer.Playback(state.EntityManager);
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
[BurstCompile]
|
||||
[WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)]
|
||||
public partial struct GoInGameServerSystem : ISystem
|
||||
{
|
||||
private ComponentLookup<NetworkId> networkIdFromEntity;
|
||||
|
||||
[BurstCompile]
|
||||
public void OnCreate(ref SystemState state)
|
||||
{
|
||||
var builder = new EntityQueryBuilder(Allocator.Temp)
|
||||
.WithAll<GoInGameRequest>()
|
||||
.WithAll<ReceiveRpcCommandRequest>();
|
||||
state.RequireForUpdate(state.GetEntityQuery(builder));
|
||||
networkIdFromEntity = state.GetComponentLookup<NetworkId>(true);
|
||||
}
|
||||
|
||||
[BurstCompile]
|
||||
public void OnUpdate(ref SystemState state)
|
||||
{
|
||||
var worldName = state.WorldUnmanaged.Name;
|
||||
var commandBuffer = new EntityCommandBuffer(Allocator.Temp);
|
||||
networkIdFromEntity.Update(ref state);
|
||||
|
||||
foreach (var (reqSrc, reqEntity) in SystemAPI.Query<RefRO<ReceiveRpcCommandRequest>>().WithAll<GoInGameRequest>().WithEntityAccess())
|
||||
{
|
||||
commandBuffer.AddComponent<NetworkStreamInGame>(reqSrc.ValueRO.SourceConnection);
|
||||
var networkId = networkIdFromEntity[reqSrc.ValueRO.SourceConnection];
|
||||
|
||||
Debug.Log($"'{worldName}' setting connection '{networkId.Value}' to in game");
|
||||
|
||||
commandBuffer.DestroyEntity(reqEntity);
|
||||
}
|
||||
|
||||
commandBuffer.Playback(state.EntityManager);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user