Ready for PacMan??
This commit is contained in:
@@ -9700,7 +9700,6 @@ Transform:
|
|||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 963448677}
|
- {fileID: 963448677}
|
||||||
- {fileID: 1381489908}
|
|
||||||
m_Father: {fileID: 1886023632}
|
m_Father: {fileID: 1886023632}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1001 &300095180
|
--- !u!1001 &300095180
|
||||||
@@ -22129,6 +22128,7 @@ Transform:
|
|||||||
- {fileID: 1334822256}
|
- {fileID: 1334822256}
|
||||||
- {fileID: 1683006206}
|
- {fileID: 1683006206}
|
||||||
- {fileID: 2841572}
|
- {fileID: 2841572}
|
||||||
|
- {fileID: 1381489908}
|
||||||
m_Father: {fileID: 1886023632}
|
m_Father: {fileID: 1886023632}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!4 &712932630 stripped
|
--- !u!4 &712932630 stripped
|
||||||
@@ -25358,6 +25358,9 @@ MonoBehaviour:
|
|||||||
- {fileID: 1910438138}
|
- {fileID: 1910438138}
|
||||||
- {fileID: 1407423087}
|
- {fileID: 1407423087}
|
||||||
- {fileID: 1541737191}
|
- {fileID: 1541737191}
|
||||||
|
delay: 1
|
||||||
|
maxEventSendTries: 3
|
||||||
|
pingDelay: 0.3
|
||||||
DebugImageToIndicateOwner: {fileID: 0}
|
DebugImageToIndicateOwner: {fileID: 0}
|
||||||
--- !u!1 &817541382 stripped
|
--- !u!1 &817541382 stripped
|
||||||
GameObject:
|
GameObject:
|
||||||
@@ -37775,6 +37778,9 @@ MonoBehaviour:
|
|||||||
- {fileID: 1156754006}
|
- {fileID: 1156754006}
|
||||||
- {fileID: 527776391}
|
- {fileID: 527776391}
|
||||||
- {fileID: 357748371}
|
- {fileID: 357748371}
|
||||||
|
delay: 1
|
||||||
|
maxEventSendTries: 3
|
||||||
|
pingDelay: 0.3
|
||||||
DebugImageToIndicateOwner: {fileID: 1745114900}
|
DebugImageToIndicateOwner: {fileID: 1745114900}
|
||||||
--- !u!1 &1203813879
|
--- !u!1 &1203813879
|
||||||
GameObject:
|
GameObject:
|
||||||
@@ -42971,12 +42977,12 @@ Transform:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 1381489907}
|
m_GameObject: {fileID: 1381489907}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
m_LocalPosition: {x: 4.266148, y: 14.909718, z: -30.038902}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 297676220}
|
m_Father: {fileID: 712073434}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1001 &1381602940
|
--- !u!1001 &1381602940
|
||||||
PrefabInstance:
|
PrefabInstance:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -40,9 +40,28 @@ namespace Marro.PacManUdon
|
|||||||
// [7]: (byte) Type of event. 0 = Full Sync, which is used to sync up from an undefinted state.
|
// [7]: (byte) Type of event. 0 = Full Sync, which is used to sync up from an undefinted state.
|
||||||
// [+]: Event-specific data.
|
// [+]: Event-specific data.
|
||||||
|
|
||||||
|
#region Settings
|
||||||
|
/// <summary>
|
||||||
|
/// Objects which are controlled by this <see cref="NetworkManager"/>.
|
||||||
|
/// </summary>
|
||||||
|
[SerializeField] private SyncedObject[] syncedObjects;
|
||||||
|
/// <summary>
|
||||||
|
/// The delay at which the receiving side replays events.
|
||||||
|
/// </summary>
|
||||||
|
[SerializeField] private float delay = 1f;
|
||||||
|
/// <summary>
|
||||||
|
/// The maximum amount of times a message is sent.
|
||||||
|
/// </summary>
|
||||||
|
[SerializeField] private int maxEventSendTries = 3;
|
||||||
|
/// <summary>
|
||||||
|
/// How long to wait since last message to send next ping.
|
||||||
|
/// </summary>
|
||||||
|
[SerializeField] private float pingDelay = 0.3f;
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Constants
|
#region Constants
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The maximum size of the buffer in bytes.
|
/// The maximum amount of events in the buffer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const int BufferMaxTotalEvents = 255;
|
private const int BufferMaxTotalEvents = 255;
|
||||||
|
|
||||||
@@ -66,23 +85,9 @@ namespace Marro.PacManUdon
|
|||||||
/// The total length of the header of an event, in bytes.
|
/// The total length of the header of an event, in bytes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const ushort HeaderLength = 8;
|
private const ushort HeaderLength = 8;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The delay at which the receiving side replays events.
|
|
||||||
/// </summary>
|
|
||||||
private const float Delay = 1f;
|
|
||||||
/// <summary>
|
|
||||||
/// The maximum amount of times a message is sent
|
|
||||||
/// </summary>
|
|
||||||
private const int MaxEventSendTries = 3;
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Private attributes
|
#region Private attributes
|
||||||
/// <summary>
|
|
||||||
/// Objects which are controlled by this <see cref="NetworkManager"/>.
|
|
||||||
/// </summary>
|
|
||||||
[SerializeField] private SyncedObject[] syncedObjects;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Offset from system time to network time, including delay.
|
/// Offset from system time to network time, including delay.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -113,7 +118,7 @@ namespace Marro.PacManUdon
|
|||||||
private bool serializationRequested;
|
private bool serializationRequested;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Queue of events to be transmitted or processed
|
/// Queue of events to be transmitted or processed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private byte[][] eventsQueue;
|
private byte[][] eventsQueue;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -122,23 +127,29 @@ namespace Marro.PacManUdon
|
|||||||
private int eventsQueueIndex;
|
private int eventsQueueIndex;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The value of <see cref="eventsQueueIndex"/> at the last transmission
|
/// The value of <see cref="eventsQueueIndex"/> at the last transmission.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private int eventsQueueIndexAtLastTransmission;
|
private int eventsQueueIndexAtLastTransmission;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Counts of new events at recent transmissions
|
/// Counts of new events at recent transmissions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private int[] eventTransmissionHistory;
|
private int[] eventTransmissionHistory;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Index of <see cref="eventTransmissionHistoryIndex"/>
|
/// Index of <see cref="eventTransmissionHistoryIndex"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private int eventTransmissionHistoryIndex;
|
private int eventTransmissionHistoryIndex;
|
||||||
|
/// <summary>
|
||||||
|
/// Time of last event transmission.
|
||||||
|
/// </summary>
|
||||||
|
private float lastEventTransmissionTime;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The message id of the most recent event created or received.
|
/// The message id of the most recent event created or received.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private byte lastEventId;
|
private byte lastEventId;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Data which is currently available on the network.
|
/// Data which is currently available on the network.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -218,10 +229,16 @@ namespace Marro.PacManUdon
|
|||||||
// Fetch the current time
|
// Fetch the current time
|
||||||
UpdateInternalTime();
|
UpdateInternalTime();
|
||||||
|
|
||||||
// If able and needed, process received events
|
if (Ready)
|
||||||
if (Ready && !IsOwner)
|
|
||||||
{
|
{
|
||||||
ProgressEventTime();
|
if (IsOwner)
|
||||||
|
{
|
||||||
|
ProgressPingTime(); // See if we need to send a ping
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ProgressEventTime(); // See if there's events that need to be replayed
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Forwards simulated time at the FixedUpdate pace
|
// Forwards simulated time at the FixedUpdate pace
|
||||||
@@ -386,6 +403,15 @@ namespace Marro.PacManUdon
|
|||||||
SendEvent(eventType);
|
SendEvent(eventType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ProgressPingTime()
|
||||||
|
{
|
||||||
|
if (eventsQueueIndex > 0
|
||||||
|
&& internalTime - lastEventTransmissionTime >= pingDelay)
|
||||||
|
{
|
||||||
|
RequestSerializationForEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void OnPreSerialization()
|
public override void OnPreSerialization()
|
||||||
{
|
{
|
||||||
if (!Ready || !IsOwner || !serializationRequested || eventsQueue == null || eventsQueueIndex == 0)
|
if (!Ready || !IsOwner || !serializationRequested || eventsQueue == null || eventsQueueIndex == 0)
|
||||||
@@ -431,6 +457,8 @@ namespace Marro.PacManUdon
|
|||||||
|
|
||||||
// If there was a full sync in the queue, it has now been transmitted at least once
|
// If there was a full sync in the queue, it has now been transmitted at least once
|
||||||
hasFullSyncReady = false;
|
hasFullSyncReady = false;
|
||||||
|
|
||||||
|
lastEventTransmissionTime = internalTime;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -492,16 +520,18 @@ namespace Marro.PacManUdon
|
|||||||
|
|
||||||
var timestamp = GetTimestampFromHeader(@event);
|
var timestamp = GetTimestampFromHeader(@event);
|
||||||
var eventId = GetEventIdFromHeader(@event);
|
var eventId = GetEventIdFromHeader(@event);
|
||||||
|
var eventType = GetEventTypeFromHeader(@event);
|
||||||
|
|
||||||
if (Synced || hasFullSyncReady)
|
if (eventType != NetworkEventType.FullSyncForced && (Synced || hasFullSyncReady))
|
||||||
{
|
{
|
||||||
|
// Check if event id is sequential
|
||||||
if (eventId != GetNextEventId(lastEventId))
|
if (eventId != GetNextEventId(lastEventId))
|
||||||
{
|
{
|
||||||
if (index + eventSize >= length // If this is the last event of the batch
|
if (index + eventSize >= length // If this is the last event of the batch
|
||||||
&& eventId != lastEventId) // Unless the eventId is the same, then this is probably just a duplicate
|
&& eventId != lastEventId) // Unless the eventId is the same, then this is probably just a duplicate
|
||||||
{
|
{
|
||||||
// The last event of the batch has to be synced up with our current event id count, else we've missed an event
|
// The last event of the batch has to be synced up with our current event id count, else we've missed an event
|
||||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) EventIds were not sequential! Did we miss a serialization? Timestamp: {timestamp}, eventId: {eventId}, lastEventId: {lastEventId}.");
|
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) EventIds were not sequential! Did we miss an event? Timestamp: {timestamp}, eventId: {eventId}, lastEventId: {lastEventId}.");
|
||||||
HandleError(false);
|
HandleError(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -517,7 +547,7 @@ namespace Marro.PacManUdon
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If we're not yet synced, we only care about full sync events.
|
// If we're not yet synced, we only care about full sync events.
|
||||||
if (IsFullSync(GetEventTypeFromHeader(@event)))
|
if (IsFullSync(eventType))
|
||||||
{
|
{
|
||||||
QueueFullSyncForReplay(@event); // Immediately process full sync
|
QueueFullSyncForReplay(@event); // Immediately process full sync
|
||||||
}
|
}
|
||||||
@@ -539,7 +569,7 @@ namespace Marro.PacManUdon
|
|||||||
QueueEventInBuffer(@event);
|
QueueEventInBuffer(@event);
|
||||||
|
|
||||||
// Set this event to play after the default delay
|
// Set this event to play after the default delay
|
||||||
nextEventTime = internalTime + Delay;
|
nextEventTime = internalTime + delay;
|
||||||
|
|
||||||
hasFullSyncReady = true;
|
hasFullSyncReady = true;
|
||||||
|
|
||||||
@@ -634,7 +664,7 @@ namespace Marro.PacManUdon
|
|||||||
{
|
{
|
||||||
eventsQueue = new byte[BufferMaxTotalEvents][];
|
eventsQueue = new byte[BufferMaxTotalEvents][];
|
||||||
eventsQueueIndex = 0;
|
eventsQueueIndex = 0;
|
||||||
eventTransmissionHistory = new int[MaxEventSendTries];
|
eventTransmissionHistory = new int[maxEventSendTries];
|
||||||
eventTransmissionHistoryIndex = 0;
|
eventTransmissionHistoryIndex = 0;
|
||||||
eventsQueueIndexAtLastTransmission = 0;
|
eventsQueueIndexAtLastTransmission = 0;
|
||||||
lastEventId = 0;
|
lastEventId = 0;
|
||||||
@@ -702,16 +732,22 @@ namespace Marro.PacManUdon
|
|||||||
}
|
}
|
||||||
|
|
||||||
var nextEventTime = GetTimestampFromHeader(eventsQueue[0]);
|
var nextEventTime = GetTimestampFromHeader(eventsQueue[0]);
|
||||||
if (nextEventTime >= this.nextEventTime)
|
|
||||||
{
|
if (nextEventTime < this.nextEventTime)
|
||||||
this.nextEventTime = nextEventTime;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) New event is earlier than previous event!");
|
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) New event is earlier than previous event!");
|
||||||
HandleError(true);
|
HandleError(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nextEventTime < SyncedTime)
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) New event timestamp is earlier than our current synced time by {SyncedTime - nextEventTime} seconds! nextEventTime: {nextEventTime} SyncedTime: {SyncedTime}, internalTime: {internalTime}");
|
||||||
|
HandleError(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.nextEventTime = nextEventTime;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -752,7 +788,13 @@ namespace Marro.PacManUdon
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetOwner(newOwner == Networking.LocalPlayer);
|
bool newOwnerIsLocalPlayer = newOwner == Networking.LocalPlayer;
|
||||||
|
SetOwner(newOwnerIsLocalPlayer);
|
||||||
|
|
||||||
|
if (newOwnerIsLocalPlayer)
|
||||||
|
{
|
||||||
|
SendEvent(NetworkEventType.FullSyncForced);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user