Pellet sync
This commit is contained in:
@@ -1,12 +1,14 @@
|
||||
using UdonSharp;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Marro.PacManUdon
|
||||
{
|
||||
public class PelletManager : SyncedObject
|
||||
{
|
||||
public int PelletCount => pellets.Length;
|
||||
public int PelletCollectedCount { get; private set; }
|
||||
|
||||
Pellet[] pellets;
|
||||
Renderer[] pelletRenderers;
|
||||
Animator[] powerPellets;
|
||||
|
||||
bool powerPelletBlinkEnabled;
|
||||
@@ -14,20 +16,18 @@ namespace Marro.PacManUdon
|
||||
float powerPelletBlinkProgress;
|
||||
bool powerPelletBlinkCurrentlyVisible;
|
||||
|
||||
byte[] syncedPelletsCollected;
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
gameObject.SetActive(true);
|
||||
pellets = GetComponentsInChildren<Pellet>(includeInactive: true);
|
||||
|
||||
pelletRenderers = new Renderer[pellets.Length];
|
||||
for (int i = 0; i < pelletRenderers.Length; i++)
|
||||
{
|
||||
pelletRenderers[i] = pellets[i].GetComponent<Renderer>();
|
||||
}
|
||||
|
||||
powerPellets = GetComponentsInChildren<Animator>(true);
|
||||
powerPelletBlinkToggleInterval = PacManConstants.GetPowerPelletBlinkToggleInterval();
|
||||
SetPowerPelletsBlink(false);
|
||||
|
||||
RestoreAllPellets();
|
||||
}
|
||||
|
||||
public override void SyncedUpdate()
|
||||
@@ -71,29 +71,63 @@ namespace Marro.PacManUdon
|
||||
powerPelletBlinkEnabled = !frozen;
|
||||
}
|
||||
|
||||
public void RestoreAllPellets()
|
||||
public int PelletCollected(Pellet pellet)
|
||||
{
|
||||
pellet.gameObject.SetActive(false);
|
||||
|
||||
var index = pellet.transform.GetSiblingIndex();
|
||||
syncedPelletsCollected[index/8] |= (byte)(1 << index%8);
|
||||
|
||||
PelletCollectedCount++;
|
||||
|
||||
return PelletCollectedCount;
|
||||
}
|
||||
|
||||
public int RestoreAllPellets()
|
||||
{
|
||||
foreach (var pellet in pellets)
|
||||
{
|
||||
pellet.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
foreach (Renderer pelletRenderer in pelletRenderers)
|
||||
syncedPelletsCollected = new byte[pellets.Length/8 + 1];
|
||||
PelletCollectedCount = 0;
|
||||
|
||||
return PelletCount;
|
||||
}
|
||||
|
||||
private void SetPelletsCollectedFromSync()
|
||||
{
|
||||
for (int i = 0; i < pellets.Length; i++)
|
||||
{
|
||||
pelletRenderer.enabled = true;
|
||||
var active = (syncedPelletsCollected[i/8] & (byte)(1 << i%8)) == 0;
|
||||
pellets[i].gameObject.SetActive(active);
|
||||
}
|
||||
}
|
||||
|
||||
public override void CollectSyncedData(byte[] data, ref int index, NetworkEventType eventType)
|
||||
{
|
||||
if (eventType != NetworkEventType.SyncPellets)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
data.Append((byte)PelletCollectedCount, ref index);
|
||||
data.Append(syncedPelletsCollected, ref index);
|
||||
}
|
||||
|
||||
public override bool WriteSyncedData(byte[] data, ref int index, NetworkEventType eventType)
|
||||
{
|
||||
if (eventType != NetworkEventType.SyncPellets)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
PelletCollectedCount = data.ReadByte(ref index);
|
||||
Array.Copy(data, index, syncedPelletsCollected, 0, syncedPelletsCollected.Length);
|
||||
index += syncedPelletsCollected.Length;
|
||||
SetPelletsCollectedFromSync();
|
||||
return true;
|
||||
}
|
||||
|
||||
public int PelletCount => pellets.Length;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user