Skip to content

Commit

Permalink
Merge branch 'develop' into chore/test-project-updates-2023-Q3
Browse files Browse the repository at this point in the history
  • Loading branch information
NoelStephensUnity authored Aug 25, 2023
2 parents 6bebd70 + d379198 commit f62e17f
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 8 deletions.
4 changes: 4 additions & 0 deletions com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ Additional documentation and release notes are available at [Multiplayer Documen

- Fixed issue where `NetworkAnimator` was not internally tracking changes to layer weights which prevented proper layer weight synchronization back to the original layer weight value. (#2674)
- Fixed "writing past the end of the buffer" error when calling ResetDirty() on managed network variables that are larger than 256 bytes when serialized. (#2670)
- Fixed issue where generation of the `DefaultNetworkPrefabs` asset was not enabled by default. (#2662)
- Fixed issue where the `GlobalObjectIdHash` value could be updated but the asset not marked as dirty. (#2662)
- Fixed issue where the `GlobalObjectIdHash` value of a (network) prefab asset could be assigned an incorrect value when editing the prefab in a temporary scene. (#2662)
- Fixed issue where the `GlobalObjectIdHash` value generated after creating a (network) prefab from an object constructed within the scene would not be the correct final value in a stand alone build. (#2662)

### Changed

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ private void OnEnable()
}

[SerializeField]
public bool GenerateDefaultNetworkPrefabs;
public bool GenerateDefaultNetworkPrefabs = true;

internal void SaveSettings()
{
Expand Down
81 changes: 75 additions & 6 deletions com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
#if UNITY_EDITOR
using UnityEditor;
#if UNITY_2021_2_OR_NEWER
using UnityEditor.SceneManagement;
#else
using UnityEditor.Experimental.SceneManagement;
#endif
#endif
using UnityEngine;
using UnityEngine.SceneManagement;


namespace Unity.Netcode
{
/// <summary>
Expand Down Expand Up @@ -37,9 +46,9 @@ public uint PrefabIdHash
}
}

private bool m_IsPrefab;

#if UNITY_EDITOR
private const string k_GlobalIdTemplate = "GlobalObjectId_V1-{0}-{1}-{2}-{3}";

private void OnValidate()
{
GenerateGlobalObjectIdHash();
Expand All @@ -48,19 +57,79 @@ private void OnValidate()
internal void GenerateGlobalObjectIdHash()
{
// do NOT regenerate GlobalObjectIdHash for NetworkPrefabs while Editor is in PlayMode
if (UnityEditor.EditorApplication.isPlaying && !string.IsNullOrEmpty(gameObject.scene.name))
if (EditorApplication.isPlaying && !string.IsNullOrEmpty(gameObject.scene.name))
{
return;
}

// do NOT regenerate GlobalObjectIdHash if Editor is transitioning into or out of PlayMode
if (!UnityEditor.EditorApplication.isPlaying && UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode)
if (!EditorApplication.isPlaying && EditorApplication.isPlayingOrWillChangePlaymode)
{
return;
}

var globalObjectIdString = UnityEditor.GlobalObjectId.GetGlobalObjectIdSlow(this).ToString();
GlobalObjectIdHash = XXHash.Hash32(globalObjectIdString);
// Get a global object identifier for this network prefab
var globalId = GetGlobalId();

// if the identifier type is 0, then don't update the GlobalObjectIdHash
if (globalId.identifierType == 0)
{
return;
}

var oldValue = GlobalObjectIdHash;
GlobalObjectIdHash = globalId.ToString().Hash32();

// If the GlobalObjectIdHash value changed, then mark the asset dirty
if (GlobalObjectIdHash != oldValue)
{
EditorUtility.SetDirty(this);
}
}

private GlobalObjectId GetGlobalId()
{
var instanceGlobalId = GlobalObjectId.GetGlobalObjectIdSlow(this);

// Check if we are directly editing the prefab
var stage = PrefabStageUtility.GetPrefabStage(gameObject);

// if we are not editing the prefab directly (or a sub-prefab), then return the object identifier
if (stage == null || stage.assetPath == null)
{
return instanceGlobalId;
}

// If the asset doesn't exist at the given path, then return the object identifier
var theAsset = AssetDatabase.LoadAssetAtPath<NetworkObject>(stage.assetPath);
if (theAsset == null)
{
return instanceGlobalId;
}

// If we can't get the asset GUID and/or the file identifier, then return the object identifier
if (!AssetDatabase.TryGetGUIDAndLocalFileIdentifier(theAsset, out var guid, out long localFileId))
{
Debug.Log($"[GlobalObjectId Gen][{theAsset.gameObject.name}] Failed to get GUID or the local file identifier. Returning default ({instanceGlobalId}).");
return instanceGlobalId;
}

// If we reached this point, then we are most likely opening a prefab to edit.
// The instanceGlobalId will be constructed as if it is a scene object, however when it
// is serialized its value will be treated as a file asset (the "why" to the below code).

// Construct an imported asset identifier with the type being a source asset (type 3).
var prefabGlobalIdText = string.Format(k_GlobalIdTemplate, 3, guid, localFileId, 0);

// If we can't parse the result log an error and return the instanceGlobalId
if (!GlobalObjectId.TryParse(prefabGlobalIdText, out var prefabGlobalId))
{
Debug.LogError($"[GlobalObjectId Gen] Failed to parse ({prefabGlobalIdText}) returning default ({instanceGlobalId})");
return instanceGlobalId;
}

// Otherwise, return the constructed identifier.
return prefabGlobalId;
}
#endif // UNITY_EDITOR

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -919,6 +919,11 @@ private static IEnumerator ExecuteWaitForHook(MessageHandleCheckWithResult check
var res = check.Result;
result.Result = res;
}

public static uint GetGlobalObjectIdHash(NetworkObject networkObject)
{
return networkObject.GlobalObjectIdHash;
}
}

// Empty MonoBehaviour that is a holder of coroutine
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ public void StopMoving()
IsMoving = false;
}

private const int k_MaxThresholdFailures = 4;
private int m_ExceededThresholdCount;

protected override void Update()
{
base.Update();
Expand All @@ -73,7 +76,19 @@ protected override void Update()
{
if (transform.position.y < -MinThreshold || transform.position.y > Application.targetFrameRate + MinThreshold)
{
Debug.LogError($"Interpolation failure. transform.position.y is {transform.position.y}. Should be between 0.0 and 100.0. Current threshold is [+/- {MinThreshold}].");
// Temporary work around for this test.
// Really, this test needs to be completely re-written.
m_ExceededThresholdCount++;
// If we haven't corrected ourselves within the maximum number of updates then throw an error.
if (m_ExceededThresholdCount > k_MaxThresholdFailures)
{
Debug.LogError($"Interpolation failure. transform.position.y is {transform.position.y}. Should be between 0.0 and 100.0. Current threshold is [+/- {MinThreshold}].");
}
}
else
{
// If corrected, then reset our count
m_ExceededThresholdCount = 0;
}
}

Expand Down

0 comments on commit f62e17f

Please sign in to comment.