From 272cbfdca860d56b7b9b63243b293dd8ad93e0de Mon Sep 17 00:00:00 2001 From: "tom.hempel" Date: Thu, 30 Oct 2025 20:32:29 +0100 Subject: [PATCH] refactored scripts to avoid execution order issues --- .../ConvaiSimpleUDPAudioReceiver.cs | 25 +++++++++++------ .../Multiplayer/ConvaiUDPSpeechReceiver.cs | 24 ++++++++++++----- .../Scripts/Multiplayer/SharedUDPListener.cs | 2 ++ .../Assets/Scripts/UDPAvatarReceiver.cs | 27 ++++++++++++------- .../Assets/Scripts/UDPAvatarReceiverAgent.cs | 27 ++++++++++++------- .../Assets/Scripts/VRExperimentController.cs | 25 +++++++++++------ .../Assets/Scripts/script-overview.md.meta | 7 +++++ .../ProjectSettings/EditorBuildSettings.asset | 2 +- .../ProjectSettings/ProjectSettings.asset | 2 +- 9 files changed, 98 insertions(+), 43 deletions(-) create mode 100644 Unity-Master/Assets/Scripts/script-overview.md.meta diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs index 4fb5a23..a867ff8 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs @@ -107,7 +107,7 @@ namespace Convai.Scripts.Runtime.Multiplayer { _cancellationTokenSource = new CancellationTokenSource(); } - StartListening(); + StartCoroutine(WaitAndSubscribe()); // Immediately try to assign an enabled NPC if (useActiveNPC && targetNPC == null) @@ -227,13 +227,6 @@ namespace Convai.Scripts.Runtime.Multiplayer try { - // Wait for shared listener to be ready - if (SharedUDPListener.Instance == null) - { - ConvaiLogger.Error("SharedUDPListener not found! Make sure it's in the scene.", ConvaiLogger.LogCategory.Character); - return; - } - // Subscribe to shared listener SharedUDPListener.Instance.OnPacketReceived += HandlePacketReceived; _isListening = true; @@ -246,6 +239,22 @@ namespace Convai.Scripts.Runtime.Multiplayer ConvaiLogger.Error($"Stack trace: {ex.StackTrace}", ConvaiLogger.LogCategory.Character); } } + + private System.Collections.IEnumerator WaitAndSubscribe() + { + float timeout = 3f; + while (SharedUDPListener.Instance == null && timeout > 0f) + { + timeout -= Time.unscaledDeltaTime; + yield return null; + } + if (SharedUDPListener.Instance == null) + { + ConvaiLogger.Error("SharedUDPListener not ready after wait.", ConvaiLogger.LogCategory.Character); + yield break; + } + StartListening(); + } public void StopListening() { diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs index ffc7417..1b621c4 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs @@ -144,7 +144,7 @@ namespace Convai.Scripts.Runtime.Multiplayer { _cancellationTokenSource = new CancellationTokenSource(); } - StartListening(); + StartCoroutine(WaitAndSubscribe()); } private void OnDestroy() @@ -209,12 +209,6 @@ namespace Convai.Scripts.Runtime.Multiplayer try { - // Wait for shared listener to be ready - if (SharedUDPListener.Instance == null) - { - ConvaiLogger.Error("SharedUDPListener not found! Make sure it's in the scene.", ConvaiLogger.LogCategory.Character); - return; - } // Subscribe to shared listener SharedUDPListener.Instance.OnPacketReceived += HandlePacketReceived; @@ -227,6 +221,22 @@ namespace Convai.Scripts.Runtime.Multiplayer ConvaiLogger.Error($"❌ FAILED to subscribe Speech Receiver: {ex.Message}", ConvaiLogger.LogCategory.Character); } } + + private System.Collections.IEnumerator WaitAndSubscribe() + { + float timeout = 3f; + while (SharedUDPListener.Instance == null && timeout > 0f) + { + timeout -= Time.unscaledDeltaTime; + yield return null; + } + if (SharedUDPListener.Instance == null) + { + ConvaiLogger.Error("SharedUDPListener not ready after wait.", ConvaiLogger.LogCategory.Character); + yield break; + } + StartListening(); + } public void StopListening() { diff --git a/Unity-Master/Assets/Scripts/Multiplayer/SharedUDPListener.cs b/Unity-Master/Assets/Scripts/Multiplayer/SharedUDPListener.cs index b3774b8..9f2f813 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/SharedUDPListener.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/SharedUDPListener.cs @@ -12,6 +12,7 @@ namespace Convai.Scripts.Runtime.Multiplayer /// Shared UDP Listener - Single UDP socket that dispatches packets to appropriate handlers /// Solves the port binding issue where multiple components tried to bind to the same port /// + [DefaultExecutionOrder(-10000)] public class SharedUDPListener : MonoBehaviour { // Singleton @@ -43,6 +44,7 @@ namespace Convai.Scripts.Runtime.Multiplayer return; } _instance = this; + DontDestroyOnLoad(gameObject); } private void Start() diff --git a/Unity-Master/Assets/Scripts/UDPAvatarReceiver.cs b/Unity-Master/Assets/Scripts/UDPAvatarReceiver.cs index cd0fc87..0a2904c 100644 --- a/Unity-Master/Assets/Scripts/UDPAvatarReceiver.cs +++ b/Unity-Master/Assets/Scripts/UDPAvatarReceiver.cs @@ -98,7 +98,7 @@ public class UDPAvatarReceiver : MonoBehaviour if (enableReceiver) { - StartUDPListener(); + StartCoroutine(WaitAndSubscribe()); } if (showDebugInfo) @@ -199,14 +199,6 @@ public class UDPAvatarReceiver : MonoBehaviour { try { - // Wait for shared listener to be ready - if (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null) - { - Debug.LogError("SharedUDPListener not found! Make sure it's in the scene."); - enableReceiver = false; - return; - } - // Subscribe to shared listener Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance.OnPacketReceived += HandlePacketReceived; @@ -219,6 +211,23 @@ public class UDPAvatarReceiver : MonoBehaviour enableReceiver = false; } } + + System.Collections.IEnumerator WaitAndSubscribe() + { + float timeout = 3f; + while (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null && timeout > 0f) + { + timeout -= Time.unscaledDeltaTime; + yield return null; + } + if (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null) + { + Debug.LogError("SharedUDPListener not ready after wait."); + enableReceiver = false; + yield break; + } + StartUDPListener(); + } void HandlePacketReceived(byte[] data, IPEndPoint senderEndPoint) { diff --git a/Unity-Master/Assets/Scripts/UDPAvatarReceiverAgent.cs b/Unity-Master/Assets/Scripts/UDPAvatarReceiverAgent.cs index 0518013..f728ae8 100644 --- a/Unity-Master/Assets/Scripts/UDPAvatarReceiverAgent.cs +++ b/Unity-Master/Assets/Scripts/UDPAvatarReceiverAgent.cs @@ -101,7 +101,7 @@ public class UDPAvatarReceiverAgent : MonoBehaviour if (enableReceiver) { - StartUDPListener(); + StartCoroutine(WaitAndSubscribe()); } if (showDebugInfo) @@ -202,14 +202,6 @@ public class UDPAvatarReceiverAgent : MonoBehaviour { try { - // Wait for shared listener to be ready - if (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null) - { - Debug.LogError("SharedUDPListener not found! Make sure it's in the scene."); - enableReceiver = false; - return; - } - // Subscribe to shared listener Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance.OnPacketReceived += HandlePacketReceived; @@ -222,6 +214,23 @@ public class UDPAvatarReceiverAgent : MonoBehaviour enableReceiver = false; } } + + System.Collections.IEnumerator WaitAndSubscribe() + { + float timeout = 3f; + while (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null && timeout > 0f) + { + timeout -= Time.unscaledDeltaTime; + yield return null; + } + if (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null) + { + Debug.LogError("SharedUDPListener not ready after wait."); + enableReceiver = false; + yield break; + } + StartUDPListener(); + } void HandlePacketReceived(byte[] data, IPEndPoint senderEndPoint) { diff --git a/Unity-Master/Assets/Scripts/VRExperimentController.cs b/Unity-Master/Assets/Scripts/VRExperimentController.cs index 05810af..8f79634 100644 --- a/Unity-Master/Assets/Scripts/VRExperimentController.cs +++ b/Unity-Master/Assets/Scripts/VRExperimentController.cs @@ -64,7 +64,7 @@ public class VRExperimentController : MonoBehaviour } InitializeObjectMaps(); - StartUDPListener(); + StartCoroutine(WaitAndSubscribe()); // Initially deactivate all objects and avatars DeactivateAllObjects(); @@ -193,13 +193,6 @@ public class VRExperimentController : MonoBehaviour { try { - // Wait for shared listener to be ready - if (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null) - { - LogError("SharedUDPListener not found! Make sure it's in the scene."); - return; - } - // Subscribe to shared listener Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance.OnPacketReceived += HandlePacketReceived; isListening = true; @@ -212,6 +205,22 @@ public class VRExperimentController : MonoBehaviour } } + private System.Collections.IEnumerator WaitAndSubscribe() + { + float timeout = 3f; + while (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null && timeout > 0f) + { + timeout -= Time.unscaledDeltaTime; + yield return null; + } + if (Convai.Scripts.Runtime.Multiplayer.SharedUDPListener.Instance == null) + { + LogError("SharedUDPListener not ready after wait."); + yield break; + } + StartUDPListener(); + } + /// /// Handle packet received from shared listener /// diff --git a/Unity-Master/Assets/Scripts/script-overview.md.meta b/Unity-Master/Assets/Scripts/script-overview.md.meta new file mode 100644 index 0000000..d779956 --- /dev/null +++ b/Unity-Master/Assets/Scripts/script-overview.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0b725a59a21efb044ba2d8b4ef29095c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity-Master/ProjectSettings/EditorBuildSettings.asset b/Unity-Master/ProjectSettings/EditorBuildSettings.asset index fb169eb..290a860 100644 --- a/Unity-Master/ProjectSettings/EditorBuildSettings.asset +++ b/Unity-Master/ProjectSettings/EditorBuildSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ae56a0aa5e5fcd905f8d677138aa623b5c695c0f95a066ae70847afb086ef01 +oid sha256:57814a7518569d818e2d6fd8ddb8c5543ec9a81bdd1b5c6266f4d9f5ea9eaf31 size 1111 diff --git a/Unity-Master/ProjectSettings/ProjectSettings.asset b/Unity-Master/ProjectSettings/ProjectSettings.asset index 5687f99..a8004b2 100644 --- a/Unity-Master/ProjectSettings/ProjectSettings.asset +++ b/Unity-Master/ProjectSettings/ProjectSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3021b170955d24126c440f68eacf051f182187e316381b898403f6bba7b1271 +oid sha256:9fbb1f7b761b58869e3f1adcbabe77be01115d75cefd557c504b4fb3aa50b129 size 24723