diff --git a/.yamato/project.metafile b/.yamato/project.metafile
index 938bbf2d74..1c3037a322 100644
--- a/.yamato/project.metafile
+++ b/.yamato/project.metafile
@@ -24,7 +24,7 @@
small_agent_platform:
- name: ubuntu
type: Unity::VM
- image: package-ci/ubuntu-22.04:v4.82.0
+ image: package-ci/ubuntu-22.04:v4.83.0
flavor: b1.small
@@ -39,13 +39,13 @@ test_platforms:
default:
- name: ubuntu
type: Unity::VM
- image: package-ci/ubuntu-22.04:v4.82.0
+ image: package-ci/ubuntu-22.04:v4.83.0
flavor: b1.large
standalone: StandaloneLinux64
desktop:
- name: ubuntu
type: Unity::VM
- image: package-ci/ubuntu-22.04:v4.82.0
+ image: package-ci/ubuntu-22.04:v4.83.0
flavor: b1.large
smaller_flavor: b1.medium
larger_flavor: b1.xlarge
diff --git a/.yamato/wrench/api-validation-jobs.yml b/.yamato/wrench/api-validation-jobs.yml
index f2598a6e86..be216a364d 100644
--- a/.yamato/wrench/api-validation-jobs.yml
+++ b/.yamato/wrench/api-validation-jobs.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.ApiValidationJobs
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
all_api_validation_jobs:
name: All API Validation Jobs
@@ -59,8 +60,8 @@ api_validation_-_netcode_gameobjects_-_6000_0_-_win10:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
diff --git a/.yamato/wrench/package-pack-jobs.yml b/.yamato/wrench/package-pack-jobs.yml
index 92a5b5380a..b63cba9414 100644
--- a/.yamato/wrench/package-pack-jobs.yml
+++ b/.yamato/wrench/package-pack-jobs.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.PackagePackJobs
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
# Pack Netcode for GameObjects
@@ -28,5 +29,5 @@ package_pack_-_netcode_gameobjects:
UPMCI_ACK_LARGE_PACKAGE: 1
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
diff --git a/.yamato/wrench/player-build.yml b/.yamato/wrench/player-build.yml
index 9b12542efb..045bc445c6 100644
--- a/.yamato/wrench/player-build.yml
+++ b/.yamato/wrench/player-build.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.PlayerBuild
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
{}
diff --git a/.yamato/wrench/player-test.yml b/.yamato/wrench/player-test.yml
index 9b12542efb..987c22132a 100644
--- a/.yamato/wrench/player-test.yml
+++ b/.yamato/wrench/player-test.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.PlayerTest
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
{}
diff --git a/.yamato/wrench/preview-a-p-v.yml b/.yamato/wrench/preview-a-p-v.yml
index 9a136fd51f..ed2aa45eaf 100644
--- a/.yamato/wrench/preview-a-p-v.yml
+++ b/.yamato/wrench/preview-a-p-v.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.PreviewAPV
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
# Parent Preview APV Job.
@@ -26,7 +27,7 @@ all_preview_apv_jobs:
- path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_6000_6_-_win10
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.0 manifest (MacOS).
preview_apv_-_6000_0_-_macos13:
@@ -81,10 +82,10 @@ preview_apv_-_6000_0_-_macos13:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.0 manifest (Ubuntu).
preview_apv_-_6000_0_-_ubuntu2204:
@@ -139,10 +140,10 @@ preview_apv_-_6000_0_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.0 manifest (Windows).
preview_apv_-_6000_0_-_win10:
@@ -198,10 +199,10 @@ preview_apv_-_6000_0_-_win10:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.3 manifest (MacOS).
preview_apv_-_6000_3_-_macos13:
@@ -256,10 +257,10 @@ preview_apv_-_6000_3_-_macos13:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.3 manifest (Ubuntu).
preview_apv_-_6000_3_-_ubuntu2204:
@@ -314,10 +315,10 @@ preview_apv_-_6000_3_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.3 manifest (Windows).
preview_apv_-_6000_3_-_win10:
@@ -373,10 +374,10 @@ preview_apv_-_6000_3_-_win10:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.4 manifest (MacOS).
preview_apv_-_6000_4_-_macos13:
@@ -431,10 +432,10 @@ preview_apv_-_6000_4_-_macos13:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.4 manifest (Ubuntu).
preview_apv_-_6000_4_-_ubuntu2204:
@@ -489,10 +490,10 @@ preview_apv_-_6000_4_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.4 manifest (Windows).
preview_apv_-_6000_4_-_win10:
@@ -548,10 +549,10 @@ preview_apv_-_6000_4_-_win10:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.5 manifest (MacOS).
preview_apv_-_6000_5_-_macos13:
@@ -606,10 +607,10 @@ preview_apv_-_6000_5_-_macos13:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.5 manifest (Ubuntu).
preview_apv_-_6000_5_-_ubuntu2204:
@@ -664,10 +665,10 @@ preview_apv_-_6000_5_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.5 manifest (Windows).
preview_apv_-_6000_5_-_win10:
@@ -723,10 +724,10 @@ preview_apv_-_6000_5_-_win10:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.6 manifest (MacOS).
preview_apv_-_6000_6_-_macos13:
@@ -781,10 +782,10 @@ preview_apv_-_6000_6_-_macos13:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.6 manifest (Ubuntu).
preview_apv_-_6000_6_-_ubuntu2204:
@@ -839,10 +840,10 @@ preview_apv_-_6000_6_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Functional tests for dependents found in the latest 6000.6 manifest (Windows).
preview_apv_-_6000_6_-_win10:
@@ -898,8 +899,8 @@ preview_apv_-_6000_6_-_win10:
UNITY_LICENSING_SERVER_DELETE_NUL: 0
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
diff --git a/.yamato/wrench/promotion-jobs.yml b/.yamato/wrench/promotion-jobs.yml
index 025fb25433..32e5f10efa 100644
--- a/.yamato/wrench/promotion-jobs.yml
+++ b/.yamato/wrench/promotion-jobs.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.PromotionJobs
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
# Publish Dry Run for netcode.gameobjects to https://artifactory-slo.bf.unity3d.com/artifactory/api/npm/upm-npm
@@ -182,10 +183,10 @@ publish_dry_run_netcode_gameobjects:
unzip: true
variables:
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
# Publish for netcode.gameobjects to https://artifactory-slo.bf.unity3d.com/artifactory/api/npm/upm-npm
publish_netcode_gameobjects:
@@ -364,8 +365,8 @@ publish_netcode_gameobjects:
unzip: true
variables:
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
diff --git a/.yamato/wrench/publish-trigger.yml b/.yamato/wrench/publish-trigger.yml
index c0f676fc5c..31be0f60eb 100644
--- a/.yamato/wrench/publish-trigger.yml
+++ b/.yamato/wrench/publish-trigger.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.PublishTrigger
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
all_promotion_related_jobs_promotiontrigger:
name: All Promotion Related Jobs PromotionTrigger
diff --git a/.yamato/wrench/recipe-regeneration.yml b/.yamato/wrench/recipe-regeneration.yml
index dcb9e6bf0d..df8c11e776 100644
--- a/.yamato/wrench/recipe-regeneration.yml
+++ b/.yamato/wrench/recipe-regeneration.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.RecipeRegeneration
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
# Test that Generated Wrench Jobs are up to date.
@@ -30,5 +31,5 @@ test_-_wrench_jobs_up_to_date:
cancel_old_ci: true
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
diff --git a/.yamato/wrench/validation-jobs.yml b/.yamato/wrench/validation-jobs.yml
index d540163492..c8b63a7d4d 100644
--- a/.yamato/wrench/validation-jobs.yml
+++ b/.yamato/wrench/validation-jobs.yml
@@ -3,6 +3,7 @@
### Auto-generated by Recipe Engine, DO NOT EDIT. ###
### ###
#######################################################
+# Source: RecipeEngine.Modules.Wrench.Recipes.ValidationJobs
# This job is generated by the wrench recipe engine module, see find the docs here: http://Go/ii2fb
# PVP Editor and Playmode tests for Validate - netcode.gameobjects - 6000.0 - macos13 (6000.0 - MacOS).
@@ -68,10 +69,10 @@ validate_-_netcode_gameobjects_-_6000_0_-_macos13:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -138,10 +139,10 @@ validate_-_netcode_gameobjects_-_6000_0_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -208,10 +209,10 @@ validate_-_netcode_gameobjects_-_6000_0_-_win10:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -278,10 +279,10 @@ validate_-_netcode_gameobjects_-_6000_3_-_macos13:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -348,10 +349,10 @@ validate_-_netcode_gameobjects_-_6000_3_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -418,10 +419,10 @@ validate_-_netcode_gameobjects_-_6000_3_-_win10:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -488,10 +489,10 @@ validate_-_netcode_gameobjects_-_6000_4_-_macos13:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -558,10 +559,10 @@ validate_-_netcode_gameobjects_-_6000_4_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -628,10 +629,10 @@ validate_-_netcode_gameobjects_-_6000_4_-_win10:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -698,10 +699,10 @@ validate_-_netcode_gameobjects_-_6000_5_-_macos13:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -768,10 +769,10 @@ validate_-_netcode_gameobjects_-_6000_5_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -838,10 +839,10 @@ validate_-_netcode_gameobjects_-_6000_5_-_win10:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -908,10 +909,10 @@ validate_-_netcode_gameobjects_-_6000_6_-_macos13:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -978,10 +979,10 @@ validate_-_netcode_gameobjects_-_6000_6_-_ubuntu2204:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
@@ -1048,10 +1049,10 @@ validate_-_netcode_gameobjects_-_6000_6_-_win10:
UNITY_LICENSING_SERVER_DELETE_ULF: 0
UNITY_LICENSING_SERVER_TOOLSET: pro
UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1
- UPMPVP_CONTEXT_WRENCH: 2.3.3.0
+ UPMPVP_CONTEXT_WRENCH: 2.5.0.0
metadata:
Job Maintainers: '#rm-packageworks'
- Wrench: 2.3.3.0
+ Wrench: 2.5.0.0
labels:
- Packages:netcode.gameobjects
diff --git a/.yamato/wrench/wrench_config.json b/.yamato/wrench/wrench_config.json
index 910c9238b0..a57beaa44f 100644
--- a/.yamato/wrench/wrench_config.json
+++ b/.yamato/wrench/wrench_config.json
@@ -39,7 +39,7 @@
},
"publishing_job": ".yamato/wrench/promotion-jobs.yml#publish_netcode_gameobjects",
"branch_pattern": "ReleaseSlash",
- "wrench_version": "2.3.3.0",
+ "wrench_version": "2.5.0.0",
"pvp_exemption_path": ".yamato/wrench/pvp-exemptions.json",
"cs_project_path": "Tools/CI/NGO.Cookbook.csproj"
}
\ No newline at end of file
diff --git a/Tools/CI/NGO.Cookbook.csproj b/Tools/CI/NGO.Cookbook.csproj
index 5fec97ef09..52bb92c863 100644
--- a/Tools/CI/NGO.Cookbook.csproj
+++ b/Tools/CI/NGO.Cookbook.csproj
@@ -8,11 +8,11 @@
-
-
+
+
-
+
diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md
index 7f561d4349..ed55793aba 100644
--- a/com.unity.netcode.gameobjects/CHANGELOG.md
+++ b/com.unity.netcode.gameobjects/CHANGELOG.md
@@ -13,6 +13,10 @@ Additional documentation and release notes are available at [Multiplayer Documen
### Changed
+- Improve performance of `NetworkBehaviour`. (#3915)
+- Improve performance of `NetworkTransform`. (#3907)
+- Improve performance of `NetworkRigidbodyBase`. (#3906)
+- Improve performance of `NetworkAnimator`. (#3905)
### Deprecated
@@ -22,6 +26,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
### Fixed
+- Fixed issue where attempts to use `NetworkLog` when there is no `NetworkManager` instance would result in an exception. (#3917)
### Security
diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs
index c8db9b0d47..7d82872890 100644
--- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs
@@ -194,7 +194,7 @@ internal void DeregisterUpdate()
internal NetworkAnimatorStateChangeHandler(NetworkAnimator networkAnimator)
{
m_NetworkAnimator = networkAnimator;
- m_IsServer = networkAnimator.NetworkManager.IsServer;
+ m_IsServer = networkAnimator.LocalNetworkManager.IsServer;
NetworkUpdateLoop.RegisterNetworkUpdate(this, NetworkUpdateStage.PreUpdate);
}
}
@@ -279,7 +279,7 @@ public Animator Animator
private Dictionary> m_DestinationStateToTransitioninfo = new Dictionary>();
// Named differently to avoid serialization conflicts with NetworkBehaviour
- private NetworkManager m_LocalNetworkManager;
+ internal NetworkManager LocalNetworkManager;
internal bool DistributedAuthorityMode;
@@ -915,8 +915,8 @@ internal AnimationMessage GetAnimationMessage()
internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager)
{
// Save internal state references
- m_LocalNetworkManager = networkManager;
- DistributedAuthorityMode = m_LocalNetworkManager.DistributedAuthorityMode;
+ LocalNetworkManager = networkManager;
+ DistributedAuthorityMode = LocalNetworkManager.DistributedAuthorityMode;
}
///
@@ -1176,7 +1176,7 @@ internal void CheckForAnimatorChanges()
if (m_Animator.runtimeAnimatorController == null)
{
- if (m_LocalNetworkManager.LogLevel == LogLevel.Developer)
+ if (LocalNetworkManager.LogLevel == LogLevel.Developer)
{
Debug.LogError($"[{GetType().Name}] Could not find an assigned {nameof(RuntimeAnimatorController)}! Cannot check {nameof(Animator)} for changes in state!");
}
@@ -1211,9 +1211,9 @@ internal void CheckForAnimatorChanges()
{
// Just notify all remote clients and not the local server
m_TargetGroup.Clear();
- foreach (var clientId in m_LocalNetworkManager.ConnectionManager.ConnectedClientIds)
+ foreach (var clientId in LocalNetworkManager.ConnectionManager.ConnectedClientIds)
{
- if (clientId == m_LocalNetworkManager.LocalClientId || !NetworkObject.Observers.Contains(clientId))
+ if (clientId == LocalNetworkManager.LocalClientId || !NetworkObject.Observers.Contains(clientId))
{
continue;
}
@@ -1241,7 +1241,7 @@ private void SendParametersUpdate(RpcParams rpcParams = default, bool sendDirect
}
else
{
- Debug.LogError($"[{name}][Client-{m_LocalNetworkManager.LocalClientId}] Attempting to send parameter updates but not the owner!");
+ Debug.LogError($"[{name}][Client-{LocalNetworkManager.LocalClientId}] Attempting to send parameter updates but not the owner!");
}
}
else
@@ -1491,18 +1491,18 @@ internal void UpdateAnimationState(AnimationState animationState)
// Cross fade from the current to the destination state for the transitions duration while starting at the server's current normalized time of the transition
m_Animator.CrossFade(transitionStateInfo.DestinationState, transitionStateInfo.TransitionDuration, transitionStateInfo.Layer, 0.0f, animationState.NormalizedTime);
}
- else if (m_LocalNetworkManager.LogLevel == LogLevel.Developer)
+ else if (LocalNetworkManager.LogLevel == LogLevel.Developer)
{
NetworkLog.LogWarning($"Current State Hash ({currentState.fullPathHash}) != AnimationState.StateHash ({animationState.StateHash})");
}
}
- else if (m_LocalNetworkManager.LogLevel == LogLevel.Developer)
+ else if (LocalNetworkManager.LogLevel == LogLevel.Developer)
{
NetworkLog.LogError($"[DestinationState To Transition Info] Layer ({animationState.Layer}) sub-table does not contain destination state ({animationState.DestinationStateHash})!");
}
}
// For reference, it is valid to have no transition information
- //else if (NetworkManager.LogLevel == LogLevel.Developer)
+ //else if (m_LocalNetworkManager.LogLevel == LogLevel.Developer)
//{
// NetworkLog.LogError($"[DestinationState To Transition Info] Layer ({animationState.Layer}) does not exist!");
//}
@@ -1539,7 +1539,7 @@ private unsafe void SendServerParametersUpdateRpc(ParametersUpdateMessage parame
return;
}
UpdateParameters(ref parametersUpdate);
- var connectedClientIds = m_LocalNetworkManager.ConnectionManager.ConnectedClientIds;
+ var connectedClientIds = LocalNetworkManager.ConnectionManager.ConnectedClientIds;
if (connectedClientIds.Count <= (IsHost ? 2 : 1))
{
return;
@@ -1605,7 +1605,7 @@ private void SendServerAnimStateRpc(AnimationMessage animationMessage, RpcParams
UpdateAnimationState(animationState);
}
- var connectedClientIds = m_LocalNetworkManager.ConnectionManager.ConnectedClientIds;
+ var connectedClientIds = LocalNetworkManager.ConnectionManager.ConnectedClientIds;
if (connectedClientIds.Count <= (IsHost ? 2 : 1))
{
return;
@@ -1652,7 +1652,7 @@ private void ProcessAnimStates(AnimationMessage animationMessage)
{
if (HasAuthority)
{
- if (m_LocalNetworkManager.LogLevel == LogLevel.Developer)
+ if (LocalNetworkManager.LogLevel == LogLevel.Developer)
{
var hostOrOwner = DistributedAuthorityMode ? "Owner" : "Host";
var clientServerOrDAMode = DistributedAuthorityMode ? "distributed authority" : "client-server";
@@ -1677,7 +1677,7 @@ internal void SendServerAnimTriggerRpc(AnimationTriggerMessage animationTriggerM
// Ignore if a non-owner sent this.
if (rpcParams.Receive.SenderClientId != OwnerClientId)
{
- if (m_LocalNetworkManager.LogLevel == LogLevel.Developer)
+ if (LocalNetworkManager.LogLevel == LogLevel.Developer)
{
NetworkLog.LogWarning($"[Owner Authoritative] Detected the a non-authoritative client is sending the server animation trigger updates. If you recently changed ownership of the {name} object, then this could be the reason.");
}
@@ -1687,7 +1687,7 @@ internal void SendServerAnimTriggerRpc(AnimationTriggerMessage animationTriggerM
// set the trigger locally on the server
InternalSetTrigger(animationTriggerMessage.Hash, animationTriggerMessage.IsTriggerSet);
- var connectedClientIds = m_LocalNetworkManager.ConnectionManager.ConnectedClientIds;
+ var connectedClientIds = LocalNetworkManager.ConnectionManager.ConnectedClientIds;
m_TargetGroup.Clear();
foreach (var clientId in connectedClientIds)
diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs
index 9fbf8a26c9..0d0de9afa8 100644
--- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs
@@ -52,6 +52,7 @@ public abstract class NetworkRigidbodyBase : NetworkBehaviour
#endif
+ private NetworkManager m_LocalNetworkManager;
// Used to cache the authority state of this Rigidbody during the last frame
private bool m_IsAuthority;
@@ -971,7 +972,7 @@ protected override void OnOwnershipChanged(ulong previous, ulong current)
///
internal void UpdateOwnershipAuthority()
{
- if (NetworkManager.DistributedAuthorityMode)
+ if (m_LocalNetworkManager.DistributedAuthorityMode)
{
// When in distributed authority mode, always use HasAuthority
m_IsAuthority = HasAuthority;
@@ -980,7 +981,7 @@ internal void UpdateOwnershipAuthority()
{
if (NetworkTransform.IsServerAuthoritative())
{
- m_IsAuthority = NetworkManager.IsServer;
+ m_IsAuthority = m_LocalNetworkManager.IsServer;
}
else
{
@@ -994,11 +995,16 @@ internal void UpdateOwnershipAuthority()
}
}
+ internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager)
+ {
+ m_LocalNetworkManager = networkManager;
+ }
+
///
public override void OnNetworkSpawn()
{
- m_TickFrequency = 1.0f / NetworkManager.NetworkConfig.TickRate;
- m_TickRate = NetworkManager.NetworkConfig.TickRate;
+ m_TickFrequency = 1.0f / m_LocalNetworkManager.NetworkConfig.TickRate;
+ m_TickRate = m_LocalNetworkManager.NetworkConfig.TickRate;
UpdateOwnershipAuthority();
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs
index 64e9bc0b95..3ca9093b34 100644
--- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs
@@ -1621,7 +1621,7 @@ internal bool SynchronizeScale
public bool CanCommitToTransform { get; protected set; }
///
- /// Internally used by to keep track of the instance assigned to this
+ /// Internally used by to keep track of the instance assigned to
/// this derived class instance.
///
protected NetworkManager m_CachedNetworkManager;
@@ -2136,9 +2136,8 @@ private bool CheckForStateChange(ref NetworkTransformState networkState, bool is
// We compare against the NetworkTickSystem version since ServerTime is set when updating ticks
if (UseUnreliableDeltas && !isSynchronization && m_DeltaSynch && m_NextTickSync <= CurrentTick)
{
- // TODO-CACHE: m_CachedNetworkManager.NetworkConfig.TickRate value
// Increment to the next frame synch tick position for this instance
- m_NextTickSync += (int)m_CachedNetworkManager.NetworkConfig.TickRate;
+ m_NextTickSync += m_CachedTickRate;
// If we are teleporting, we do not need to send a frame synch for this tick slot
// as a "frame synch" really is effectively just a teleport.
isAxisSync = !flagStates.IsTeleportingNextFrame;
@@ -2606,7 +2605,7 @@ private void OnNetworkTick(bool isCalledFromParent = false)
}
else // If we are no longer authority, unsubscribe to the tick event
{
- DeregisterForTickUpdate(this);
+ DeregisterForTickUpdate();
}
}
#endregion
@@ -3537,7 +3536,7 @@ private void ApplyPlayerTransformState()
///
/// For dynamically spawned NetworkObjects, when the non-authority instance's client is already connected and
- /// the SynchronizeState is still pending synchronization then we want to finalize the synchornization at this time.
+ /// the SynchronizeState is still pending synchronization then we want to finalize the synchronization at this time.
///
protected internal override void InternalOnNetworkPostSpawn()
{
@@ -3550,7 +3549,7 @@ protected internal override void InternalOnNetworkPostSpawn()
// Then we want to:
// - Force the "IsSynchronizing" flag so the NetworkTransform has its state updated properly and runs through the initialization again.
// - Make sure the SynchronizingState is updated to the instantiated prefab's default flags/settings.
- if (NetworkManager.IsServer && !NetworkManager.DistributedAuthorityMode && !IsOwner && !OnIsServerAuthoritative() && !SynchronizeState.IsSynchronizing)
+ if (m_CachedNetworkManager.IsServer && !m_CachedNetworkManager.DistributedAuthorityMode && !IsOwner && !OnIsServerAuthoritative() && !SynchronizeState.IsSynchronizing)
{
// Handle the first/root NetworkTransform slightly differently to have a sequenced synchronization of like authority nested NetworkTransform components
if (m_IsFirstNetworkTransform)
@@ -3578,7 +3577,7 @@ protected internal override void InternalOnNetworkPostSpawn()
}
// Standard non-authority synchronization is handled here
- if (!CanCommitToTransform && NetworkManager.IsConnectedClient && SynchronizeState.IsSynchronizing)
+ if (!CanCommitToTransform && m_CachedNetworkManager.IsConnectedClient && SynchronizeState.IsSynchronizing)
{
NonAuthorityFinalizeSynchronization();
}
@@ -3620,9 +3619,14 @@ protected virtual void Awake()
CachedTransform = transform;
}
+ private NetworkObject m_CachedNetworkObject;
+ private int m_CachedTickRate;
+
internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager)
{
m_CachedNetworkManager = networkManager;
+ m_CachedNetworkObject = NetworkObject;
+ m_CachedTickRate = (int)networkManager.NetworkConfig.TickRate;
CachedTransform = transform;
base.InternalOnNetworkPreSpawn(ref networkManager);
}
@@ -3631,7 +3635,6 @@ internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManag
public override void OnNetworkSpawn()
{
m_ParentedChildren.Clear();
- m_CachedNetworkManager = NetworkManager;
Initialize();
@@ -3639,6 +3642,7 @@ public override void OnNetworkSpawn()
{
SetState(GetSpaceRelativePosition(), GetSpaceRelativeRotation(), GetScale(), false);
}
+ base.OnNetworkSpawn();
}
private void CleanUpOnDestroyOrDespawn()
@@ -3651,10 +3655,10 @@ private void CleanUpOnDestroyOrDespawn()
#endif
if (m_CachedNetworkObject != null)
{
- NetworkManager?.NetworkTransformRegistration(m_CachedNetworkObject, forUpdate, false);
+ m_CachedNetworkManager?.NetworkTransformRegistration(m_CachedNetworkObject, forUpdate, false);
}
- DeregisterForTickUpdate(this);
+ DeregisterForTickUpdate();
CanCommitToTransform = false;
}
@@ -3697,7 +3701,7 @@ protected virtual void OnInitialize(ref NetworkVariable r
///
private void ResetInterpolatedStateToCurrentAuthoritativeState()
{
- var serverTime = NetworkManager.ServerTime.Time;
+ var serverTime = m_CachedNetworkManager.ServerTime.Time;
#if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D
var position = m_UseRigidbodyForMotion ? m_NetworkRigidbodyInternal.GetPosition() : GetSpaceRelativePosition();
var rotation = m_UseRigidbodyForMotion ? m_NetworkRigidbodyInternal.GetRotation() : GetSpaceRelativeRotation();
@@ -3717,9 +3721,9 @@ private void ResetInterpolatedStateToCurrentAuthoritativeState()
m_ScaleInterpolator.ResetTo(transform.parent, transform.localScale, serverTime);
}
- private NetworkObject m_CachedNetworkObject;
+
///
- /// The internal initialzation method to allow for internal API adjustments
+ /// The internal initialization method to allow for internal API adjustments
///
///
private void InternalInitialization(bool isOwnershipChange = false)
@@ -3728,10 +3732,9 @@ private void InternalInitialization(bool isOwnershipChange = false)
{
return;
}
- m_CachedNetworkObject = NetworkObject;
// Determine if this is the first NetworkTransform in the associated NetworkObject's list
- m_IsFirstNetworkTransform = NetworkObject.NetworkTransforms[0] == this;
+ m_IsFirstNetworkTransform = m_CachedNetworkObject.NetworkTransforms[0] == this;
if (m_CachedNetworkManager && m_CachedNetworkManager.DistributedAuthorityMode)
{
@@ -3755,9 +3758,9 @@ private void InternalInitialization(bool isOwnershipChange = false)
var currentPosition = GetSpaceRelativePosition();
var currentRotation = GetSpaceRelativeRotation();
- if (NetworkManager.DistributedAuthorityMode)
+ if (m_CachedNetworkManager.DistributedAuthorityMode)
{
- RegisterNetworkManagerForTickUpdate(NetworkManager);
+ RegisterNetworkManagerForTickUpdate(m_CachedNetworkManager);
}
#if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D
@@ -3793,7 +3796,7 @@ private void InternalInitialization(bool isOwnershipChange = false)
m_InternalCurrentPosition = currentPosition;
m_LastStateTargetPosition = currentPosition;
- RegisterForTickUpdate(this);
+ RegisterForTickUpdate();
if (UseHalfFloatPrecision && isOwnershipChange && !IsServerAuthoritative() && Interpolate)
{
@@ -3813,7 +3816,7 @@ private void InternalInitialization(bool isOwnershipChange = false)
// Non-authority needs to be added to updates for interpolation and applying state purposes
m_CachedNetworkManager.NetworkTransformRegistration(NetworkObject, forUpdate, true);
// Remove this instance from the tick update
- DeregisterForTickUpdate(this);
+ DeregisterForTickUpdate();
ResetInterpolatedStateToCurrentAuthoritativeState();
m_InternalCurrentPosition = currentPosition;
m_LastStateTargetPosition = currentPosition;
@@ -3941,7 +3944,7 @@ internal override void InternalOnNetworkObjectParentChanged(NetworkObject parent
if (LastTickSync == m_LocalAuthoritativeNetworkState.GetNetworkTick())
{
m_InternalCurrentPosition = m_LastStateTargetPosition = GetSpaceRelativePosition();
- m_PositionInterpolator.ResetTo(m_PositionInterpolator.Parent, m_InternalCurrentPosition, NetworkManager.ServerTime.Time);
+ m_PositionInterpolator.ResetTo(m_PositionInterpolator.Parent, m_InternalCurrentPosition, m_CachedNetworkManager.ServerTime.Time);
if (InLocalSpace)
{
transform.localPosition = m_InternalCurrentPosition;
@@ -3973,7 +3976,7 @@ internal override void InternalOnNetworkObjectParentChanged(NetworkObject parent
{
m_InternalCurrentRotation = GetSpaceRelativeRotation();
m_TargetRotation = m_InternalCurrentRotation.eulerAngles;
- m_RotationInterpolator.ResetTo(m_RotationInterpolator.Parent, m_InternalCurrentRotation, NetworkManager.ServerTime.Time);
+ m_RotationInterpolator.ResetTo(m_RotationInterpolator.Parent, m_InternalCurrentRotation, m_CachedNetworkManager.ServerTime.Time);
if (InLocalSpace)
{
transform.localRotation = m_InternalCurrentRotation;
@@ -4596,7 +4599,7 @@ internal void TransformStateUpdate()
{
// TODO: Investigate where this state should be applied or just discarded.
// For now, discard the state if we assumed ownership.
- // Debug.Log($"[Client-{NetworkManager.LocalClientId}] Ignoring inbound update from Client-{0} and parentUpdated:{isParentingDirective}!");
+ // Debug.Log($"[Client-{m_CachedNetworkManager.LocalClientId}] Ignoring inbound update from Client-{0} and parentUpdated:{isParentingDirective}!");
return;
}
// Store the previous/old state
@@ -4653,17 +4656,17 @@ private void UpdateTransformState()
{
continue;
}
- if (!NetworkObject.Observers.Contains(clientId))
+ if (!m_CachedNetworkObject.Observers.Contains(clientId))
{
continue;
}
- NetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, clientId);
+ m_CachedNetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, clientId);
}
}
else
{
// Clients (owner authoritative) send messages to the server-host
- NetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, NetworkManager.ServerClientId);
+ m_CachedNetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, NetworkManager.ServerClientId);
}
m_LocalAuthoritativeNetworkState.LastSerializedSize = m_OutboundMessage.BytesWritten;
}
@@ -4802,7 +4805,7 @@ public NetworkTransformTickRegistration(NetworkManager networkManager)
internal void RegisterForTickSynchronization()
{
s_TickSynchPosition++;
- m_NextTickSync = NetworkManager.ServerTime.Tick + (s_TickSynchPosition % (int)NetworkManager.NetworkConfig.TickRate);
+ m_NextTickSync = m_CachedNetworkManager.ServerTime.Tick + (s_TickSynchPosition % m_CachedTickRate);
}
private static void RegisterNetworkManagerForTickUpdate(NetworkManager networkManager)
@@ -4818,36 +4821,34 @@ private static void RegisterNetworkManagerForTickUpdate(NetworkManager networkMa
/// If a NetworkTransformTickRegistration has not yet been registered for the NetworkManager
/// instance, then create an entry.
///
- ///
- private static void RegisterForTickUpdate(NetworkTransform networkTransform)
+ private void RegisterForTickUpdate()
{
- if (!networkTransform.NetworkManager.DistributedAuthorityMode && !s_NetworkTickRegistration.ContainsKey(networkTransform.NetworkManager))
+ if (!m_CachedNetworkManager.DistributedAuthorityMode && !s_NetworkTickRegistration.ContainsKey(m_CachedNetworkManager))
{
- s_NetworkTickRegistration.Add(networkTransform.NetworkManager, new NetworkTransformTickRegistration(networkTransform.NetworkManager));
+ s_NetworkTickRegistration.Add(m_CachedNetworkManager, new NetworkTransformTickRegistration(m_CachedNetworkManager));
}
- networkTransform.RegisterForTickSynchronization();
- s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Add(networkTransform);
+ RegisterForTickSynchronization();
+ s_NetworkTickRegistration[m_CachedNetworkManager].NetworkTransforms.Add(this);
}
///
/// If a NetworkTransformTickRegistration exists for the NetworkManager instance, then this will
/// remove the NetworkTransform instance from the single tick update entry point.
///
- ///
- private static void DeregisterForTickUpdate(NetworkTransform networkTransform)
+ private void DeregisterForTickUpdate()
{
- if (networkTransform.NetworkManager == null)
+ if (m_CachedNetworkManager == null)
{
return;
}
- if (s_NetworkTickRegistration.ContainsKey(networkTransform.NetworkManager))
+ if (s_NetworkTickRegistration.ContainsKey(m_CachedNetworkManager))
{
- s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Remove(networkTransform);
- if (!networkTransform.NetworkManager.DistributedAuthorityMode && s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Count == 0)
+ s_NetworkTickRegistration[m_CachedNetworkManager].NetworkTransforms.Remove(this);
+ if (!m_CachedNetworkManager.DistributedAuthorityMode && s_NetworkTickRegistration[m_CachedNetworkManager].NetworkTransforms.Count == 0)
{
- var registrationEntry = s_NetworkTickRegistration[networkTransform.NetworkManager];
+ var registrationEntry = s_NetworkTickRegistration[m_CachedNetworkManager];
registrationEntry.Remove();
}
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs
index 058fb6a38b..fbfb780028 100644
--- a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs
@@ -1113,18 +1113,20 @@ private void SendConnectionApprovedMessage(ulong approvedClientId)
///
internal void CreateAndSpawnPlayer(ulong ownerId)
{
- if (NetworkManager.DistributedAuthorityMode && NetworkManager.AutoSpawnPlayerPrefabClientSide)
+ var playerPrefab = NetworkManager.FetchLocalPlayerPrefabToSpawn();
+ if (playerPrefab == null)
{
- var playerPrefab = NetworkManager.FetchLocalPlayerPrefabToSpawn();
- if (playerPrefab != null)
+ if (NetworkManager.LogLevel <= LogLevel.Developer)
{
- var globalObjectIdHash = playerPrefab.GetComponent().GlobalObjectIdHash;
- var networkObject = NetworkManager.SpawnManager.GetNetworkObjectToSpawn(globalObjectIdHash, ownerId, playerPrefab.transform.position, playerPrefab.transform.rotation);
- networkObject.IsSceneObject = false;
- networkObject.NetworkManagerOwner = NetworkManager;
- networkObject.SpawnAsPlayerObject(ownerId, networkObject.DestroyWithScene);
+ NetworkLog.LogWarning("Could not fetch a local player to spawn. Ensure PlayerPrefab is set in NetcodeConfig.");
}
+ return;
}
+ var globalObjectIdHash = playerPrefab.GetComponent().GlobalObjectIdHash;
+ var networkObject = NetworkManager.SpawnManager.GetNetworkObjectToSpawn(globalObjectIdHash, ownerId, playerPrefab.transform.position, playerPrefab.transform.rotation);
+ networkObject.IsSceneObject = false;
+ networkObject.NetworkManagerOwner = NetworkManager;
+ networkObject.SpawnAsPlayerObject(ownerId, networkObject.DestroyWithScene);
}
///
diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs
index 3d3c919986..049f28070b 100644
--- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs
@@ -90,7 +90,6 @@ internal FastBufferWriter __beginSendServerRpc(uint rpcMethodId, ServerRpcParams
internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery)
#pragma warning restore IDE1006 // restore naming rule violation check
{
- var networkManager = m_NetworkManager;
var serverRpcMessage = new ServerRpcMessage
{
Metadata = new RpcMetadata
@@ -110,7 +109,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
networkDelivery = MessageDeliveryType.DefaultDelivery;
break;
case RpcDelivery.Unreliable:
- if (bufferWriter.Length > networkManager.MessageManager.NonFragmentedMessageMaxSize)
+ if (bufferWriter.Length > m_NetworkManager.MessageManager.NonFragmentedMessageMaxSize)
{
throw new OverflowException("RPC parameters are too large for unreliable delivery.");
}
@@ -127,8 +126,8 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
var context = new NetworkContext
{
SenderId = NetworkManager.ServerClientId,
- Timestamp = networkManager.RealTimeProvider.RealTimeSinceStartup,
- SystemOwner = networkManager,
+ Timestamp = m_NetworkManager.RealTimeProvider.RealTimeSinceStartup,
+ SystemOwner = m_NetworkManager,
// header information isn't valid since it's not a real message.
// RpcMessage doesn't access this stuff so it's just left empty.
Header = new NetworkMessageHeader(),
@@ -141,7 +140,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
}
else
{
- rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref serverRpcMessage, networkDelivery, NetworkManager.ServerClientId);
+ rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref serverRpcMessage, networkDelivery, NetworkManager.ServerClientId);
}
bufferWriter.Dispose();
@@ -169,7 +168,6 @@ internal FastBufferWriter __beginSendClientRpc(uint rpcMethodId, ClientRpcParams
internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery)
#pragma warning restore IDE1006 // restore naming rule violation check
{
- var networkManager = m_NetworkManager;
var clientRpcMessage = new ClientRpcMessage
{
Metadata = new RpcMetadata
@@ -189,7 +187,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
networkDelivery = MessageDeliveryType.DefaultDelivery;
break;
case RpcDelivery.Unreliable:
- if (bufferWriter.Length > networkManager.MessageManager.NonFragmentedMessageMaxSize)
+ if (bufferWriter.Length > m_NetworkManager.MessageManager.NonFragmentedMessageMaxSize)
{
throw new OverflowException("RPC parameters are too large for unreliable delivery.");
}
@@ -212,7 +210,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
continue;
}
// Check to make sure we are sending to only observers, if not log an error.
- if (networkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId))
+ if (m_NetworkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId))
{
NetworkLog.LogError(GenerateObserverErrorMessage(clientRpcParams, targetClientId));
}
@@ -229,12 +227,12 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
continue;
}
// Check to make sure we are sending to only observers, if not log an error.
- if (networkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId))
+ if (m_NetworkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId))
{
NetworkLog.LogError(GenerateObserverErrorMessage(clientRpcParams, targetClientId));
}
}
- rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, clientRpcParams.Send.TargetClientIdsNativeArray.Value);
+ rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, clientRpcParams.Send.TargetClientIdsNativeArray.Value);
}
else
{
@@ -242,12 +240,12 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
while (observerEnumerator.MoveNext())
{
// Skip over the host
- if (IsHost && observerEnumerator.Current == networkManager.LocalClientId)
+ if (IsHost && observerEnumerator.Current == m_NetworkManager.LocalClientId)
{
shouldInvokeLocally = true;
continue;
}
- rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, observerEnumerator.Current);
+ rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, observerEnumerator.Current);
}
}
@@ -258,8 +256,8 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
var context = new NetworkContext
{
SenderId = NetworkManager.ServerClientId,
- Timestamp = networkManager.RealTimeProvider.RealTimeSinceStartup,
- SystemOwner = networkManager,
+ Timestamp = m_NetworkManager.RealTimeProvider.RealTimeSinceStartup,
+ SystemOwner = m_NetworkManager,
// header information isn't valid since it's not a real message.
// RpcMessage doesn't access this stuff so it's just left empty.
Header = new NetworkMessageHeader(),
@@ -282,7 +280,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
{
foreach (var targetClientId in clientRpcParams.Send.TargetClientIds)
{
- networkManager.NetworkMetrics.TrackRpcSent(
+ m_NetworkManager.NetworkMetrics.TrackRpcSent(
targetClientId,
m_NetworkObject,
rpcMethodName,
@@ -294,7 +292,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
{
foreach (var targetClientId in clientRpcParams.Send.TargetClientIdsNativeArray)
{
- networkManager.NetworkMetrics.TrackRpcSent(
+ m_NetworkManager.NetworkMetrics.TrackRpcSent(
targetClientId,
m_NetworkObject,
rpcMethodName,
@@ -307,7 +305,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
var observerEnumerator = m_NetworkObject.Observers.GetEnumerator();
while (observerEnumerator.MoveNext())
{
- networkManager.NetworkMetrics.TrackRpcSent(
+ m_NetworkManager.NetworkMetrics.TrackRpcSent(
observerEnumerator.Current,
m_NetworkObject,
rpcMethodName,
@@ -325,7 +323,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
internal FastBufferWriter __beginSendRpc(uint rpcMethodId, RpcParams rpcParams, RpcAttribute.RpcAttributeParams attributeParams, SendTo defaultTarget, RpcDelivery rpcDelivery)
#pragma warning restore IDE1006 // restore naming rule violation check
{
- if (m_NetworkObject == null && !IsSpawned)
+ if (!IsSpawned)
{
throw new RpcException("The NetworkBehaviour must be spawned before calling this method.");
}
@@ -652,27 +650,24 @@ protected NetworkBehaviour GetNetworkBehaviour(ushort behaviourId)
///
internal void UpdateNetworkProperties()
{
- var networkObject = m_NetworkObject;
- var networkManager = m_NetworkManager;
-
// Set identification related properties
- NetworkObjectId = networkObject.NetworkObjectId;
- IsLocalPlayer = networkObject.IsLocalPlayer;
+ NetworkObjectId = m_NetworkObject.NetworkObjectId;
+ IsLocalPlayer = m_NetworkObject.IsLocalPlayer;
// Set ownership related properties
- IsOwnedByServer = networkObject.IsOwnedByServer;
- IsOwner = networkObject.IsOwner;
- OwnerClientId = networkObject.OwnerClientId;
+ IsOwnedByServer = m_NetworkObject.IsOwnedByServer;
+ IsOwner = m_NetworkObject.IsOwner;
+ OwnerClientId = m_NetworkObject.OwnerClientId;
// Set NetworkManager dependent properties
- if (networkManager != null)
- {
- IsHost = networkManager.IsListening && networkManager.IsHost;
- IsClient = networkManager.IsListening && networkManager.IsClient;
- IsServer = networkManager.IsListening && networkManager.IsServer;
- IsSessionOwner = networkManager.IsListening && networkManager.LocalClient.IsSessionOwner;
- HasAuthority = networkObject.HasAuthority;
- ServerIsHost = networkManager.IsListening && networkManager.ServerIsHost;
+ if (m_NetworkManager != null)
+ {
+ IsHost = m_NetworkManager.IsListening && m_NetworkManager.IsHost;
+ IsClient = m_NetworkManager.IsListening && m_NetworkManager.IsClient;
+ IsServer = m_NetworkManager.IsListening && m_NetworkManager.IsServer;
+ IsSessionOwner = m_NetworkManager.IsListening && m_NetworkManager.LocalClient.IsSessionOwner;
+ HasAuthority = m_NetworkObject.HasAuthority;
+ ServerIsHost = m_NetworkManager.IsListening && m_NetworkManager.ServerIsHost;
}
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
index b5f037c4ac..d8bcfaffff 100644
--- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
@@ -1020,6 +1020,14 @@ private void OnTransformParentChanged()
NetworkManagerCheckForParent();
}
+ ///
+ /// For testing purposes when you need the singleton to be null
+ ///
+ internal static void ResetSingleton()
+ {
+ Singleton = null;
+ }
+
///
/// Set this NetworkManager instance as the static NetworkManager singleton
///
diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
index c667af47db..bd518b3048 100644
--- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
@@ -3647,7 +3647,8 @@ internal void OnNetworkBehaviourDestroyed(NetworkBehaviour networkBehaviour)
{
if (networkBehaviour.IsSpawned && IsSpawned)
{
- if (NetworkManagerOwner.LogLevel <= LogLevel.Developer)
+ // Only log this warning if we are not shutting down.
+ if (!NetworkManagerOwner.ShutdownInProgress && NetworkManagerOwner.LogLevel <= LogLevel.Developer)
{
NetworkLog.LogWarning($"{nameof(NetworkBehaviour)}-{networkBehaviour.name} is being destroyed while {nameof(NetworkObject)}-{name} is still spawned! (could break state synchronization)");
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs b/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs
index d9319bcfb8..59557cc81a 100644
--- a/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Logging/NetworkLog.cs
@@ -113,14 +113,21 @@ private static void LogServer(string message, LogType logType)
}
}
+ private const string k_HeaderStart = "Netcode";
private static string Header()
{
var networkManager = NetworkManagerOverride ??= NetworkManager.Singleton;
- if (networkManager.DistributedAuthorityMode)
+ if (networkManager != null)
{
- return "Session-Owner";
+ if (networkManager.DistributedAuthorityMode)
+ {
+ return $"{k_HeaderStart}-Session-Owner";
+ }
+ return $"{k_HeaderStart}-Server";
}
- return "Netcode-Server";
+
+ // If NetworkManager no longer exists, then return the generic header
+ return k_HeaderStart;
}
internal static void LogInfoServerLocal(string message, ulong sender) => Debug.Log($"[{Header()} Sender={sender}] {message}");
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs
index ab6a0ea042..17669a335f 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs
@@ -347,7 +347,7 @@ public void Handle(ref NetworkContext context)
NetworkObject.Deserialize(serializedObject, m_ReceivedSceneObjectData, networkManager);
}
- if (networkManager.AutoSpawnPlayerPrefabClientSide)
+ if (networkManager.DistributedAuthorityMode && networkManager.AutoSpawnPlayerPrefabClientSide)
{
networkManager.ConnectionManager.CreateAndSpawnPlayer(OwnerClientId);
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs
index a5c279c7c3..7497d54ab2 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs
@@ -106,7 +106,7 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
var transform = networkObject.ChildNetworkBehaviours[networkBehaviourId] as NetworkTransform;
if (transform == null)
{
- Debug.LogError($"[{nameof(NetworkTransformMessage)}][Invalid] Targeted {nameof(NetworkTransform)}, {nameof(NetworkBehaviour.NetworkBehaviourId)} ({networkBehaviourId}), does not exist! Make sure you are not spawning {nameof(NetworkObject)}s with disabled {nameof(GameObject)}s that have {nameof(NetworkBehaviour)} components on them.");
+ Debug.LogError($"[{nameof(NetworkTransformMessage)}][Invalid] Targeted {nameof(NetworkTransform)}, {nameof(NetworkBehaviour.NetworkBehaviourId)} ({networkBehaviourId}), does not exist on {networkObject.name}! Make sure you are not spawning {nameof(NetworkObject)}s with disabled {nameof(GameObject)}s that have {nameof(NetworkBehaviour)} components on them.");
return false;
}
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/OwnershipPermissionsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/OwnershipPermissionsTests.cs
index 425a9ccc8c..cbd0e67a48 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/OwnershipPermissionsTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/OwnershipPermissionsTests.cs
@@ -445,7 +445,7 @@ public IEnumerator ChangeOwnershipWithoutObservers()
authorityInstance.ChangeOwnership(otherClient.LocalClientId);
var senderId = authority.LocalClientId;
var receiverId = otherClient.LocalClientId;
- LogAssert.Expect(LogType.Warning, $"[Session-Owner Sender={senderId}] [Invalid Owner] Cannot send Ownership change as client-{receiverId} cannot see {authorityInstance.name}! Use NetworkShow first.");
+ LogAssert.Expect(LogType.Warning, $"[Netcode-Session-Owner Sender={senderId}] [Invalid Owner] Cannot send Ownership change as client-{receiverId} cannot see {authorityInstance.name}! Use NetworkShow first.");
Assert.True(authorityInstance.IsOwner, $"[Ownership Check] Client-{senderId} should still own this object!");
// Now re-add the client to the Observers list and try to change ownership
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkLogTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkLogTests.cs
new file mode 100644
index 0000000000..3307f5ce1e
--- /dev/null
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkLogTests.cs
@@ -0,0 +1,47 @@
+using System.Collections;
+using Unity.Netcode.TestHelpers.Runtime;
+using UnityEngine.TestTools;
+
+namespace Unity.Netcode.RuntimeTests
+{
+ ///
+ /// Validates edge cases with
+ ///
+ internal class NetworkLogTests : NetcodeIntegrationTest
+ {
+ protected override int NumberOfClients => 0;
+ private bool m_ServerStopped;
+
+ ///
+ /// Validates that if no exists,
+ /// you can still use NetworkLog with the caveat when one does
+ /// not exist it will only log locally.
+ /// (is topology agnostic)
+ ///
+ [UnityTest]
+ public IEnumerator UseNetworkLogWithNoNetworkManager()
+ {
+ m_ServerStopped = false;
+ var authority = GetAuthorityNetworkManager();
+ authority.OnServerStopped += OnServerStopped;
+ authority.Shutdown();
+ yield return WaitForConditionOrTimeOut(() => m_ServerStopped);
+ AssertOnTimeout($"Timed out waiting for {nameof(NetworkManager)} to stop!");
+ // Assure it is destroyed.
+ UnityEngine.Object.Destroy(authority);
+ authority = null;
+
+ // Clear out the singleton to assure NetworkLog has no references to a NetworkManager
+ NetworkManager.ResetSingleton();
+
+ // Validate you can use NetworkLog without any NetworkManager instance.
+ NetworkLog.LogInfoServer($"Test a message to the server with no {nameof(NetworkManager)}.");
+ // No exceptions thrown is considered passing.
+ }
+
+ private void OnServerStopped(bool obj)
+ {
+ m_ServerStopped = true;
+ }
+ }
+}
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkLogTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkLogTests.cs.meta
new file mode 100644
index 0000000000..fb157e1463
--- /dev/null
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkLogTests.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 984658de4d8c7ef4582baedfa630773f
\ No newline at end of file
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs
index 92e4beb906..7ab2df5f03 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs
@@ -132,6 +132,7 @@ public IEnumerator ConnectSingleClient_WebSocket_IPAddressAndPath()
#if HOSTNAME_RESOLUTION_AVAILABLE
// Check connection with a single client (hostname).
[UnityTest]
+ [UnityPlatform(exclude = new[] { RuntimePlatform.Android })] // Test fails on Android for editors 6000.3+ Tracked in MTT-14757
public IEnumerator ConnectSingleClient_Hostname()
{
InitializeTransport(out m_Server, out m_ServerEvents);