Timer Bug and Plaform Bug Fixed

dev-ali
Ali Sharoz 2 weeks ago
parent cb9ca2c494
commit bbfa85343b

@ -773,6 +773,10 @@ PrefabInstance:
serializedVersion: 3 serializedVersion: 3
m_TransformParent: {fileID: 0} m_TransformParent: {fileID: 0}
m_Modifications: m_Modifications:
- target: {fileID: 109254, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 132536, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} - target: {fileID: 132536, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_Name propertyPath: m_Name
value: IngameDebugConsole value: IngameDebugConsole
@ -797,6 +801,10 @@ PrefabInstance:
propertyPath: m_AnchorMax.y propertyPath: m_AnchorMax.y
value: 0 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} - target: {fileID: 22428984, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchorMax.y propertyPath: m_AnchorMax.y
value: 0 value: 0
@ -9662,11 +9670,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
value: 0.28987613 value: 0.28987607
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: -0.18152039 value: -0.18152031
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516302391364, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516302391364, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_UpdateMethod propertyPath: m_UpdateMethod
@ -9694,19 +9702,19 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.w propertyPath: m_LocalRotation.w
value: 0.7900695 value: 0.79006946
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.x propertyPath: m_LocalRotation.x
value: 0.5087362 value: 0.50873625
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
value: 0.2875617 value: 0.2875618
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: -0.18516475 value: -0.18516485
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
@ -9718,7 +9726,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.w propertyPath: m_LocalRotation.w
value: 0.8027669 value: 0.80276686
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.x propertyPath: m_LocalRotation.x
@ -9726,11 +9734,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
value: 0.29218328 value: 0.2921833
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: -0.17778282 value: -0.17778286
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516866984540, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516866984540, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_VerticalDamping propertyPath: m_VerticalDamping
@ -9959,19 +9967,19 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalRotation.w propertyPath: m_LocalRotation.w
value: 0.7900696 value: 0.79006934
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalRotation.x propertyPath: m_LocalRotation.x
value: 0.50873613 value: 0.5087363
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
value: 0.2875617 value: 0.28756183
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: -0.18516473 value: -0.18516491
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalEulerAnglesHint.x propertyPath: m_LocalEulerAnglesHint.x
@ -15032,8 +15040,8 @@ Transform:
m_GameObject: {fileID: 260583547567553435} m_GameObject: {fileID: 260583547567553435}
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: 27.65, y: 0.52599907, z: -7.859985} m_LocalPosition: {x: 32.92, y: 0.53, z: -7.650648}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -58498,8 +58506,8 @@ Transform:
m_GameObject: {fileID: 1304717044120688010} m_GameObject: {fileID: 1304717044120688010}
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: 27.65, y: 0.52599907, z: 12.390014} m_LocalPosition: {x: 32.65, y: 0.52599907, z: 12.390014}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -70567,7 +70575,7 @@ Transform:
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: -0, y: -0.70710677, z: -0, w: 0.7071068} m_LocalRotation: {x: -0, y: -0.70710677, z: -0, w: 0.7071068}
m_LocalPosition: {x: 22.75, y: -19.25, z: -336.5} m_LocalPosition: {x: 22.75, y: -19.25, z: -336.5}
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:
- {fileID: 1960577389555045427} - {fileID: 1960577389555045427}
@ -72444,8 +72452,8 @@ Transform:
m_GameObject: {fileID: 2121072211875613479} m_GameObject: {fileID: 2121072211875613479}
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: 32.65, y: 0.52599907, z: -7.859985} m_LocalPosition: {x: 37.65, y: 0.52599907, z: -7.859985}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -160806,8 +160814,8 @@ Transform:
m_GameObject: {fileID: 5052075383141419431} m_GameObject: {fileID: 5052075383141419431}
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: 37.65, y: 0.52599907, z: -2.8599854} m_LocalPosition: {x: 42.65, y: 0.52599907, z: -2.8599854}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -227311,8 +227319,8 @@ Transform:
m_GameObject: {fileID: 7499118337776080084} m_GameObject: {fileID: 7499118337776080084}
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: 32.65, y: 0.52599907, z: 7.3900146} m_LocalPosition: {x: 37.65, y: 0.52599907, z: 7.3900146}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -228360,8 +228368,8 @@ Transform:
m_GameObject: {fileID: 7590670908784232642} m_GameObject: {fileID: 7590670908784232642}
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: 27.65, y: 0.52599907, z: 7.3900146} m_LocalPosition: {x: 32.65, y: 0.52599907, z: 7.3900146}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -262429,8 +262437,8 @@ Transform:
m_GameObject: {fileID: 8544586393924102526} m_GameObject: {fileID: 8544586393924102526}
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: 22.65, y: 0.52599907, z: 27.140013} m_LocalPosition: {x: 27.65, y: 0.52599907, z: 27.140013}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -262946,8 +262954,8 @@ Transform:
m_GameObject: {fileID: 8577154754468567942} m_GameObject: {fileID: 8577154754468567942}
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: 17.65, y: 0.52599907, z: 27.140013} m_LocalPosition: {x: 22.65, y: 0.52599907, z: 27.140013}
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: 1932532498} m_Father: {fileID: 1932532498}
@ -281962,8 +281970,8 @@ Transform:
m_GameObject: {fileID: 9182889245508031729} m_GameObject: {fileID: 9182889245508031729}
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: 32.65, y: 0.52599907, z: -2.8599854} m_LocalPosition: {x: 37.65, y: 0.52599907, z: -2.8599854}
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: 1932532498} m_Father: {fileID: 1932532498}

