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);