Skip to content

Commit

Permalink
大規模マルチプレイおよびテキストチャットを導入 (#23)
Browse files Browse the repository at this point in the history
Co-authored-by: Cho Kinken <mahaweilu@gmail.com>
Co-authored-by: sus-yoshikane-t <yoshikane-t@m.sus-g.co.jp>
  • Loading branch information
3 people committed Feb 5, 2024
1 parent 6a052e7 commit bd0724f
Show file tree
Hide file tree
Showing 95 changed files with 1,696 additions and 1,466 deletions.
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
}
}
}

0 comments on commit bd0724f

Please sign in to comment.