Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

大規模マルチプレイおよびテキストチャットを導入 #23

Merged
merged 49 commits into from
Feb 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
420bb14
first commit
mahaweilu Nov 21, 2023
3f15c7a
save file
mahaweilu Nov 29, 2023
c9dc32c
Implement the coexistence of P2P and Massively Multiplayer
sus-taguchi-t Nov 30, 2023
5f58a24
save files
mahaweilu Nov 30, 2023
a201d40
save files
mahaweilu Dec 4, 2023
1fe4451
show avatars in 2 clients successfully
mahaweilu Dec 5, 2023
b6cd680
add :listRoom, deleteRoom, p2p fix
mahaweilu Dec 5, 2023
fbf9e89
Modify to enable rough synchronization
sus-taguchi-t Dec 5, 2023
08ac43f
Modify to enable detailed synchronization
sus-taguchi-t Dec 6, 2023
1ae4350
Enable to control whether to send synchronized values on application
sus-taguchi-t Dec 6, 2023
c0a041a
Devide to each libraries
sus-taguchi-t Dec 6, 2023
fc53b98
Extract common parts of RedisMessagingTransport between Native and WebGL
sus-taguchi-t Dec 7, 2023
e57972d
Implement for WebGL
sus-taguchi-t Dec 7, 2023
a83b792
add multiplay.messaging
mahaweilu Dec 8, 2023
f79e51c
Enable to transition spaces
sus-taguchi-t Dec 8, 2023
392c137
Enable synchronization of avatar
sus-taguchi-t Dec 8, 2023
ff3fa6d
restore performanceTest
mahaweilu Dec 8, 2023
d750f22
add eof
mahaweilu Dec 8, 2023
7300446
Refactoring
sus-taguchi-t Dec 11, 2023
6ee4f1c
Modify in response to review
sus-taguchi-t Dec 13, 2023
4781e11
Change DIsconnect method to awaitable
sus-taguchi-t Dec 13, 2023
b35ac49
Organize codes
sus-taguchi-t Dec 15, 2023
fe9b6b2
Modify player input
sus-taguchi-t Dec 18, 2023
f64fac1
Modify in response to review
sus-taguchi-t Dec 20, 2023
b4fd5a6
Remove Netcode
sus-taguchi-t Dec 22, 2023
e3cecfd
Change text chat to one using messaging client
sus-taguchi-t Dec 22, 2023
6866d5f
Organize codes
sus-taguchi-t Dec 22, 2023
8a6cff0
Modify so that analyzer's warning does not appear
sus-taguchi-t Dec 27, 2023
50ae656
Messaging.Common -> Messaging, Multiplay.Common -> Multiplay.Messaging
mahaweilu Jan 9, 2024
ccc491b
remove ngo.webrtc
mahaweilu Jan 9, 2024
7fa7983
modify settings
mahaweilu Jan 9, 2024
580c985
Merge commit '50ae656c9305135df2c0ad74520b121b7c768d9e' into Messaging
mahaweilu Jan 9, 2024
3898611
Merge commit 'ccc491b90a9dd04b8083c684447e094c78d20a9b' into Messaging
mahaweilu Jan 9, 2024
e3948f1
Merge commit '7fa7983ba4a562465db5a44669c5bd6983ba97f4' into Messaging
mahaweilu Jan 9, 2024
7f16ac0
fix disconnection notification
mahaweilu Jan 9, 2024
c8fdbe4
fix namespace
mahaweilu Jan 23, 2024
3a54e53
fix because deleted util
mahaweilu Jan 23, 2024
edb6481
fix because added listGroup to MultiplayClient
mahaweilu Jan 23, 2024
1ac79be
version up
sus-yoshikane-t Jan 30, 2024
3c5ddd0
Modify to support CORS in WebGL
sus-yoshikane-t Jan 30, 2024
83b38be
Fix error and warnings
sus-yoshikane-t Jan 30, 2024
2c63648
Merge the change for multiplay performance test
sus-taguchi-t Jan 31, 2024
bd35484
Separate connection information for multipay and text chat
sus-taguchi-t Jan 31, 2024
bb8910c
Modify name space for MultiplayControl
sus-taguchi-t Jan 31, 2024
b79d31a
Remove unused using directive
sus-taguchi-t Jan 31, 2024
9d59125
Minor fix
sus-taguchi-t Feb 2, 2024
260d8a3
Remove max capacity from messaging config
sus-taguchi-t Feb 2, 2024
7a1afc4
Add scripts for Messaging server
sus-taguchi-t Feb 2, 2024
6900df8
Merge remote-tracking branch 'origin/VerUp' into Messaging
sus-taguchi-t Feb 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions Assets/AddressableAssetsData/AssetGroups/AppCommon.asset
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ MonoBehaviour:
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 10937d40dc9a78c45a1a747468a3d839
m_Address: MessagingConfig
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 0
m_Settings: {fileID: 11400000, guid: 70324997c374a0844916ed3e0c6c273b, type: 2}
m_SchemaSet:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@
"UniRx",
"UniTask",
"VContainer",
"Unity.Netcode.Runtime",
"StarterAsserts",
"Extreal.Core.Logging",
"Extreal.Core.StageNavigation",
"Extreal.Core.Common",
"Extreal.Integration.Multiplay.NGO"
"Extreal.Integration.Multiplay.Messaging"
],
"includePlatforms": [
"Editor",
Expand Down
28 changes: 8 additions & 20 deletions Assets/Holiday.PerformanceTest/PerformanceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@
using System.Threading;
using Cysharp.Threading.Tasks;
using Extreal.Core.Logging;
using Extreal.Integration.Multiplay.NGO;
using Extreal.Integration.Multiplay.Messaging;
using Extreal.SampleApp.Holiday.App;
using Extreal.SampleApp.Holiday.App.Config;
using Extreal.SampleApp.Holiday.Controls.ClientControl;
using StarterAssets;
using TMPro;
using UniRx;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Profiling;
using UnityEngine.SceneManagement;
Expand Down Expand Up @@ -134,24 +133,24 @@ private async UniTaskVoid StartTestAsync()

var appControlScope = FindObjectOfType<ClientControlScope>();
var appState = appControlScope.Container.Resolve(typeof(AppState)) as AppState;
var ngoClient = appControlScope.Container.Resolve(typeof(NgoClient)) as NgoClient;
var multiplayClient = appControlScope.Container.Resolve(typeof(MultiplayClient)) as MultiplayClient;

{
var playingReady = false;
var isConnectionApprovalRejected = false;
var isJoiningApprovalRejected = false;

using var isPlayingDisposable = appState.PlayingReady
.Skip(1)
.Where(value => value)
.Subscribe(_ => playingReady = true);

using var isConnectionApprovalRejectedDisposable =
ngoClient.OnConnectionApprovalRejected
.Subscribe(_ => isConnectionApprovalRejected = true);
multiplayClient.OnJoiningApprovalRejected
.Subscribe(_ => isJoiningApprovalRejected = true);

await UniTask.WaitUntil(() => playingReady || isConnectionApprovalRejected);
await UniTask.WaitUntil(() => playingReady || isJoiningApprovalRejected);

if (isConnectionApprovalRejected)
if (isJoiningApprovalRejected)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
Expand All @@ -161,18 +160,7 @@ private async UniTaskVoid StartTestAsync()
}
}

