feat: adding dynamic prefabs to yamato (#100)

* adding DynamicAddressablesNetworkPrefabs to yamato

* fixed blocking yamato issue (implementation of name fetching that works outside editor)
This commit is contained in:
Fernando Cortez 2023-02-16 20:06:14 -05:00 коммит произвёл GitHub
Родитель 4852d5b7ce
Коммит 6b84ce4f5e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 81 добавлений и 18 удалений

Просмотреть файл

@ -28,4 +28,6 @@ projects:
- name: invaders - name: invaders
path: Basic/Invaders path: Basic/Invaders
- name: clientdriven - name: clientdriven
path: Basic/ClientDriven path: Basic/ClientDriven
- name: dynamicaddressablesnetworkprefabs
path: Basic/DynamicAddressablesNetworkPrefabs

Просмотреть файл

@ -172,14 +172,19 @@ namespace Game.ServerAuthoritativeLoadAllAsync
Debug.Log("Loading dynamic prefab on the clients..."); Debug.Log("Loading dynamic prefab on the clients...");
LoadAddressableClientRpc(assetGuid); LoadAddressableClientRpc(assetGuid);
// server is starting to load a prefab, update UI
m_InGameUI.ClientLoadedPrefabStatusChanged(NetworkManager.ServerClientId, assetGuid.GetHashCode(), "Undefined", InGameUI.LoadStatus.Loading);
await DynamicPrefabLoadingUtilities.LoadDynamicPrefab(assetGuid, m_InGameUI.ArtificialDelayMilliseconds); await DynamicPrefabLoadingUtilities.LoadDynamicPrefab(assetGuid, m_InGameUI.ArtificialDelayMilliseconds);
// server loaded a prefab, update UI with the loaded asset's name // server loaded a prefab, update UI with the loaded asset's name
DynamicPrefabLoadingUtilities.TryGetLoadedGameObjectFromGuid(assetGuid, out var loadedGameObject); DynamicPrefabLoadingUtilities.TryGetLoadedGameObjectFromGuid(assetGuid, out var loadedGameObject);
m_InGameUI.ClientLoadedPrefabStatusChanged(NetworkManager.ServerClientId, assetGuid.GetHashCode(), loadedGameObject.Result.name, InGameUI.LoadStatus.Loaded);
// every client loaded dynamic prefab, their respective ClientUIs in case they loaded first
foreach (var client in m_NetworkManager.ConnectedClients.Keys)
{
m_InGameUI.ClientLoadedPrefabStatusChanged(client,
assetGuid.GetHashCode(),
loadedGameObject.Result.name,
InGameUI.LoadStatus.Loading);
}
} }
} }
@ -214,13 +219,20 @@ namespace Game.ServerAuthoritativeLoadAllAsync
DynamicPrefabLoadingUtilities.RecordThatClientHasLoadedAPrefab(prefabHash, rpcParams.Receive.SenderClientId); DynamicPrefabLoadingUtilities.RecordThatClientHasLoadedAPrefab(prefabHash, rpcParams.Receive.SenderClientId);
// a quick way to grab a matching prefab reference's name via its prefabHash // a quick way to grab a matching prefab reference's name via its prefabHash
var loadedPrefabName = prefabHash.ToString(); var loadedPrefabName = "Undefined";
foreach (var prefabReference in m_DynamicPrefabReferences) foreach (var prefabReference in m_DynamicPrefabReferences)
{ {
var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID }; var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID };
if (prefabReferenceGuid.GetHashCode() == prefabHash) if (prefabReferenceGuid.GetHashCode() == prefabHash)
{ {
loadedPrefabName = prefabReference.editorAsset.name; // found the matching prefab reference
if (DynamicPrefabLoadingUtilities.LoadedDynamicPrefabResourceHandles.TryGetValue(
prefabReferenceGuid,
out var loadedGameObject))
{
// if it is loaded on the server, update the name on the ClientUI
loadedPrefabName = loadedGameObject.Result.name;
}
break; break;
} }
} }

Просмотреть файл

@ -220,6 +220,16 @@ namespace Game.ServerAuthoritativeSynchronousSpawning
var obj = Instantiate(prefab.Result, position, rotation).GetComponent<NetworkObject>(); var obj = Instantiate(prefab.Result, position, rotation).GetComponent<NetworkObject>();
obj.Spawn(); obj.Spawn();
Debug.Log("Spawned dynamic prefab"); Debug.Log("Spawned dynamic prefab");
// every client loaded dynamic prefab, their respective ClientUIs in case they loaded first
foreach (var client in m_NetworkManager.ConnectedClients.Keys)
{
m_InGameUI.ClientLoadedPrefabStatusChanged(client,
assetGuid.GetHashCode(),
prefab.Result.name,
InGameUI.LoadStatus.Loading);
}
return obj; return obj;
} }
} }
@ -257,13 +267,20 @@ namespace Game.ServerAuthoritativeSynchronousSpawning
rpcParams.Receive.SenderClientId); rpcParams.Receive.SenderClientId);
// a quick way to grab a matching prefab reference's name via its prefabHash // a quick way to grab a matching prefab reference's name via its prefabHash
var loadedPrefabName = prefabHash.ToString(); var loadedPrefabName = "Undefined";
foreach (var prefabReference in m_DynamicPrefabReferences) foreach (var prefabReference in m_DynamicPrefabReferences)
{ {
var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID }; var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID };
if (prefabReferenceGuid.GetHashCode() == prefabHash) if (prefabReferenceGuid.GetHashCode() == prefabHash)
{ {
loadedPrefabName = prefabReference.editorAsset.name; // found the matching prefab reference
if (DynamicPrefabLoadingUtilities.LoadedDynamicPrefabResourceHandles.TryGetValue(
prefabReferenceGuid,
out var loadedGameObject))
{
// if it is loaded on the server, update the name on the ClientUI
loadedPrefabName = loadedGameObject.Result.name;
}
break; break;
} }
} }