@ -2,7 +2,6 @@ using Unity.BossRoom.Gameplay.GameplayObjects.Character;
using Unity.Netcode; using Unity.Netcode;
using UnityEngine; using UnityEngine;
using DG.Tweening; using DG.Tweening;
using Unity.Netcode.Components;
namespace Unity.Multiplayer.Samples.BossRoom namespace Unity.Multiplayer.Samples.BossRoom
{ {
@ -15,67 +14,96 @@ namespace Unity.Multiplayer.Samples.BossRoom
private NetworkVariable<ulong> occupierId = new NetworkVariable<ulong>(0, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); private NetworkVariable<ulong> occupierId = new NetworkVariable<ulong>(0, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);
private Collider platformCollider; private Collider platformCollider;
private Animator animator; private Animator animator;
private void Awake() private void Awake()
{ {
platformCollider = GetComponent<Collider>(); platformCollider = GetComponent<Collider>();
if (!platformCollider.isTrigger) platformCollider.isTrigger = true;
platformCollider.isTrigger = true;
animator = GetComponent<Animator>(); animator = GetComponent<Animator>();
} }
private void Start() private void Start()
{ {
Invoke(nameof(ColliderEnabler),2); if (IsServer)
{
Invoke(nameof(EnableCollider), 2); // Delay collider enabling for server
}
} }
public void AssignID(int id) public void AssignID(int id)
{ {
if (IsServer) PlatformID.Value = id; if (IsServer)
{
PlatformID.Value = id;
}
} }
void ColliderEnabler()
private void EnableCollider()
{ {
platformCollider.enabled = true; platformCollider.enabled = true;
} }
public void StartRotation() => transform.DOLocalRotate(Vector3.up, 120).SetSpeedBased(true).SetId(PlatformID).SetLoops(-1, LoopType.Incremental);
private void PauseRotation() => DOTween.Pause(PlatformID); public void StartRotation()
private void ResumeRotation() => DOTween.Play(PlatformID); {
transform.DOLocalRotate(Vector3.up, 120).SetSpeedBased(true).SetId(PlatformID).SetLoops(-1, LoopType.Incremental);
}
private void PauseRotation()
{
DOTween.Pause(PlatformID);
}
private void ResumeRotation()
{
DOTween.Play(PlatformID);
}
public void Pause() public void Pause()
{ {
if (IsOwner) if (IsServer)
{ {
animator.speed = 0f; animator.speed = 0f;
PauseServerRpc(); PauseClientRpc();
} }
} }
public void Resume() public void Resume()
{ {
if (IsOwner) if (IsServer)
{ {
animator.speed = 1f; animator.speed = 1f;
ResumeServerRpc(); ResumeClientRpc();
} }
} }
[ServerRpc]
private void PauseServerRpc() => PauseClientRpc();
[ClientRpc] [ClientRpc]
private void PauseClientRpc() => animator.speed = 0f; private void PauseClientRpc()
{
animator.speed = 0f;
}
[ServerRpc]
private void ResumeServerRpc() => ResumeClientRpc();
[ClientRpc] [ClientRpc]
private void ResumeClientRpc() => animator.speed = 1f; private void ResumeClientRpc()
{
animator.speed = 1f;
}
public void Occupy(ServerCharacter player) public void Occupy(ServerCharacter player)
{ {
if (!IsServer || IsOccupied) return; if (!IsServer || IsOccupied)
{
return;
}
Pause(); Pause();
bool giveScore = player.PreviousPlatformId != PlatformID.Value; bool giveScore = player.PreviousPlatformId != PlatformID.Value;
int score = (player.TargetPlatformId == PlatformID.Value) ? 10 : 20; int score = (player.TargetPlatformId == PlatformID.Value) ? 10 : 20;
if (giveScore) ScoreManager.Instance.AddPlayerScore(player.OwnerClientId, score); if (giveScore)
{
ScoreManager.Instance.AddPlayerScore(player.OwnerClientId, score);
}
IsOccupied = true; IsOccupied = true;
occupierId.Value = player.OwnerClientId; occupierId.Value = player.OwnerClientId;
@ -84,7 +112,10 @@ namespace Unity.Multiplayer.Samples.BossRoom
public void Vacate(ServerCharacter player) public void Vacate(ServerCharacter player)
{ {
if (!IsServer || !IsOccupied || occupierId.Value != player.OwnerClientId) return; if (!IsServer || !IsOccupied || occupierId.Value != player.OwnerClientId)
{
return;
}
Resume(); Resume();
IsOccupied = false; IsOccupied = false;
@ -95,15 +126,133 @@ namespace Unity.Multiplayer.Samples.BossRoom
private void OnTriggerEnter(Collider other) private void OnTriggerEnter(Collider other)
{ {
if (IsServer && other.TryGetComponent<ServerCharacter>(out var player) && !IsOccupied) if (IsServer && other.TryGetComponent<ServerCharacter>(out var player) && !IsOccupied)
{
Occupy(player); Occupy(player);
}
} }
private void OnTriggerExit(Collider other) private void OnTriggerExit(Collider other)
{ {
if (IsServer && other.TryGetComponent<ServerCharacter>(out var player)) if (IsServer && other.TryGetComponent<ServerCharacter>(out var player))
{
Vacate(player); Vacate(player);
}
} }
public ulong GetOccupierId() => occupierId.Value; public ulong GetOccupierId()
{
return occupierId.Value;
}
} }
} }
//using Unity.BossRoom.Gameplay.GameplayObjects.Character;
//using Unity.Netcode;
//using UnityEngine;
//using DG.Tweening;
//using Unity.Netcode.Components;
//namespace Unity.Multiplayer.Samples.BossRoom
//{
// [RequireComponent(typeof(Collider))]
// public class Platform : NetworkBehaviour
// {
// public NetworkVariable<int> PlatformID = new NetworkVariable<int>(0);
// public bool IsOccupied { get; private set; }
// private NetworkVariable<ulong> occupierId = new NetworkVariable<ulong>(0, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);
// private Collider platformCollider;
// private Animator animator;
// private void Awake()
// {
// platformCollider = GetComponent<Collider>();
// if (!platformCollider.isTrigger)
// platformCollider.isTrigger = true;
// animator = GetComponent<Animator>();
// }
// private void Start()
// {
// Invoke(nameof(ColliderEnabler),2);
// }
// public void AssignID(int id)
// {
// if (IsServer) PlatformID.Value = id;
// }
// void ColliderEnabler()
// {
// platformCollider.enabled = true;
// }
// public void StartRotation() => transform.DOLocalRotate(Vector3.up, 120).SetSpeedBased(true).SetId(PlatformID).SetLoops(-1, LoopType.Incremental);
// private void PauseRotation() => DOTween.Pause(PlatformID);
// private void ResumeRotation() => DOTween.Play(PlatformID);
// public void Pause()
// {
// if (IsOwner)
// {
// animator.speed = 0f;
// PauseServerRpc();
// }
// }
// public void Resume()
// {
// if (IsOwner)
// {
// animator.speed = 1f;
// ResumeServerRpc();
// }
// }
// [ServerRpc]
// private void PauseServerRpc() => PauseClientRpc();
// [ClientRpc]
// private void PauseClientRpc() => animator.speed = 0f;
// [ServerRpc]
// private void ResumeServerRpc() => ResumeClientRpc();
// [ClientRpc]
// private void ResumeClientRpc() => animator.speed = 1f;
// public void Occupy(ServerCharacter player)
// {
// if (!IsServer || IsOccupied) return;
// Pause();
// bool giveScore = player.PreviousPlatformId != PlatformID.Value;
// int score = (player.TargetPlatformId == PlatformID.Value) ? 10 : 20;
// if (giveScore) ScoreManager.Instance.AddPlayerScore(player.OwnerClientId, score);
// IsOccupied = true;
// occupierId.Value = player.OwnerClientId;
// player.OnArrivalOnPlatform(PlatformID.Value);
// }
// public void Vacate(ServerCharacter player)
// {
// if (!IsServer || !IsOccupied || occupierId.Value != player.OwnerClientId) return;
// Resume();
// IsOccupied = false;
// occupierId.Value = 0;
// player.OnLeavingPlatform(PlatformID.Value);
// }
// private void OnTriggerEnter(Collider other)
// {
// if (IsServer && other.TryGetComponent<ServerCharacter>(out var player) && !IsOccupied)
// Occupy(player);
// }
// private void OnTriggerExit(Collider other)
// {
// if (IsServer && other.TryGetComponent<ServerCharacter>(out var player))
// Vacate(player);
// }
// public ulong GetOccupierId() => occupierId.Value;
// }
//}

@ -12,7 +12,6 @@ namespace Unity.Multiplayer.Samples.BossRoom
public static PlatformManager Instance; public static PlatformManager Instance;
public List<Platform> m_Platforms; public List<Platform> m_Platforms;
public int numberOfPlayers = 2; // Number of players (n) public int numberOfPlayers = 2; // Number of players (n)
public float planeRadius = 4f; // Radius of the circular plane
private void Awake() private void Awake()
{ {
@ -30,98 +29,91 @@ namespace Unity.Multiplayer.Samples.BossRoom
{ {
if (IsServer) if (IsServer)
{ {
m_Platforms = GetComponentsInChildren<Platform>(true).ToList(); InitializePlatforms();
for (int i = 0; i < m_Platforms.Count; i++)
{
m_Platforms[i].AssignID(i + 1); // Initialize platforms with unique IDs
}
StartCoroutine(DelayedServerSetup()); StartCoroutine(DelayedServerSetup());
} }
else
{
StartCoroutine(DelayedClientSetup()); // Delay to give time to load
}
} }
/// <summary> /// <summary>
/// Coroutine to delay server-side setup. /// Initializes platform list and assigns unique IDs.
/// </summary> /// </summary>
private IEnumerator DelayedServerSetup() private void InitializePlatforms()
{ {
yield return new WaitForSeconds(0.5f); // Delay for 0.5 seconds m_Platforms = GetComponentsInChildren<Platform>(true).ToList();
PlatformSelectionServerRpc(); // Call ServerRpc after delay for (int i = 0; i < m_Platforms.Count; i++)
{
m_Platforms[i].AssignID(i + 1); // Assign unique IDs to platforms
}
} }
/// <summary> /// <summary>
/// Coroutine to delay client-side setup. /// Delayed server setup to allow other components to initialize.
/// </summary> /// </summary>
private IEnumerator DelayedClientSetup() private IEnumerator DelayedServerSetup()
{ {
yield return new WaitForSeconds(0.5f); yield return new WaitForSeconds(0.5f);
m_Platforms = GetComponentsInChildren<Platform>(true).ToList(); // Populate client platform list PlatformSelection();
Debug.Log($"Client platform list initialized. Platform count: {m_Platforms.Count}");
} }
[ServerRpc(RequireOwnership = false)] /// <summary>
private void PlatformSelectionServerRpc() /// Server-side logic to select and enable platforms based on player count.
/// </summary>
private void PlatformSelection()
{ {
int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers") - 1;
m_Platforms.ForEach(platform => platform.gameObject.SetActive(false)); int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers",1) - 1;
Debug.Log("Disabled all platforms on the server.");
if (platformsToSpawn > 0) // Disable all platforms initially
foreach (var platform in m_Platforms)
{ {
for (int i = 0; i < platformsToSpawn; i++) platform.gameObject.SetActive(false);
{ }
m_Platforms[i].gameObject.SetActive(true);
Debug.Log($"Enabled platform with ID {m_Platforms[i].PlatformID.Value} on server."); // Enable required number of platforms
} for (int i = 0; i < platformsToSpawn; i++)
{
Debug.Log(m_Platforms[i].gameObject.name + " is activated");
m_Platforms[i].gameObject.SetActive(true);
} }
m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList();
//float angleIncrement = 360f / platformsToSpawn;
//for (int i = 0; i < platformsToSpawn; i++)
//{
// m_Platforms[i].transform.position = new Vector3(
// Mathf.Cos(i * angleIncrement * Mathf.Deg2Rad) * planeRadius,
// 0f,
// Mathf.Sin(i * angleIncrement * Mathf.Deg2Rad) * planeRadius
// );
//}
m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList();
int[] platformIDs = m_Platforms.Select(p => p.PlatformID.Value).ToArray(); int[] platformIDs = m_Platforms.Select(p => p.PlatformID.Value).ToArray();
// Notify clients to enable corresponding platforms
ClientEnablePlatformClientRpc(platformIDs); ClientEnablePlatformClientRpc(platformIDs);
} }
/// <summary>
/// ClientRpc to enable platforms on the client side.
/// </summary>
[ClientRpc] [ClientRpc]
private void ClientEnablePlatformClientRpc(int[] platformIDs) private void ClientEnablePlatformClientRpc(int[] platformIDs)
{ {
m_Platforms = GetComponentsInChildren<Platform>(true).ToList(); // Ensure the platform list is refreshed m_Platforms = GetComponentsInChildren<Platform>(true).ToList();
Debug.Log($"Client received platform IDs: {string.Join(",", platformIDs)}");
Debug.Log($"Client platform list count: {m_Platforms.Count}");
// Disable all platforms initially
foreach (var platform in m_Platforms) foreach (var platform in m_Platforms)
{ {
platform.gameObject.SetActive(false); platform.gameObject.SetActive(false);
Debug.Log($"Disabled platform with ID: {platform.PlatformID.Value}");
} }
// Enable specified platforms
foreach (int id in platformIDs) foreach (int id in platformIDs)
{ {
var platformToEnable = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == id); var platformToEnable = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == id);
if (platformToEnable != null) if (platformToEnable != null)
{ {
platformToEnable.gameObject.SetActive(true); platformToEnable.gameObject.SetActive(true);
Debug.Log($"Enabled platform with ID: {id}");
}
else
{
Debug.LogError($"Platform with ID {id} not found on client.");
} }
} }
m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList();
m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList();
} }
/// <summary>
/// Finds the nearest unoccupied platform to a given position.
/// Server-only method.
/// </summary>
public Platform FindNearestUnoccupiedPlatform(Vector3 position) public Platform FindNearestUnoccupiedPlatform(Vector3 position)
{ {
if (!IsServer) if (!IsServer)
@ -136,49 +128,219 @@ namespace Unity.Multiplayer.Samples.BossRoom
.FirstOrDefault(); .FirstOrDefault();
} }
/// <summary>
/// Checks if all platforms are occupied.
/// </summary>
public bool AreAllPlatformsOccupied() public bool AreAllPlatformsOccupied()
{ {
return m_Platforms.All(platform => platform.IsOccupied); return m_Platforms.All(platform => platform.IsOccupied);
} }
/*public bool AssignPlayerToPlatform(ServerCharacter player) /// <summary>
{ /// Gets the platform occupied by a specific player.
if (!IsServer) /// </summary>
{
Debug.LogError("AssignPlayerToPlatform should only be called on the server.");
return false;
}
var platform = m_Platforms.FirstOrDefault(p => !p.IsOccupied);
if (platform != null)
{
platform.Occupy(player);
return true;
}
Debug.LogWarning($"No unoccupied platforms available for {player.name}.");
return false;
}*/
public Platform GetPlatformOccupiedByPlayer(ServerCharacter player) public Platform GetPlatformOccupiedByPlayer(ServerCharacter player)
{ {
return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId); return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId);
} }
/// <summary>
/// Checks if a platform is occupied.
/// </summary>
public bool IsPlatformOccupied(Platform platform) public bool IsPlatformOccupied(Platform platform)
{ {
return platform.IsOccupied; return platform.IsOccupied;
} }
/// <summary>
/// Gets the position of a platform by its ID.
/// </summary>
public Vector3 GetPlatformPosition(int platformId) public Vector3 GetPlatformPosition(int platformId)
{ {
var platform = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); var platform = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId);
return platform ? platform.transform.position : Vector3.zero; return platform ? platform.transform.position : Vector3.zero;
} }
/// <summary>
/// Gets a platform by its ID.
/// </summary>
public Platform GetPlatformById(int platformId) public Platform GetPlatformById(int platformId)
{ {
return m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); return m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId);
} }
} }
} }
//using System.Collections;
//using System.Collections.Generic;
//using System.Linq;
//using Unity.BossRoom.Gameplay.GameplayObjects.Character;
//using Unity.Netcode;
//using UnityEngine;
//namespace Unity.Multiplayer.Samples.BossRoom
//{
// public class PlatformManager : NetworkBehaviour
// {
// public static PlatformManager Instance;
// public List<Platform> m_Platforms;
// public int numberOfPlayers = 2; // Number of players (n)
// public float planeRadius = 4f; // Radius of the circular plane
// private void Awake()
// {
// if (Instance != null && Instance != this)
// {
// Destroy(gameObject);
// }
// else
// {
// Instance = this;
// }
// }
// private void Start()
// {
// if (IsServer)
// {
// m_Platforms = GetComponentsInChildren<Platform>(true).ToList();
// for (int i = 0; i < m_Platforms.Count; i++)
// {
// m_Platforms[i].AssignID(i + 1); // Initialize platforms with unique IDs
// }
// StartCoroutine(DelayedServerSetup());
// }
// else
// {
// StartCoroutine(DelayedClientSetup()); // Delay to give time to load
// }
// }
// /// <summary>
// /// Coroutine to delay server-side setup.
// /// </summary>
// private IEnumerator DelayedServerSetup()
// {
// yield return new WaitForSeconds(0.5f); // Delay for 0.5 seconds
// PlatformSelection(); // Call ServerRpc after delay
// }
// /// <summary>
// /// Coroutine to delay client-side setup.
// /// </summary>
// private IEnumerator DelayedClientSetup()
// {
// yield return new WaitForSeconds(0.5f);
// m_Platforms = GetComponentsInChildren<Platform>(true).ToList(); // Populate client platform list
// Debug.Log($"Client platform list initialized. Platform count: {m_Platforms.Count}");
// }
// private void PlatformSelection()
// {
// int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers") - 1;
// m_Platforms.ForEach(platform => platform.gameObject.SetActive(false));
// Debug.Log("Disabled all platforms on the server.");
// if (platformsToSpawn > 0)
// {
// for (int i = 0; i < platformsToSpawn; i++)
// {
// m_Platforms[i].gameObject.SetActive(true);
// Debug.Log($"Enabled platform with ID {m_Platforms[i].PlatformID.Value} on server.");
// }
// }
// m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList();
// int[] platformIDs = m_Platforms.Select(p => p.PlatformID.Value).ToArray();
// ClientEnablePlatformClientRpc(platformIDs);
// }
// [ClientRpc]
// private void ClientEnablePlatformClientRpc(int[] platformIDs)
// {
// m_Platforms = GetComponentsInChildren<Platform>(true).ToList(); // Ensure the platform list is refreshed
// Debug.Log($"Client received platform IDs: {string.Join(",", platformIDs)}");
// Debug.Log($"Client platform list count: {m_Platforms.Count}");
// foreach (var platform in m_Platforms)
// {
// platform.gameObject.SetActive(false);
// Debug.Log($"Disabled platform with ID: {platform.PlatformID.Value}");
// }
// foreach (int id in platformIDs)
// {
// var platformToEnable = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == id);
// if (platformToEnable != null)
// {
// platformToEnable.gameObject.SetActive(true);
// Debug.Log($"Enabled platform with ID: {id}");
// }
// else
// {
// Debug.LogError($"Platform with ID {id} not found on client.");
// }
// }
// m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList();
// }
// public Platform FindNearestUnoccupiedPlatform(Vector3 position)
// {
// if (!IsServer)
// {
// Debug.LogError("FindNearestUnoccupiedPlatform should only be called on the server.");
// return null;
// }
// return m_Platforms
// .Where(platform => !platform.IsOccupied)
// .OrderBy(platform => Vector3.Distance(position, platform.transform.position))
// .FirstOrDefault();
// }
// public bool AreAllPlatformsOccupied()
// {
// return m_Platforms.All(platform => platform.IsOccupied);
// }
// /*public bool AssignPlayerToPlatform(ServerCharacter player)
// {
// if (!IsServer)
// {
// Debug.LogError("AssignPlayerToPlatform should only be called on the server.");
// return false;
// }
// var platform = m_Platforms.FirstOrDefault(p => !p.IsOccupied);
// if (platform != null)
// {
// platform.Occupy(player);
// return true;
// }
// Debug.LogWarning($"No unoccupied platforms available for {player.name}.");
// return false;
// }*/
// public Platform GetPlatformOccupiedByPlayer(ServerCharacter player)
// {
// return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId);
// }
// public bool IsPlatformOccupied(Platform platform)
// {
// return platform.IsOccupied;
// }
// public Vector3 GetPlatformPosition(int platformId)
// {
// var platform = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId);
// return platform ? platform.transform.position : Vector3.zero;
// }
// public Platform GetPlatformById(int platformId)
// {
// return m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId);
// }
// }
//}