var player = default(NetworkObject);
foreach (var networkObject in NetworkManager.Singleton.SpawnManager.SpawnedObjects.Values)
{
if (networkObject.IsOwner)
{
if (logger.IsDebug())
{
logger.LogDebug("Get player object");
}
player = networkObject;
}
}
var player = multiplayClient.LocalClient.NetworkObjects[0];

var playerInput = player.GetComponent<StarterAssetsInputs>();
var messageInput = FindObjectOfType<TMP_InputField>();
Expand Down
9 changes: 4 additions & 5 deletions Assets/Holiday/App/AssetWorkflow/AssetHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ public class AssetHelper : DisposableBase

public MessageConfig MessageConfig { get; private set; }
public PeerConfig PeerConfig { get; private set; }
public HostConfig NgoHostConfig { get; private set; }
public ClientConfig NgoClientConfig { get; private set; }
public MessagingConfig MessagingConfig { get; private set; }
public MultiplayConfig MultiplayConfig { get; private set; }
public AvatarConfig AvatarConfig { get; private set; }

public VoiceChatConfig VoiceChatConfig { get; private set; }
Expand Down Expand Up @@ -60,9 +60,8 @@ public void DownloadCommonAssetAsync(StageName nextStage)
PeerConfig = await LoadAndReleaseAsync<P2PConfig, PeerConfig>(asset => asset.PeerConfig);
AvatarConfig = await LoadAndAddToDisposablesAsync<AvatarConfig>();
SpaceConfig = await LoadAndAddToDisposablesAsync<SpaceConfig>();
(NgoHostConfig, NgoClientConfig)
= await LoadAndReleaseAsync<MultiplayConfig, (HostConfig, ClientConfig)>(
asset => (asset.HostConfig, asset.ClientConfig));
MessagingConfig = await LoadAndAddToDisposablesAsync<MessagingConfig>();
MultiplayConfig = await LoadAndAddToDisposablesAsync<MultiplayConfig>();
VoiceChatConfig = await LoadAndReleaseAsync<ChatConfig, VoiceChatConfig>(
asset => asset.VoiceChatConfig);
LandscapeConfig = await LoadAndAddToDisposablesAsync<LandscapeConfig>();
Expand Down
6 changes: 2 additions & 4 deletions Assets/Holiday/App/Config/MessageConfig.asset
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,9 @@ MonoBehaviour:
retry.
p2PUnexpectedDisconnectedMessage: P2P disconnected unexpectedly.
p2PHostNameAlreadyExistsMessage: Host name already exists
textChatMessagingGroupNameAlreadyExistsMessage: Text chat group name already exists
textChatUnexpectedDisconnectedMessage: Text chat disconnected unexpectedly.
multiplayConnectionApprovalRejectedMessage: Space is full.
multiplayConnectRetryMessage: 'Reconnect to multiplayer : {0}'
multiplayConnectRetrySuccessMessage: Successfully reconnected to multiplayer.
multiplayConnectRetryFailureMessage: Failed to reconnect to multiplayer. If you
wish to reconnect, please re-enter the space.
multiplayUnexpectedDisconnectedMessage: Multiplayer disconnected unexpectedly.
landscapeErrorMessage: An error occurred on Landscape playback. If you wish to
play Landscape, please re-enter the space.
12 changes: 6 additions & 6 deletions Assets/Holiday/App/Config/MessageConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ public class MessageConfig : ScriptableObject
[SerializeField] private string p2PUnexpectedDisconnectedMessage;
[SerializeField] private string p2PHostNameAlreadyExistsMessage;

