diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs index fbf366f..af8931b 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioReceiver.cs @@ -66,7 +66,7 @@ namespace Convai.Scripts.Runtime.Multiplayer var cfg = networkConfigAsset != null ? networkConfigAsset : NetworkConfig.Instance; if (cfg != null) { - listenPort = cfg.port; + listenPort = cfg.multiplayerAudioPort; } } InitializeNetwork(); @@ -78,6 +78,16 @@ namespace Convai.Scripts.Runtime.Multiplayer ConvaiNPCManager.Instance.OnActiveNPCChanged += HandleActiveNPCChanged; } } + + private void OnEnable() + { + // When re-enabled, ensure listener is running + if (_cancellationTokenSource == null) + { + _cancellationTokenSource = new CancellationTokenSource(); + } + StartListening(); + } private void OnDestroy() { @@ -91,6 +101,12 @@ namespace Convai.Scripts.Runtime.Multiplayer _cancellationTokenSource?.Cancel(); _cancellationTokenSource?.Dispose(); } + + private void OnDisable() + { + // Free the UDP port when this NPC gets disabled + StopListening(); + } private void Update() { @@ -115,8 +131,13 @@ namespace Convai.Scripts.Runtime.Multiplayer private void InitializeConvai() { - // Get target NPC - if (useActiveNPC) + // Prefer local ConvaiNPC on the same GameObject, then fall back to active NPC + var localNPC = GetComponent(); + if (localNPC != null) + { + targetNPC = localNPC; + } + else if (useActiveNPC) { targetNPC = ConvaiNPCManager.Instance?.GetActiveConvaiNPC(); } diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs index 67edbf3..a092f15 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiSimpleUDPAudioSender.cs @@ -56,7 +56,7 @@ namespace Convai.Scripts.Runtime.Multiplayer if (cfg != null) { targetIP = cfg.ipAddress; - targetPort = cfg.port; + targetPort = cfg.multiplayerAudioPort; } } InitializeNetwork(); diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs index 4d17f36..a7f1045 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechReceiver.cs @@ -113,12 +113,21 @@ namespace Convai.Scripts.Runtime.Multiplayer var cfg = networkConfigAsset != null ? networkConfigAsset : NetworkConfig.Instance; if (cfg != null) { - listenPort = cfg.port; + listenPort = cfg.multiplayerSpeechPort; } } InitializeAudio(); InitializeNetwork(); } + + private void OnEnable() + { + if (_cancellationTokenSource == null) + { + _cancellationTokenSource = new CancellationTokenSource(); + } + StartListening(); + } private void OnDestroy() { @@ -126,6 +135,11 @@ namespace Convai.Scripts.Runtime.Multiplayer _cancellationTokenSource?.Cancel(); _cancellationTokenSource?.Dispose(); } + + private void OnDisable() + { + StopListening(); + } private void Update() { diff --git a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechSender.cs b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechSender.cs index e972e9d..49f3a82 100644 --- a/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechSender.cs +++ b/Unity-Master/Assets/Scripts/Multiplayer/ConvaiUDPSpeechSender.cs @@ -62,7 +62,7 @@ namespace Convai.Scripts.Runtime.Multiplayer if (cfg != null) { targetIP = cfg.ipAddress; - targetPort = cfg.port; + targetPort = cfg.multiplayerSpeechPort; } } InitializeNetwork(); @@ -93,8 +93,13 @@ namespace Convai.Scripts.Runtime.Multiplayer private void InitializeConvai() { - // Get target NPC - if (useActiveNPC) + // Prefer local ConvaiNPC on the same GameObject, then fall back to active NPC + var localNPC = GetComponent(); + if (localNPC != null) + { + sourceNPC = localNPC; + } + else if (useActiveNPC) { sourceNPC = ConvaiNPCManager.Instance?.GetActiveConvaiNPC(); } diff --git a/Unity-Master/Assets/Scripts/NetworkConfig.asset b/Unity-Master/Assets/Scripts/NetworkConfig.asset index 0ff4eed..638378a 100644 --- a/Unity-Master/Assets/Scripts/NetworkConfig.asset +++ b/Unity-Master/Assets/Scripts/NetworkConfig.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a67203d8d07617bf9123d8b8768746da191c3f9f0705b525103f02cbc110c31 -size 438 +oid sha256:5f914c2d99734607969803eb007610cf2ccac5b16b93a43d2596f0268b4748b5 +size 444 diff --git a/Unity-Master/Assets/Scripts/NetworkConfig.cs b/Unity-Master/Assets/Scripts/NetworkConfig.cs index 46022ba..f9ff0dd 100644 --- a/Unity-Master/Assets/Scripts/NetworkConfig.cs +++ b/Unity-Master/Assets/Scripts/NetworkConfig.cs @@ -6,6 +6,10 @@ public class NetworkConfig : ScriptableObject [Header("Global Network Settings")] public string ipAddress = "127.0.0.1"; public int port = 8080; + + [Header("Multiplayer Ports")] + public int multiplayerAudioPort = 12345; // For ConvaiSimpleUDPAudio (send/receive) + public int multiplayerSpeechPort = 12346; // For ConvaiUDPSpeech (send/receive) private static NetworkConfig _instance; public static NetworkConfig Instance