Просмотреть файл

@ -280,13 +280,20 @@ namespace Game.ServerAuthoritativeNetworkVisibilitySpawning
} }
// a quick way to grab a matching prefab reference's name via its prefabHash // a quick way to grab a matching prefab reference's name via its prefabHash
var loadedPrefabName = prefabHash.ToString(); var loadedPrefabName = "Undefined";
foreach (var prefabReference in m_DynamicPrefabReferences) foreach (var prefabReference in m_DynamicPrefabReferences)
{ {
var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID }; var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID };
if (prefabReferenceGuid.GetHashCode() == prefabHash) if (prefabReferenceGuid.GetHashCode() == prefabHash)
{ {
loadedPrefabName = prefabReference.editorAsset.name; // found the matching prefab reference
if (DynamicPrefabLoadingUtilities.LoadedDynamicPrefabResourceHandles.TryGetValue(
prefabReferenceGuid,
out var loadedGameObject))
{
// if it is loaded on the server, update the name on the ClientUI
loadedPrefabName = loadedGameObject.Result.name;
}
break; break;
} }
} }

Просмотреть файл

@ -226,20 +226,28 @@ namespace Game.APIPlayground
// update UI for each client that is requested to load a certain prefab // update UI for each client that is requested to load a certain prefab
foreach (var client in m_NetworkManager.ConnectedClients.Keys) foreach (var client in m_NetworkManager.ConnectedClients.Keys)
{ {
m_InGameUI.ClientLoadedPrefabStatusChanged(client, assetGuid.GetHashCode(), "Undefined", InGameUI.LoadStatus.Loading); m_InGameUI.ClientLoadedPrefabStatusChanged(client,
assetGuid.GetHashCode(),
"Undefined",
InGameUI.LoadStatus.Loading);
} }
Debug.Log("Loading dynamic prefab on the clients..."); Debug.Log("Loading dynamic prefab on the clients...");
LoadAddressableClientRpc(assetGuid); LoadAddressableClientRpc(assetGuid);
// server is starting to load a prefab, update UI
m_InGameUI.ClientLoadedPrefabStatusChanged(NetworkManager.ServerClientId, assetGuid.GetHashCode(), "Undefined", InGameUI.LoadStatus.Loading);
await DynamicPrefabLoadingUtilities.LoadDynamicPrefab(assetGuid, m_InGameUI.ArtificialDelayMilliseconds); await DynamicPrefabLoadingUtilities.LoadDynamicPrefab(assetGuid, m_InGameUI.ArtificialDelayMilliseconds);
// server loaded a prefab, update UI with the loaded asset's name // server loaded a prefab, update UI with the loaded asset's name
DynamicPrefabLoadingUtilities.TryGetLoadedGameObjectFromGuid(assetGuid, out var loadedGameObject); DynamicPrefabLoadingUtilities.TryGetLoadedGameObjectFromGuid(assetGuid, out var loadedGameObject);
m_InGameUI.ClientLoadedPrefabStatusChanged(NetworkManager.ServerClientId, assetGuid.GetHashCode(), loadedGameObject.Result.name, InGameUI.LoadStatus.Loaded);
// every client loaded dynamic prefab, their respective ClientUIs in case they loaded first
foreach (var client in m_NetworkManager.ConnectedClients.Keys)
{
m_InGameUI.ClientLoadedPrefabStatusChanged(client,
assetGuid.GetHashCode(),
loadedGameObject.Result.name,
InGameUI.LoadStatus.Loading);
}
} }
} }
@ -322,6 +330,16 @@ namespace Game.APIPlayground
var obj = Instantiate(prefab.Result, position, rotation).GetComponent<NetworkObject>(); var obj = Instantiate(prefab.Result, position, rotation).GetComponent<NetworkObject>();
obj.Spawn(); obj.Spawn();
Debug.Log("Spawned dynamic prefab"); Debug.Log("Spawned dynamic prefab");
// every client loaded dynamic prefab, their respective ClientUIs in case they loaded first
foreach (var client in m_NetworkManager.ConnectedClients.Keys)
{
m_InGameUI.ClientLoadedPrefabStatusChanged(client,
assetGuid.GetHashCode(),
prefab.Result.name,
InGameUI.LoadStatus.Loading);
}
return obj; return obj;
} }
} }
@ -462,13 +480,20 @@ namespace Game.APIPlayground
} }
// a quick way to grab a matching prefab reference's name via its prefabHash // a quick way to grab a matching prefab reference's name via its prefabHash
var loadedPrefabName = prefabHash.ToString(); var loadedPrefabName = "Undefined";
foreach (var prefabReference in m_DynamicPrefabReferences) foreach (var prefabReference in m_DynamicPrefabReferences)
{ {
var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID }; var prefabReferenceGuid = new AddressableGUID() { Value = prefabReference.AssetGUID };
if (prefabReferenceGuid.GetHashCode() == prefabHash) if (prefabReferenceGuid.GetHashCode() == prefabHash)
{ {
loadedPrefabName = prefabReference.editorAsset.name; // found the matching prefab reference
if (DynamicPrefabLoadingUtilities.LoadedDynamicPrefabResourceHandles.TryGetValue(
prefabReferenceGuid,
out var loadedGameObject))
{
// if it is loaded on the server, update the name on the ClientUI
loadedPrefabName = loadedGameObject.Result.name;
}
break; break;
} }
} }