[SerializeField] private string textChatMessagingGroupNameAlreadyExistsMessage;
[SerializeField] private string textChatUnexpectedDisconnectedMessage;

[SerializeField] private string multiplayConnectionApprovalRejectedMessage;
[SerializeField] private string multiplayConnectRetryMessage;
[SerializeField] private string multiplayConnectRetrySuccessMessage;
[SerializeField] private string multiplayConnectRetryFailureMessage;
[SerializeField] private string multiplayUnexpectedDisconnectedMessage;

[SerializeField] private string landscapeErrorMessage;
Expand All @@ -55,10 +55,10 @@ public class MessageConfig : ScriptableObject
public string P2PUnexpectedDisconnectedMessage => p2PUnexpectedDisconnectedMessage;
public string P2PHostNameAlreadyExistsMessage => p2PHostNameAlreadyExistsMessage;

public string TextChatMessagingGroupNameAlreadyExistsMessage => textChatMessagingGroupNameAlreadyExistsMessage;
public string TextChatUnexpectedDisconnectedMessage => textChatUnexpectedDisconnectedMessage;

public string MultiplayConnectionApprovalRejectedMessage => multiplayConnectionApprovalRejectedMessage;
public string MultiplayConnectRetryMessage => multiplayConnectRetryMessage;
public string MultiplayConnectRetrySuccessMessage => multiplayConnectRetrySuccessMessage;
public string MultiplayConnectRetryFailureMessage => multiplayConnectRetryFailureMessage;
public string MultiplayUnexpectedDisconnectedMessage => multiplayUnexpectedDisconnectedMessage;

public string LandscapeErrorMessage => landscapeErrorMessage;
Expand Down
17 changes: 17 additions & 0 deletions Assets/Holiday/App/Config/MessagingConfig.asset
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 76bb3a6d466fc304aa61e96ddb7d4e17, type: 3}
m_Name: MessagingConfig
m_EditorClassIdentifier:
messagingUrl: http://localhost:3030
timeoutSeconds: 3
maxCapacity: 100

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions Assets/Holiday/App/Config/MessagingConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System;
using System.Diagnostics.CodeAnalysis;
using Extreal.Integration.Messaging.Redis;
using SocketIOClient;
using UnityEngine;