@ -5,56 +5,58 @@ using UnityEngine;
public class SynchronizedTimer : NetworkBehaviour public class SynchronizedTimer : NetworkBehaviour
{ {
public event Action OnTimerEnd; // Ensure it's public public event Action OnTimerEnd;
[SerializeField] private TextMeshProUGUI timerText; // Reference to the TextMeshProUGUI component [SerializeField] private TextMeshProUGUI timerText;
private NetworkVariable<float> timer = new NetworkVariable<float>(0f, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); private NetworkVariable<float> timer = new NetworkVariable<float>(
private bool isTimerRunning = false; 0f,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server
);
void Update() private bool isTimerRunning = false;
private void Start()
{
timerText.gameObject.SetActive( false );
}
private void Update()
{ {
if (IsServer && isTimerRunning) if (IsServer && isTimerRunning)
{ {
// Decrease the timer only on the server
timer.Value -= Time.deltaTime; timer.Value -= Time.deltaTime;
if (timer.Value <= 0) if (timer.Value <= 0)
{ {
timer.Value = 0; timer.Value = 0;
isTimerRunning = false; isTimerRunning = false;
OnTimerEnd?.Invoke(); // Trigger the event on the server OnTimerEnd?.Invoke();
} }
UpdateTimerUI();
} }
// Update the UI on all clients
UpdateTimerUI();
} }
/// <summary> public void StartTimerServer(float time)
/// Starts the timer.
/// </summary>
/// <param name="time">The duration of the timer in seconds.</param>
[ServerRpc(RequireOwnership = false)]
public void StartTimerServerRpc(float time)
{ {
if (!isTimerRunning) if (!isTimerRunning && time > 0)
{ {
timer.Value = time; timer.Value = time;
isTimerRunning = true; isTimerRunning = true;
timerTextEnablerClientRpc();
} }
} }
[ClientRpc]
void timerTextEnablerClientRpc()
{
timerText.gameObject.SetActive ( true );
}
/// <summary>
/// Gets the remaining time on the timer.
/// </summary>
/// <returns>The remaining time in seconds.</returns>
public float GetRemainingTime() public float GetRemainingTime()
{ {
return timer.Value; return timer.Value;
} }
// This method ensures the timer stays synchronized for clients
private void OnEnable() private void OnEnable()
{ {
timer.OnValueChanged += OnTimerValueChanged; timer.OnValueChanged += OnTimerValueChanged;
@ -67,22 +69,19 @@ public class SynchronizedTimer : NetworkBehaviour
private void OnTimerValueChanged(float oldValue, float newValue) private void OnTimerValueChanged(float oldValue, float newValue)
{ {
if (!IsServer && newValue <= 0 && oldValue > 0) if (newValue <= 0 && oldValue > 0)
{ {
OnTimerEnd?.Invoke(); // Trigger the event on clients when timer reaches zero OnTimerEnd?.Invoke();
} }
UpdateTimerUI();
} }
/// <summary>
/// Updates the TextMeshProUGUI with the remaining time.
/// </summary>
private void UpdateTimerUI() private void UpdateTimerUI()
{ {
if (timerText != null) if (timerText != null)
{ {
int minutes = Mathf.FloorToInt(timer.Value / 60); int minutes = Mathf.FloorToInt(timer.Value / 60);
int seconds = Mathf.FloorToInt(timer.Value % 60); int seconds = Mathf.FloorToInt(timer.Value % 60);
timerText.text = $"{minutes:D2}:{seconds:D2}"; timerText.text = $"{minutes:D2}:{seconds:D2}";
} }
} }

@ -2,40 +2,47 @@ using System.Collections;
using Unity.Multiplayer.Samples.Utilities; using Unity.Multiplayer.Samples.Utilities;
using Unity.Netcode; using Unity.Netcode;
using UnityEngine; using UnityEngine;
using static TMPro.SpriteAssetUtilities.TexturePacker_JsonArray;
public class TimerScript : MonoBehaviour public class TimerScript : MonoBehaviour
{ {
[SerializeField] private SynchronizedTimer timer; [SerializeField] private SynchronizedTimer timer;
public ServerAdditiveSceneLoader serverAdditiveSceneLoader; public ServerAdditiveSceneLoader serverAdditiveSceneLoader;
public int timeInSeconds=180; public int timeInSeconds = 180;
void Start() void Start()
{ {
if (timer != null) if (timer != null)
{ {
timer.OnTimerEnd += HandleTimerEnd; // Subscribe to the event timeInSeconds = 1200;
timer.OnTimerEnd += HandleTimerEnd;
Debug.Log("Timer started call sent");
StartCoroutine(Starter()); StartCoroutine(Starter());
} }
} }
IEnumerator Starter() IEnumerator Starter()
{ {
yield return new WaitUntil(() => serverAdditiveSceneLoader.m_SceneState == ServerAdditiveSceneLoader.SceneState.Loaded); yield return new WaitUntil(() => serverAdditiveSceneLoader.m_SceneState == ServerAdditiveSceneLoader.SceneState.Loaded);
if (Unity.Netcode.NetworkManager.Singleton.IsServer) if (NetworkManager.Singleton.IsServer)
{ {
timer.StartTimerServerRpc(timeInSeconds); // Start a 3-minute timer yield return new WaitForSeconds(2.5f);
Debug.Log("Timer started call sent2");
timer.StartTimerServer(timeInSeconds);
} }
} }
private void HandleTimerEnd() private void HandleTimerEnd()
{ {
Debug.Log("Timer has ended!"); Debug.Log("Timer has ended!");
// Add logic for what happens when the timer ends
Scoreboard.instance.FinalLeaderBoard(); Scoreboard.instance.FinalLeaderBoard();
} }
private void OnDestroy() private void OnDestroy()
{ {
if (timer != null) if (timer != null)
{ {
timer.OnTimerEnd -= HandleTimerEnd; // Unsubscribe to avoid memory leaks timer.OnTimerEnd -= HandleTimerEnd;
} }
} }
} }

Loading…
Cancel
Save