Simplified PacMan state

This commit is contained in:
2026-06-22 14:52:53 +02:00
parent ca116ac77f
commit 99556b81b1
4 changed files with 103 additions and 60 deletions

View File

@@ -12,29 +12,40 @@ namespace Marro.PacManUdon
Dead,
}
enum PacManState
{
Idle,
Normal,
PowerPellet,
Dead,
Big,
}
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(Renderer))]
public class PacMan : GridMover
{
private PlayerInput input;
private CollisionManager collisionManager;
private Animator animator;
private new Renderer renderer;
private Vector2 startPosition;
private float defaultSpeed;
private float powerPelletSpeed;
private PacManState state;
private float speed;
private Vector2 startPosition;
private Animator animator;
new Renderer renderer;
private bool hideUntilUnfrozen;
private bool dead;
private float freezeSeconds;
private bool frozen;
private bool kinematic;
private bool followingPredefinedPath;
private Direction[] predefinedPath;
private int predefinedPathIndex;
private float freezeSeconds;
private bool frozen;
private readonly int animatorKeyState = Animator.StringToHash("State");
private readonly int animatorKeyDirection = Animator.StringToHash("Direction");
@@ -45,7 +56,6 @@ namespace Marro.PacManUdon
animator = GetComponent<Animator>();
renderer = GetComponent<Renderer>();
frozen = false;
hideUntilUnfrozen = false;
startPosition = startTransform.localPosition;
}
@@ -54,13 +64,13 @@ namespace Marro.PacManUdon
SetPosition(startPosition);
direction = Direction.Left;
targetDirection = Direction.Left;
speed = defaultSpeed;
kinematic = false;
followingPredefinedPath = false;
SetDead(false);
state = PacManState.Idle;
SetAnimatorState((int)PacManAnimatorState.Idle);
UpdateSpeed();
UpdateAnimator();
}
public override void SyncedUpdate()
@@ -72,12 +82,6 @@ namespace Marro.PacManUdon
return;
}
if (hideUntilUnfrozen)
{
hideUntilUnfrozen = false;
SetVisibility(true);
}
float speed = this.speed;
if (freezeSeconds > 0)
{
@@ -220,11 +224,19 @@ namespace Marro.PacManUdon
if (!gameObject.activeInHierarchy)
return;
if (dead)
switch (state)
{
SetAnimatorState((int)PacManAnimatorState.Dead);
animator.speed = 1;
return;
case PacManState.Dead:
SetAnimatorState((int)PacManAnimatorState.Dead);
animator.speed = 1;
return;
case PacManState.Idle:
SetAnimatorState((int)PacManAnimatorState.Idle);
return;
case PacManState.Big:
SetAnimatorState((int)PacManAnimatorState.Big);
animator.speed = 1;
return;
}
animator.speed = frozen ? 0 : 1;
@@ -251,22 +263,22 @@ namespace Marro.PacManUdon
private void SetAnimatorState(int value) =>
animator.SetFloat(animatorKeyState, value);
public void SetDead(bool dead)
public void Die()
{
this.dead = dead;
state = PacManState.Dead;
UpdateAnimator();
}
public void SetFrozen(bool frozen)
{
this.frozen = frozen;
UpdateAnimator();
}
public void HideUntilUnfrozen()
{
hideUntilUnfrozen = true;
SetVisibility(false);
if (!frozen && state == PacManState.Idle)
{
state = PacManState.Normal;
}
UpdateAnimator();
}
public void SetLevel(int level)
@@ -278,7 +290,13 @@ namespace Marro.PacManUdon
public void SetPowerPellet(bool powerPellet)
{
if (powerPellet)
state = powerPellet ? PacManState.PowerPellet : PacManState.Normal;
UpdateSpeed();
}
private void UpdateSpeed()
{
if (state == PacManState.PowerPellet)
{
speed = powerPelletSpeed;
}
@@ -312,12 +330,32 @@ namespace Marro.PacManUdon
public void BecomeBig()
{
SetAnimatorState((int)PacManAnimatorState.Big);
state = PacManState.Big;
UpdateAnimator();
}
void SetVisibility(bool visible)
public void SetVisibility(bool visible)
{
renderer.enabled = visible;
}
public override void CollectSyncedData(byte[] data, ref int index, NetworkEventType eventType)
{
data.AppendAsByte((int)state, ref index);
data.Append(freezeSeconds, ref index);
data.Append(frozen, ref index);
base.CollectSyncedData(data, ref index, eventType);
}
public override bool WriteSyncedData(byte[] data, ref int index, NetworkEventType eventType)
{
state = (PacManState)data.ReadByte(ref index);
freezeSeconds = data.ReadFloat(ref index);
frozen = data.ReadBool(ref index);
UpdateSpeed();
return base.WriteSyncedData(data, ref index, eventType);
}
}
}