namespace Extreal.SampleApp.Holiday.App.Config
{
[CreateAssetMenu(
menuName = nameof(Holiday) + "/" + nameof(MessagingConfig),
fileName = nameof(MessagingConfig))]
public class MessagingConfig : ScriptableObject
{
public RedisMessagingConfig RedisMessagingConfig
=> new RedisMessagingConfig(
messagingUrl,
new SocketIOOptions
{
ConnectionTimeout = TimeSpan.FromSeconds(timeoutSeconds),
Reconnection = false,
});
[SerializeField, SuppressMessage("Usage", "CC0052")] private string messagingUrl = "http://127.0.0.1:3030";
[SerializeField, SuppressMessage("Usage", "CC0052")] private int timeoutSeconds = 3;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions Assets/Holiday/App/Config/MultiplayConfig.asset
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 2bfcdf6ca3c38324b867d93472b881dc, type: 3}
m_Name: MultiplayConfig
m_EditorClassIdentifier:
hostMaxCapacity: 10
clientTimeoutSeconds: 60
clientMaxRetryCount: 1
messagingUrl: http://127.0.0.1:3030
timeoutSeconds: 3
maxCapacity: 100
36 changes: 2 additions & 34 deletions Assets/Holiday/App/Config/MultiplayConfig.cs
Original file line number Diff line number Diff line change
@@ -1,43 +1,11 @@
using System;
using System.Diagnostics.CodeAnalysis;
using Extreal.Core.Common.Retry;
using Extreal.Integration.Multiplay.NGO;
using UnityEngine;
using UnityEngine;

namespace Extreal.SampleApp.Holiday.App.Config
{
[CreateAssetMenu(
menuName = nameof(Holiday) + "/" + nameof(MultiplayConfig),
fileName = nameof(MultiplayConfig))]
public class MultiplayConfig : ScriptableObject
public class MultiplayConfig : MessagingConfig
{
[SerializeField, SuppressMessage("Usage", "CC0052")] private int hostMaxCapacity = 10;
[SerializeField, SuppressMessage("Usage", "CC0052")] private int clientTimeoutSeconds = 5;
[SerializeField, SuppressMessage("Usage", "CC0052")] private int clientMaxRetryCount = 3;

public HostConfig HostConfig => new HostConfig(hostMaxCapacity);
public ClientConfig ClientConfig => new ClientConfig(clientTimeoutSeconds, clientMaxRetryCount);
}

public class HostConfig
{
public NgoConfig NgoConfig { get; private set; }
public int MaxCapacity { get; private set; }
public HostConfig(int maxCapacity)
{
NgoConfig = new NgoConfig();
MaxCapacity = maxCapacity;
}
}

public class ClientConfig
{
public NgoConfig NgoConfig { get; private set; }
public IRetryStrategy RetryStrategy { get; private set; }
public ClientConfig(int timeoutSeconds, int maxRetryCount)
{
NgoConfig = new NgoConfig(timeout: TimeSpan.FromSeconds(timeoutSeconds));
RetryStrategy = new CountingRetryStrategy(maxRetryCount);
}
}
}
6 changes: 6 additions & 0 deletions Assets/Holiday/App/P2P/IMessageContent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Extreal.SampleApp.Holiday.App.P2P
{
public interface IMessageContent
{
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 21 additions & 16 deletions Assets/Holiday/App/P2P/Message.cs
Original file line number Diff line number Diff line change
@@ -1,33 +1,38 @@
using System;
using Unity.Netcode;
using System.Diagnostics.CodeAnalysis;
using UnityEngine;

namespace Extreal.SampleApp.Holiday.App.P2P
{
public struct Message : INetworkSerializable
[Serializable]
public class Message : ISerializationCallbackReceiver
{
public readonly MessageId MessageId => messageId;
private MessageId messageId;
public MessageId MessageId => messageId;
[SerializeField, SuppressMessage("Usage", "CC0052")] private MessageId messageId;

public readonly INetworkSerializable Content => content;
private INetworkSerializable content;
public IMessageContent Content { get; private set; }

public Message(MessageId messageId, INetworkSerializable content)
[SerializeField] private string contentType;
[SerializeField] private string contentJson;

public Message(MessageId messageId, IMessageContent content)
{
this.messageId = messageId;
this.content = content;
Content = content;
}

public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
public void OnAfterDeserialize()
{
var contentType = serializer.IsWriter ? content.GetType().ToString() : default;
serializer.SerializeValue(ref contentType);
if (serializer.IsReader)
if (!string.IsNullOrEmpty(contentType))
{
content = Activator.CreateInstance(Type.GetType(contentType)) as INetworkSerializable;
Content = JsonUtility.FromJson(contentJson, Type.GetType(contentType)) as IMessageContent;
}
}

serializer.SerializeValue(ref messageId);
content.NetworkSerialize(serializer);
public void OnBeforeSerialize()
{
contentType = Content != null ? Content.GetType().ToString() : default;
contentJson = JsonUtility.ToJson(Content);
}
}
}
}
4 changes: 3 additions & 1 deletion Assets/Holiday/App/P2P/MessageId.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ namespace Extreal.SampleApp.Holiday.App.P2P
{
public enum MessageId
{
None,
TextChat,
SpaceTransition
}
}
}