From 241b9193928079c151f6524789c9610b5dd1e381 Mon Sep 17 00:00:00 2001 From: alexandre-ribard Date: Wed, 28 Aug 2024 15:39:49 -0400 Subject: [PATCH 01/43] adding wrench --- .yamato/wrench/api-validation-jobs.yml | 47 +++ .yamato/wrench/package-pack-jobs.yml | 32 ++ .yamato/wrench/preview-a-p-v.yml | 464 +++++++++++++++++++++++++ .yamato/wrench/promotion-jobs.yml | 152 ++++++++ .yamato/wrench/validation-jobs.yml | 353 +++++++++++++++++++ .yamato/wrench/wrench_config.json | 27 ++ 6 files changed, 1075 insertions(+) create mode 100644 .yamato/wrench/api-validation-jobs.yml create mode 100644 .yamato/wrench/package-pack-jobs.yml create mode 100644 .yamato/wrench/preview-a-p-v.yml create mode 100644 .yamato/wrench/promotion-jobs.yml create mode 100644 .yamato/wrench/validation-jobs.yml create mode 100644 .yamato/wrench/wrench_config.json diff --git a/.yamato/wrench/api-validation-jobs.yml b/.yamato/wrench/api-validation-jobs.yml new file mode 100644 index 0000000000..68ae108aa3 --- /dev/null +++ b/.yamato/wrench/api-validation-jobs.yml @@ -0,0 +1,47 @@ +# Auto-generated by Recipe Engine, do not modify manually. +# This job is generated by the wrench recipe engine module, see find the docs here: . + +# upm-ci validation tests for API Validation - ml-agents - 2022.3 - windows (2022.3 - Windows). +api_validation_-_ml-agents_-_2022_3_-_windows: + name: API Validation - ml-agents - 2022.3 - windows + agent: + image: package-ci/win10:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 2022.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/PackageJsonCondersor.py + timeout: 1 + retries: 0 + - command: upm-ci package test -u .Editor --package-path com.unity.ml-agents --type vetting-tests || exit 0 + timeout: 30 + retries: 0 + - command: python PythonScripts/parse_upm_ci_results.py --package-path=com.unity.ml-agents + timeout: 2 + retries: 0 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + triggers: + expression: push.branch match "^release/.*" + cancel_old_ci: true + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + diff --git a/.yamato/wrench/package-pack-jobs.yml b/.yamato/wrench/package-pack-jobs.yml new file mode 100644 index 0000000000..870314c1ce --- /dev/null +++ b/.yamato/wrench/package-pack-jobs.yml @@ -0,0 +1,32 @@ +# Auto-generated by Recipe Engine, do not modify manually. +# This job is generated by the wrench recipe engine module, see find the docs here: . + +# Pack and Sign ml-agents +package_pack_-_ml-agents: + name: Package Pack - ml-agents + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: upm-ci package pack --package-path com.unity.ml-agents + - command: cp upm-ci~/packages/packages.json upm-ci~/packages/com.unity.ml-agents_packages.json + artifacts: + packages: + paths: + - upm-ci~/packages/**/* + dependencies: + - path: .yamato/build-on-mac.yml#build + variables: + UPMCI_ACK_LARGE_PACKAGE: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + diff --git a/.yamato/wrench/preview-a-p-v.yml b/.yamato/wrench/preview-a-p-v.yml new file mode 100644 index 0000000000..d93fdb8c07 --- /dev/null +++ b/.yamato/wrench/preview-a-p-v.yml @@ -0,0 +1,464 @@ +# Auto-generated by Recipe Engine, do not modify manually. +# This job is generated by the wrench recipe engine module, see find the docs here: . + +# Parent Preview APV Job. +all_preview_apv_jobs: + name: All Preview APV Jobs + dependencies: + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2021_3_-_macos + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2021_3_-_ubuntu + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2021_3_-_windows + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2022_3_-_macos + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2022_3_-_ubuntu + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2022_3_-_windows + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_6000_0_-_macos + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_6000_0_-_ubuntu + - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_6000_0_-_windows + triggers: + expression: push.branch match "^release/.*" + cancel_old_ci: true + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 2021.3 manifest (MacOS). +preview_apv_-_2021_3_-_macos: + name: Preview APV - 2021.3 - macos + agent: + image: package-ci/macos-13:default + type: Unity::VM::osx + flavor: b1.xlarge + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 2021.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2021.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 2021.3 manifest (Ubuntu). +preview_apv_-_2021_3_-_ubuntu: + name: Preview APV - 2021.3 - ubuntu + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 2021.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2021.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 2021.3 manifest (Windows). +preview_apv_-_2021_3_-_windows: + name: Preview APV - 2021.3 - windows + agent: + image: package-ci/win10:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 2021.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2021.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: python PythonScripts/editor_manifest_validator.py --version=2021.3 --wrench-config=.yamato/wrench/wrench_config.json + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 2022.3 manifest (MacOS). +preview_apv_-_2022_3_-_macos: + name: Preview APV - 2022.3 - macos + agent: + image: package-ci/macos-13:default + type: Unity::VM::osx + flavor: b1.xlarge + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 2022.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2022.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 2022.3 manifest (Ubuntu). +preview_apv_-_2022_3_-_ubuntu: + name: Preview APV - 2022.3 - ubuntu + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 2022.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2022.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 2022.3 manifest (Windows). +preview_apv_-_2022_3_-_windows: + name: Preview APV - 2022.3 - windows + agent: + image: package-ci/win10:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 2022.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2022.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: python PythonScripts/editor_manifest_validator.py --version=2022.3 --wrench-config=.yamato/wrench/wrench_config.json + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 6000.0 manifest (MacOS). +preview_apv_-_6000_0_-_macos: + name: Preview APV - 6000.0 - macos + agent: + image: package-ci/macos-13:default + type: Unity::VM::osx + flavor: b1.xlarge + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 6000.0 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=6000.0 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 6000.0 manifest (Ubuntu). +preview_apv_-_6000_0_-_ubuntu: + name: Preview APV - 6000.0 - ubuntu + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 6000.0 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=6000.0 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Functional tests for dependents found in the latest 6000.0 manifest (Windows). +preview_apv_-_6000_0_-_windows: + name: Preview APV - 6000.0 - windows + agent: + image: package-ci/win10:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm + timeout: 20 + retries: 10 + - command: unity-downloader-cli -u 6000.0 -c Editor --fast + timeout: 10 + retries: 3 + - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=6000.0 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ + - command: python PythonScripts/editor_manifest_validator.py --version=6000.0 --wrench-config=.yamato/wrench/wrench_config.json + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + logs: + paths: + - '*.log' + - '*.xml' + - upm-ci~/test-results/**/* + - upm-ci~/temp/*/Logs/** + - upm-ci~/temp/*/Library/*.log + - upm-ci~/temp/*/*.log + - upm-ci~/temp/Builds/*.log + packages: + paths: + - upm-ci~/packages/**/* + PreviewAPVResults: + paths: + - PreviewApvArtifacts~/** + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + diff --git a/.yamato/wrench/promotion-jobs.yml b/.yamato/wrench/promotion-jobs.yml new file mode 100644 index 0000000000..287dc9a8e9 --- /dev/null +++ b/.yamato/wrench/promotion-jobs.yml @@ -0,0 +1,152 @@ +# Auto-generated by Recipe Engine, do not modify manually. +# This job is generated by the wrench recipe engine module, see find the docs here: . + +# Publish Dry Run for ml-agents to https://artifactory-slo.bf.unity3d.com/artifactory/api/npm/upm-npm +publish_dry_run_ml-agents: + name: Publish Dry Run ml-agents + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: upm-pvp publish --packages "upm-ci~/packages/*.tgz" --evidence results --dry-run + artifacts: + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_macos + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2022.3-macos + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2022.3-macos + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_ubuntu + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2022.3-ubuntu + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2022.3-ubuntu + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_windows + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2022.3-windows + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2022.3-windows + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_macos + specific_options: + UTR: + location: results/UTR/validate-ml-agents-6000.0-macos + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-6000.0-macos + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_ubuntu + specific_options: + UTR: + location: results/UTR/validate-ml-agents-6000.0-ubuntu + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-6000.0-ubuntu + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_windows + specific_options: + UTR: + location: results/UTR/validate-ml-agents-6000.0-windows + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-6000.0-windows + unzip: true + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + triggers: + expression: push.branch match "^release/.*" + cancel_old_ci: true + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + +# Publish for ml-agents to https://artifactory-slo.bf.unity3d.com/artifactory/api/npm/upm-npm +publish_ml-agents: + name: Publish ml-agents + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: python PythonScripts/ignore_existing_package_failure.py + artifacts: + pvp-results: + paths: + - upm-ci~/pvp/**/* + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_macos + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2022.3-macos + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2022.3-macos + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_ubuntu + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2022.3-ubuntu + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2022.3-ubuntu + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_windows + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2022.3-windows + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2022.3-windows + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_macos + specific_options: + UTR: + location: results/UTR/validate-ml-agents-6000.0-macos + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-6000.0-macos + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_ubuntu + specific_options: + UTR: + location: results/UTR/validate-ml-agents-6000.0-ubuntu + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-6000.0-ubuntu + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_windows + specific_options: + UTR: + location: results/UTR/validate-ml-agents-6000.0-windows + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-6000.0-windows + unzip: true + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + diff --git a/.yamato/wrench/validation-jobs.yml b/.yamato/wrench/validation-jobs.yml new file mode 100644 index 0000000000..136510315b --- /dev/null +++ b/.yamato/wrench/validation-jobs.yml @@ -0,0 +1,353 @@ +# Auto-generated by Recipe Engine, do not modify manually. +# This job is generated by the wrench recipe engine module, see find the docs here: . + +# PVP Editor and Playmode tests for Validate - ml-agents - 2022.3 - macos (2022.3 - MacOS). +validate_-_ml-agents_-_2022_3_-_macos: + name: Validate - ml-agents - 2022.3 - macos + agent: + image: package-ci/macos-13:default + type: Unity::VM::osx + flavor: b1.xlarge + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 2022.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json + timeout: 5 + retries: 0 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + labels: + - Packages:ml-agents + +# PVP Editor and Playmode tests for Validate - ml-agents - 2022.3 - ubuntu (2022.3 - Ubuntu). +validate_-_ml-agents_-_2022_3_-_ubuntu: + name: Validate - ml-agents - 2022.3 - ubuntu + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 2022.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json + timeout: 5 + retries: 0 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + labels: + - Packages:ml-agents + +# PVP Editor and Playmode tests for Validate - ml-agents - 2022.3 - windows (2022.3 - Windows). +validate_-_ml-agents_-_2022_3_-_windows: + name: Validate - ml-agents - 2022.3 - windows + agent: + image: package-ci/win10:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 2022.3 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: echo Skipping check for PVP-160-1 as there is a bug on Windows. https://jira.unity3d.com/browse/PETS-1462 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner.exe --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + labels: + - Packages:ml-agents + +# PVP Editor and Playmode tests for Validate - ml-agents - 6000.0 - macos (6000.0 - MacOS). +validate_-_ml-agents_-_6000_0_-_macos: + name: Validate - ml-agents - 6000.0 - macos + agent: + image: package-ci/macos-13:default + type: Unity::VM::osx + flavor: b1.xlarge + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 6000.0 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json + timeout: 5 + retries: 0 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + labels: + - Packages:ml-agents + +# PVP Editor and Playmode tests for Validate - ml-agents - 6000.0 - ubuntu (6000.0 - Ubuntu). +validate_-_ml-agents_-_6000_0_-_ubuntu: + name: Validate - ml-agents - 6000.0 - ubuntu + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 6000.0 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json + timeout: 5 + retries: 0 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + labels: + - Packages:ml-agents + +# PVP Editor and Playmode tests for Validate - ml-agents - 6000.0 - windows (6000.0 - Windows). +validate_-_ml-agents_-_6000_0_-_windows: + name: Validate - ml-agents - 6000.0 - windows + agent: + image: package-ci/win10:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 6000.0 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: echo Skipping check for PVP-160-1 as there is a bug on Windows. https://jira.unity3d.com/browse/PETS-1462 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner.exe --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.4.0 + labels: + - Packages:ml-agents + diff --git a/.yamato/wrench/wrench_config.json b/.yamato/wrench/wrench_config.json new file mode 100644 index 0000000000..87eb006e42 --- /dev/null +++ b/.yamato/wrench/wrench_config.json @@ -0,0 +1,27 @@ +{ + "project_path": "Tools\\CI", + "schema_version": 0.5, + "packages": { + "com.unity.ml-agents": { + "directory": "com.unity.ml-agents/", + "prePackCommands": [], + "preTestCommands": {}, + "InternalOnly": false, + "NeverPublish": false + } + }, + "releasing_packages": [ + "com.unity.ml-agents" + ], + "jobs_to_monitor": { + "com.unity.ml-agents": [ + ".yamato/wrench/preview-a-p-v.yml#all_preview_apv_jobs", + ".yamato/wrench/api-validation-jobs.yml#api_validation_-_ml-agents_-_2022_3_-_windows", + ".yamato/wrench/promotion-jobs.yml#publish_dry_run_ml-agents" + ] + }, + "publishing_job": ".yamato/wrench/promotion-jobs.yml#publish_ml-agents", + "branch_pattern": "ReleaseSlash", + "wrench_version": "0.10.4.0", + "pvp_exemption_path": ".yamato/wrench/pvp-exemptions.json" +} \ No newline at end of file From c4668ac6adb9d8716c203dad1e6e4ff7fdc5ca2f Mon Sep 17 00:00:00 2001 From: alexandre-ribard Date: Wed, 28 Aug 2024 15:52:59 -0400 Subject: [PATCH 02/43] correct build path --- .yamato/wrench/package-pack-jobs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.yamato/wrench/package-pack-jobs.yml b/.yamato/wrench/package-pack-jobs.yml index 870314c1ce..414aa8412f 100644 --- a/.yamato/wrench/package-pack-jobs.yml +++ b/.yamato/wrench/package-pack-jobs.yml @@ -22,7 +22,8 @@ package_pack_-_ml-agents: paths: - upm-ci~/packages/**/* dependencies: - - path: .yamato/build-on-mac.yml#build + - path: .yamato/standalone-build-test.yml#test_linux_standalone_2023.2_gym + variables: UPMCI_ACK_LARGE_PACKAGE: 1 UPMPVP_CONTEXT_WRENCH: 0.10.4.0 From 205396d39590881eae453ea6620c7df23ddafaeb Mon Sep 17 00:00:00 2001 From: alexandre-ribard Date: Wed, 28 Aug 2024 16:23:44 -0400 Subject: [PATCH 03/43] release branch and 6.0 target --- .yamato/wrench/api-validation-jobs.yml | 8 +- .yamato/wrench/preview-a-p-v.yml | 300 ------------------------- .yamato/wrench/promotion-jobs.yml | 48 ---- .yamato/wrench/validation-jobs.yml | 175 --------------- .yamato/wrench/wrench_config.json | 2 +- com.unity.ml-agents/package.json | 2 +- 6 files changed, 6 insertions(+), 529 deletions(-) diff --git a/.yamato/wrench/api-validation-jobs.yml b/.yamato/wrench/api-validation-jobs.yml index 68ae108aa3..9b2ecb55f3 100644 --- a/.yamato/wrench/api-validation-jobs.yml +++ b/.yamato/wrench/api-validation-jobs.yml @@ -1,9 +1,9 @@ # Auto-generated by Recipe Engine, do not modify manually. # This job is generated by the wrench recipe engine module, see find the docs here: . -# upm-ci validation tests for API Validation - ml-agents - 2022.3 - windows (2022.3 - Windows). -api_validation_-_ml-agents_-_2022_3_-_windows: - name: API Validation - ml-agents - 2022.3 - windows +# upm-ci validation tests for API Validation - ml-agents - 2023.2 - windows (2023.2 - Windows). +api_validation_-_ml-agents_-_2023_2_-_windows: + name: API Validation - ml-agents - 2023.2 - windows agent: image: package-ci/win10:default type: Unity::VM @@ -15,7 +15,7 @@ api_validation_-_ml-agents_-_2022_3_-_windows: - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm timeout: 20 retries: 10 - - command: unity-downloader-cli -u 2022.3 -c Editor --fast + - command: unity-downloader-cli -u 2023.2 -c Editor --fast timeout: 10 retries: 3 - command: python PythonScripts/PackageJsonCondersor.py diff --git a/.yamato/wrench/preview-a-p-v.yml b/.yamato/wrench/preview-a-p-v.yml index d93fdb8c07..d3f0bb2bc0 100644 --- a/.yamato/wrench/preview-a-p-v.yml +++ b/.yamato/wrench/preview-a-p-v.yml @@ -5,12 +5,6 @@ all_preview_apv_jobs: name: All Preview APV Jobs dependencies: - - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2021_3_-_macos - - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2021_3_-_ubuntu - - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2021_3_-_windows - - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2022_3_-_macos - - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2022_3_-_ubuntu - - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_2022_3_-_windows - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_6000_0_-_macos - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_6000_0_-_ubuntu - path: .yamato/wrench/preview-a-p-v.yml#preview_apv_-_6000_0_-_windows @@ -21,300 +15,6 @@ all_preview_apv_jobs: Job Maintainers: '#rm-packageworks' Wrench: 0.10.4.0 -# Functional tests for dependents found in the latest 2021.3 manifest (MacOS). -preview_apv_-_2021_3_-_macos: - name: Preview APV - 2021.3 - macos - agent: - image: package-ci/macos-13:default - type: Unity::VM::osx - flavor: b1.xlarge - commands: - - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm - timeout: 20 - retries: 10 - - command: unity-downloader-cli -u 2021.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2021.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ - - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - logs: - paths: - - '*.log' - - '*.xml' - - upm-ci~/test-results/**/* - - upm-ci~/temp/*/Logs/** - - upm-ci~/temp/*/Library/*.log - - upm-ci~/temp/*/*.log - - upm-ci~/temp/Builds/*.log - packages: - paths: - - upm-ci~/packages/**/* - PreviewAPVResults: - paths: - - PreviewApvArtifacts~/** - pvp-results: - paths: - - upm-ci~/pvp/**/* - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - -# Functional tests for dependents found in the latest 2021.3 manifest (Ubuntu). -preview_apv_-_2021_3_-_ubuntu: - name: Preview APV - 2021.3 - ubuntu - agent: - image: package-ci/ubuntu-20.04:default - type: Unity::VM - flavor: b1.large - commands: - - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm - timeout: 20 - retries: 10 - - command: unity-downloader-cli -u 2021.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2021.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ - - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - logs: - paths: - - '*.log' - - '*.xml' - - upm-ci~/test-results/**/* - - upm-ci~/temp/*/Logs/** - - upm-ci~/temp/*/Library/*.log - - upm-ci~/temp/*/*.log - - upm-ci~/temp/Builds/*.log - packages: - paths: - - upm-ci~/packages/**/* - PreviewAPVResults: - paths: - - PreviewApvArtifacts~/** - pvp-results: - paths: - - upm-ci~/pvp/**/* - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - -# Functional tests for dependents found in the latest 2021.3 manifest (Windows). -preview_apv_-_2021_3_-_windows: - name: Preview APV - 2021.3 - windows - agent: - image: package-ci/win10:default - type: Unity::VM - flavor: b1.large - commands: - - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm - timeout: 20 - retries: 10 - - command: unity-downloader-cli -u 2021.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2021.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ - - command: python PythonScripts/editor_manifest_validator.py --version=2021.3 --wrench-config=.yamato/wrench/wrench_config.json - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - logs: - paths: - - '*.log' - - '*.xml' - - upm-ci~/test-results/**/* - - upm-ci~/temp/*/Logs/** - - upm-ci~/temp/*/Library/*.log - - upm-ci~/temp/*/*.log - - upm-ci~/temp/Builds/*.log - packages: - paths: - - upm-ci~/packages/**/* - PreviewAPVResults: - paths: - - PreviewApvArtifacts~/** - pvp-results: - paths: - - upm-ci~/pvp/**/* - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - -# Functional tests for dependents found in the latest 2022.3 manifest (MacOS). -preview_apv_-_2022_3_-_macos: - name: Preview APV - 2022.3 - macos - agent: - image: package-ci/macos-13:default - type: Unity::VM::osx - flavor: b1.xlarge - commands: - - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm - timeout: 20 - retries: 10 - - command: unity-downloader-cli -u 2022.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2022.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ - - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - logs: - paths: - - '*.log' - - '*.xml' - - upm-ci~/test-results/**/* - - upm-ci~/temp/*/Logs/** - - upm-ci~/temp/*/Library/*.log - - upm-ci~/temp/*/*.log - - upm-ci~/temp/Builds/*.log - packages: - paths: - - upm-ci~/packages/**/* - PreviewAPVResults: - paths: - - PreviewApvArtifacts~/** - pvp-results: - paths: - - upm-ci~/pvp/**/* - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - -# Functional tests for dependents found in the latest 2022.3 manifest (Ubuntu). -preview_apv_-_2022_3_-_ubuntu: - name: Preview APV - 2022.3 - ubuntu - agent: - image: package-ci/ubuntu-20.04:default - type: Unity::VM - flavor: b1.large - commands: - - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm - timeout: 20 - retries: 10 - - command: unity-downloader-cli -u 2022.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2022.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ - - command: echo 'Skipping Editor Manifest Validator as it is only supported on Windows' - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - logs: - paths: - - '*.log' - - '*.xml' - - upm-ci~/test-results/**/* - - upm-ci~/temp/*/Logs/** - - upm-ci~/temp/*/Library/*.log - - upm-ci~/temp/*/*.log - - upm-ci~/temp/Builds/*.log - packages: - paths: - - upm-ci~/packages/**/* - PreviewAPVResults: - paths: - - PreviewApvArtifacts~/** - pvp-results: - paths: - - upm-ci~/pvp/**/* - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - -# Functional tests for dependents found in the latest 2022.3 manifest (Windows). -preview_apv_-_2022_3_-_windows: - name: Preview APV - 2022.3 - windows - agent: - image: package-ci/win10:default - type: Unity::VM - flavor: b1.large - commands: - - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: npm install upm-ci-utils@stable -g --registry https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-npm - timeout: 20 - retries: 10 - - command: unity-downloader-cli -u 2022.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: python PythonScripts/preview_apv.py --wrench-config=.yamato/wrench/wrench_config.json --editor-version=2022.3 --testsuite=editor,playmode --artifacts-path=PreviewApvArtifacts~ - - command: python PythonScripts/editor_manifest_validator.py --version=2022.3 --wrench-config=.yamato/wrench/wrench_config.json - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - logs: - paths: - - '*.log' - - '*.xml' - - upm-ci~/test-results/**/* - - upm-ci~/temp/*/Logs/** - - upm-ci~/temp/*/Library/*.log - - upm-ci~/temp/*/*.log - - upm-ci~/temp/Builds/*.log - packages: - paths: - - upm-ci~/packages/**/* - PreviewAPVResults: - paths: - - PreviewApvArtifacts~/** - pvp-results: - paths: - - upm-ci~/pvp/**/* - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - # Functional tests for dependents found in the latest 6000.0 manifest (MacOS). preview_apv_-_6000_0_-_macos: name: Preview APV - 6000.0 - macos diff --git a/.yamato/wrench/promotion-jobs.yml b/.yamato/wrench/promotion-jobs.yml index 287dc9a8e9..e37a84e1fe 100644 --- a/.yamato/wrench/promotion-jobs.yml +++ b/.yamato/wrench/promotion-jobs.yml @@ -19,30 +19,6 @@ publish_dry_run_ml-agents: - upm-ci~/pvp/**/* dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_macos - specific_options: - UTR: - location: results/UTR/validate-ml-agents-2022.3-macos - unzip: true - pvp-results: - location: results/pvp/validate-ml-agents-2022.3-macos - unzip: true - - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_ubuntu - specific_options: - UTR: - location: results/UTR/validate-ml-agents-2022.3-ubuntu - unzip: true - pvp-results: - location: results/pvp/validate-ml-agents-2022.3-ubuntu - unzip: true - - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_windows - specific_options: - UTR: - location: results/UTR/validate-ml-agents-2022.3-windows - unzip: true - pvp-results: - location: results/pvp/validate-ml-agents-2022.3-windows - unzip: true - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_macos specific_options: UTR: @@ -95,30 +71,6 @@ publish_ml-agents: - upm-ci~/pvp/**/* dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_macos - specific_options: - UTR: - location: results/UTR/validate-ml-agents-2022.3-macos - unzip: true - pvp-results: - location: results/pvp/validate-ml-agents-2022.3-macos - unzip: true - - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_ubuntu - specific_options: - UTR: - location: results/UTR/validate-ml-agents-2022.3-ubuntu - unzip: true - pvp-results: - location: results/pvp/validate-ml-agents-2022.3-ubuntu - unzip: true - - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2022_3_-_windows - specific_options: - UTR: - location: results/UTR/validate-ml-agents-2022.3-windows - unzip: true - pvp-results: - location: results/pvp/validate-ml-agents-2022.3-windows - unzip: true - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_macos specific_options: UTR: diff --git a/.yamato/wrench/validation-jobs.yml b/.yamato/wrench/validation-jobs.yml index 136510315b..a2dda0f825 100644 --- a/.yamato/wrench/validation-jobs.yml +++ b/.yamato/wrench/validation-jobs.yml @@ -1,181 +1,6 @@ # Auto-generated by Recipe Engine, do not modify manually. # This job is generated by the wrench recipe engine module, see find the docs here: . -# PVP Editor and Playmode tests for Validate - ml-agents - 2022.3 - macos (2022.3 - MacOS). -validate_-_ml-agents_-_2022_3_-_macos: - name: Validate - ml-agents - 2022.3 - macos - agent: - image: package-ci/macos-13:default - type: Unity::VM::osx - flavor: b1.xlarge - commands: - - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: unity-downloader-cli -u 2022.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor - timeout: 10 - retries: 1 - - command: echo No internal packages to add. - - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp - timeout: 20 - retries: 0 - - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json - timeout: 5 - retries: 0 - - command: echo No additional PVP profiles to declared to check. - - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" - timeout: 30 - retries: 1 - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - packages: - paths: - - upm-ci~/packages/**/* - pvp-results: - paths: - - upm-ci~/pvp/**/* - UTR: - paths: - - '*.log' - - '*.xml' - - artifacts/**/* - - test-ml-agents/Logs/** - - test-ml-agents/Library/*.log - - test-ml-agents/*.log - - test-ml-agents/Builds/*.log - - build/test-results/** - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - labels: - - Packages:ml-agents - -# PVP Editor and Playmode tests for Validate - ml-agents - 2022.3 - ubuntu (2022.3 - Ubuntu). -validate_-_ml-agents_-_2022_3_-_ubuntu: - name: Validate - ml-agents - 2022.3 - ubuntu - agent: - image: package-ci/ubuntu-20.04:default - type: Unity::VM - flavor: b1.large - commands: - - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: unity-downloader-cli -u 2022.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor - timeout: 10 - retries: 1 - - command: echo No internal packages to add. - - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp - timeout: 20 - retries: 0 - - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json - timeout: 5 - retries: 0 - - command: echo No additional PVP profiles to declared to check. - - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" - timeout: 30 - retries: 1 - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - packages: - paths: - - upm-ci~/packages/**/* - pvp-results: - paths: - - upm-ci~/pvp/**/* - UTR: - paths: - - '*.log' - - '*.xml' - - artifacts/**/* - - test-ml-agents/Logs/** - - test-ml-agents/Library/*.log - - test-ml-agents/*.log - - test-ml-agents/Builds/*.log - - build/test-results/** - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - labels: - - Packages:ml-agents - -# PVP Editor and Playmode tests for Validate - ml-agents - 2022.3 - windows (2022.3 - Windows). -validate_-_ml-agents_-_2022_3_-_windows: - name: Validate - ml-agents - 2022.3 - windows - agent: - image: package-ci/win10:default - type: Unity::VM - flavor: b1.large - commands: - - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip - - command: 7z x wrench-localapv.zip - - command: python PythonScripts/print_machine_info.py - - command: unity-downloader-cli -u 2022.3 -c Editor --fast - timeout: 10 - retries: 3 - - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor - timeout: 10 - retries: 1 - - command: echo No internal packages to add. - - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp - timeout: 20 - retries: 0 - - command: echo Skipping check for PVP-160-1 as there is a bug on Windows. https://jira.unity3d.com/browse/PETS-1462 - - command: echo No additional PVP profiles to declared to check. - - command: UnifiedTestRunner.exe --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" - timeout: 30 - retries: 1 - artifacts: - Crash Dumps: - paths: - - CrashDumps/** - packages: - paths: - - upm-ci~/packages/**/* - pvp-results: - paths: - - upm-ci~/pvp/**/* - UTR: - paths: - - '*.log' - - '*.xml' - - artifacts/**/* - - test-ml-agents/Logs/** - - test-ml-agents/Library/*.log - - test-ml-agents/*.log - - test-ml-agents/Builds/*.log - - build/test-results/** - dependencies: - - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents - variables: - UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 - metadata: - Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 - labels: - - Packages:ml-agents - # PVP Editor and Playmode tests for Validate - ml-agents - 6000.0 - macos (6000.0 - MacOS). validate_-_ml-agents_-_6000_0_-_macos: name: Validate - ml-agents - 6000.0 - macos diff --git a/.yamato/wrench/wrench_config.json b/.yamato/wrench/wrench_config.json index 87eb006e42..2012645ab6 100644 --- a/.yamato/wrench/wrench_config.json +++ b/.yamato/wrench/wrench_config.json @@ -16,7 +16,7 @@ "jobs_to_monitor": { "com.unity.ml-agents": [ ".yamato/wrench/preview-a-p-v.yml#all_preview_apv_jobs", - ".yamato/wrench/api-validation-jobs.yml#api_validation_-_ml-agents_-_2022_3_-_windows", + ".yamato/wrench/api-validation-jobs.yml#api_validation_-_ml-agents_-_2023_2_-_windows", ".yamato/wrench/promotion-jobs.yml#publish_dry_run_ml-agents" ] }, diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index 84c20f8ef9..b42ea2f949 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -1,7 +1,7 @@ { "name": "com.unity.ml-agents", "displayName": "ML Agents", - "version": "3.0.0-exp.1", + "version": "4.0.0", "unity": "2023.2", "description": "Use state-of-the-art machine learning to create intelligent character behaviors in any Unity environment (games, robotics, film, etc.).", "dependencies": { From fc6ca447f6040c12cdada4883301be3ccebaf6df Mon Sep 17 00:00:00 2001 From: alexandre-ribard Date: Mon, 2 Sep 2024 14:58:31 -0400 Subject: [PATCH 04/43] XmlDoc update --- .../Basic/Scripts/BasicActuatorComponent.cs | 2 +- .../Basic/Scripts/BasicSensorComponent.cs | 2 +- .../Scripts/DungeonEscapeEnvController.cs | 2 +- .../Examples/Match3/Scripts/Match3Board.cs | 2 +- .../Scripts/PushBlockEnvController.cs | 1 - .../PushBlockWithInputPlayerController.cs | 2 +- .../SharedAssets/Scripts/ModelOverrider.cs | 1 - .../Soccer/Scripts/SoccerEnvController.cs | 1 - .../Adaptors/ButtonInputActionAdaptor.cs | 2 +- .../Runtime/Input/InputActuatorComponent.cs | 3 +- .../ArticulationBodySensorComponent.cs | 2 +- .../Runtime/Sensors/CountingGridSensor.cs | 2 +- .../Runtime/Sensors/PhysicsSensorSettings.cs | 2 +- .../Runtime/Sensors/PoseExtractor.cs | 18 ++--- .../Runtime/Sensors/RigidBodyPoseExtractor.cs | 2 +- .../Sensors/RigidBodySensorComponent.cs | 6 +- com.unity.ml-agents/CHANGELOG.md | 3 +- com.unity.ml-agents/Editor/EditorUtilities.cs | 2 +- com.unity.ml-agents/Runtime/Academy.cs | 6 +- .../Runtime/Actuators/ActuatorComponent.cs | 2 +- .../Runtime/Actuators/ActuatorManager.cs | 4 +- .../Runtime/Actuators/IActionReceiver.cs | 2 +- .../Runtime/Actuators/IActuator.cs | 6 +- com.unity.ml-agents/Runtime/Agent.cs | 68 +++++++++---------- .../Runtime/Analytics/InferenceAnalytics.cs | 7 +- .../Runtime/Communicator/GrpcExtensions.cs | 4 +- .../Runtime/Communicator/ICommunicator.cs | 2 +- .../Communicator/UnityRLCapabilities.cs | 2 +- .../Runtime/DecisionRequester.cs | 6 +- .../Demonstrations/DemonstrationRecorder.cs | 2 +- .../Demonstrations/DemonstrationWriter.cs | 2 +- .../Runtime/EnvironmentParameters.cs | 2 +- .../Runtime/Inference/SentisModelInfo.cs | 2 +- com.unity.ml-agents/Runtime/InplaceArray.cs | 6 +- .../Integrations/Match3/AbstractBoard.cs | 36 +++++----- .../Integrations/Match3/Match3Actuator.cs | 2 +- .../Integrations/Match3/Match3Sensor.cs | 4 +- .../Runtime/Integrations/Match3/Move.cs | 12 ++-- .../Runtime/Policies/BehaviorParameters.cs | 2 +- .../Runtime/Policies/BrainParameters.cs | 2 +- com.unity.ml-agents/Runtime/SensorHelper.cs | 4 +- .../Runtime/Sensors/BoxOverlapChecker.cs | 2 +- .../Runtime/Sensors/CameraSensor.cs | 4 +- .../Runtime/Sensors/CompressionSpec.cs | 4 +- .../Runtime/Sensors/GridSensorBase.cs | 12 ++-- .../Runtime/Sensors/ISensor.cs | 2 +- .../Runtime/Sensors/ObservationSpec.cs | 6 +- .../Runtime/Sensors/OneHotGridSensor.cs | 2 +- .../Runtime/Sensors/RayPerceptionSensor.cs | 7 +- .../RayPerceptionSensorComponentBase.cs | 14 ++-- .../Sensors/Reflection/ObservableAttribute.cs | 10 +-- .../Reflection/ReflectionSensorBase.cs | 2 +- .../Runtime/Sensors/VectorSensorComponent.cs | 4 +- .../EnvironmentParametersChannel.cs | 4 +- .../SideChannels/FloatPropertiesChannel.cs | 2 +- .../Runtime/SideChannels/IncomingMessage.cs | 14 ++-- .../Runtime/SideChannels/OutgoingMessage.cs | 2 +- .../SideChannels/SideChannelManager.cs | 8 +-- com.unity.ml-agents/Runtime/Timer.cs | 8 +-- .../Integrations/Match3/Match3SensorTests.cs | 2 +- 60 files changed, 170 insertions(+), 179 deletions(-) diff --git a/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicActuatorComponent.cs b/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicActuatorComponent.cs index 9a02b6765e..4634db8839 100644 --- a/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicActuatorComponent.cs +++ b/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicActuatorComponent.cs @@ -16,7 +16,7 @@ public class BasicActuatorComponent : ActuatorComponent /// /// Creates a BasicActuator. /// - /// + /// Corresponding actuators. public override IActuator[] CreateActuators() { return new IActuator[] { new BasicActuator(basicController) }; diff --git a/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicSensorComponent.cs b/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicSensorComponent.cs index f956d747ad..dedb941557 100644 --- a/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicSensorComponent.cs +++ b/Project/Assets/ML-Agents/Examples/Basic/Scripts/BasicSensorComponent.cs @@ -14,7 +14,7 @@ public class BasicSensorComponent : SensorComponent /// /// Creates a BasicSensor. /// - /// + /// Corresponding sensors. public override ISensor[] CreateSensors() { return new ISensor[] { new BasicSensor(basicController) }; diff --git a/Project/Assets/ML-Agents/Examples/DungeonEscape/Scripts/DungeonEscapeEnvController.cs b/Project/Assets/ML-Agents/Examples/DungeonEscape/Scripts/DungeonEscapeEnvController.cs index d9a8d80cd3..1e884578ba 100644 --- a/Project/Assets/ML-Agents/Examples/DungeonEscape/Scripts/DungeonEscapeEnvController.cs +++ b/Project/Assets/ML-Agents/Examples/DungeonEscape/Scripts/DungeonEscapeEnvController.cs @@ -38,7 +38,7 @@ public class DragonInfo /// /// Max Academy steps before this platform resets /// - /// + /// The maximum steps before this platform resets. [Header("Max Environment Steps")] public int MaxEnvironmentSteps = 25000; private int m_ResetTimer; diff --git a/Project/Assets/ML-Agents/Examples/Match3/Scripts/Match3Board.cs b/Project/Assets/ML-Agents/Examples/Match3/Scripts/Match3Board.cs index df6c3a56a4..f2c342b64e 100644 --- a/Project/Assets/ML-Agents/Examples/Match3/Scripts/Match3Board.cs +++ b/Project/Assets/ML-Agents/Examples/Match3/Scripts/Match3Board.cs @@ -193,7 +193,7 @@ public bool MarkMatchedCells(int[,] cells = null) /// /// Sets cells that are matched to the empty cell, and returns the score earned. /// - /// + /// The number of earned points. public int ClearMatchedCells() { var pointsByType = new[] { BasicCellPoints, SpecialCell1Points, SpecialCell2Points }; diff --git a/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs b/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs index 1b4634820f..b000b2b0ee 100644 --- a/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs +++ b/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs @@ -32,7 +32,6 @@ public class BlockInfo /// /// Max Academy steps before this platform resets /// - /// [Header("Max Environment Steps")] public int MaxEnvironmentSteps = 25000; /// diff --git a/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockWithInputPlayerController.cs b/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockWithInputPlayerController.cs index 9e9922429d..e110ad83ad 100644 --- a/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockWithInputPlayerController.cs +++ b/Project/Assets/ML-Agents/Examples/PushBlockWithInput/Scripts/PushBlockWithInputPlayerController.cs @@ -105,7 +105,7 @@ static float CreateForwardVector(Vector2 move) /// listening to C# events, Unity Events, or receiving Messages from the Input System Package as those callbacks /// are set up through the generated . /// - /// + /// Corresponing action collection tuple. public (InputActionAsset, IInputActionCollection2) GetInputActionAsset() { LazyInitializeActions(); diff --git a/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs b/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs index 07ea9ae6b3..150e7c49b3 100644 --- a/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs +++ b/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs @@ -111,7 +111,6 @@ public static string GetOverrideBehaviorName(string originalBehaviorName) /// Get the asset path to use from the commandline arguments. /// Can be called multiple times - if m_HaveProcessedCommandLine is set, will have no effect. /// - /// void GetAssetPathFromCommandLine() { if (m_HaveProcessedCommandLine) diff --git a/Project/Assets/ML-Agents/Examples/Soccer/Scripts/SoccerEnvController.cs b/Project/Assets/ML-Agents/Examples/Soccer/Scripts/SoccerEnvController.cs index d76d43ef92..076de1e27a 100644 --- a/Project/Assets/ML-Agents/Examples/Soccer/Scripts/SoccerEnvController.cs +++ b/Project/Assets/ML-Agents/Examples/Soccer/Scripts/SoccerEnvController.cs @@ -20,7 +20,6 @@ public class PlayerInfo /// /// Max Academy steps before this platform resets /// - /// [Tooltip("Max Environment Steps")] public int MaxEnvironmentSteps = 25000; /// diff --git a/com.unity.ml-agents.extensions/Runtime/Input/Adaptors/ButtonInputActionAdaptor.cs b/com.unity.ml-agents.extensions/Runtime/Input/Adaptors/ButtonInputActionAdaptor.cs index b37582422a..d16ad28a95 100644 --- a/com.unity.ml-agents.extensions/Runtime/Input/Adaptors/ButtonInputActionAdaptor.cs +++ b/com.unity.ml-agents.extensions/Runtime/Input/Adaptors/ButtonInputActionAdaptor.cs @@ -19,7 +19,7 @@ public class ButtonInputActionAdaptor : IRLActionInputAdaptor /// for pressed. /// /// The action associated with this adaptor to help determine the action space. - /// + /// ActionSpec with 1 branch of size 2. public ActionSpec GetActionSpecForInputAction(InputAction action) { return ActionSpec.MakeDiscrete(2); diff --git a/com.unity.ml-agents.extensions/Runtime/Input/InputActuatorComponent.cs b/com.unity.ml-agents.extensions/Runtime/Input/InputActuatorComponent.cs index ac8ae75236..b1a75d233b 100644 --- a/com.unity.ml-agents.extensions/Runtime/Input/InputActuatorComponent.cs +++ b/com.unity.ml-agents.extensions/Runtime/Input/InputActuatorComponent.cs @@ -182,7 +182,7 @@ internal static IActuator[] CreateActuatorsFromMap(InputActionMap inputActionMap /// /// true if the Agent connected to this GameObject is working in /// Heuristic mode. - /// + /// internal void UpdateDeviceBinding(bool isInHeuristicMode) { if (ReferenceEquals(m_Device, null)) @@ -259,7 +259,6 @@ internal static InputControlScheme CreateControlScheme(InputControl device, /// /// /// - /// internal static void RegisterLayoutBuilder(InputActionMap defaultMap, string layoutName) { if (InputSystem.LoadLayout(layoutName) == null) diff --git a/com.unity.ml-agents.extensions/Runtime/Sensors/ArticulationBodySensorComponent.cs b/com.unity.ml-agents.extensions/Runtime/Sensors/ArticulationBodySensorComponent.cs index 41e8acde56..277f01269d 100644 --- a/com.unity.ml-agents.extensions/Runtime/Sensors/ArticulationBodySensorComponent.cs +++ b/com.unity.ml-agents.extensions/Runtime/Sensors/ArticulationBodySensorComponent.cs @@ -15,7 +15,7 @@ public class ArticulationBodySensorComponent : SensorComponent /// /// Creates a PhysicsBodySensor. /// - /// + /// Corresponding sensors. public override ISensor[] CreateSensors() { return new ISensor[] {new PhysicsBodySensor(RootBody, Settings, sensorName)}; diff --git a/com.unity.ml-agents.extensions/Runtime/Sensors/CountingGridSensor.cs b/com.unity.ml-agents.extensions/Runtime/Sensors/CountingGridSensor.cs index f7a212be1e..b48deb995f 100644 --- a/com.unity.ml-agents.extensions/Runtime/Sensors/CountingGridSensor.cs +++ b/com.unity.ml-agents.extensions/Runtime/Sensors/CountingGridSensor.cs @@ -51,7 +51,7 @@ protected internal override ProcessCollidersMethod GetProcessCollidersMethod() /// The game object that was detected within a certain cell /// The index of the detectedObject's tag in the DetectableObjects list /// The buffer to write the observation values. - /// The buffer size is configured by . + /// The buffer size is configured by . /// protected override void GetObjectData(GameObject detectedObject, int tagIndex, float[] dataBuffer) { diff --git a/com.unity.ml-agents.extensions/Runtime/Sensors/PhysicsSensorSettings.cs b/com.unity.ml-agents.extensions/Runtime/Sensors/PhysicsSensorSettings.cs index d9f9c0d441..ecfa4417db 100644 --- a/com.unity.ml-agents.extensions/Runtime/Sensors/PhysicsSensorSettings.cs +++ b/com.unity.ml-agents.extensions/Runtime/Sensors/PhysicsSensorSettings.cs @@ -52,7 +52,7 @@ public struct PhysicsSensorSettings /// /// Creates a PhysicsSensorSettings with reasonable default values. /// - /// + /// `PhysicsSensorSettings` with reasonable default values. public static PhysicsSensorSettings Default() { return new PhysicsSensorSettings diff --git a/com.unity.ml-agents.extensions/Runtime/Sensors/PoseExtractor.cs b/com.unity.ml-agents.extensions/Runtime/Sensors/PoseExtractor.cs index 9777473a95..a528dde90a 100644 --- a/com.unity.ml-agents.extensions/Runtime/Sensors/PoseExtractor.cs +++ b/com.unity.ml-agents.extensions/Runtime/Sensors/PoseExtractor.cs @@ -136,7 +136,7 @@ public int NumPoses /// Get the parent index of the body at the specified index. /// /// - /// + /// The parent index of the body at the specified index. public int GetParentIndex(int index) { if (m_ParentIndices == null) @@ -195,14 +195,14 @@ protected void Setup(int[] parentIndices) /// Return the world space Pose of the i'th object. /// /// - /// + /// The world space Pose at given index. protected internal abstract Pose GetPoseAt(int index); /// /// Return the world space linear velocity of the i'th object. /// /// - /// + /// The world space linear velocity at given index. protected internal abstract Vector3 GetLinearVelocityAt(int index); /// @@ -210,7 +210,7 @@ protected void Setup(int[] parentIndices) /// used for display in the inspector. /// /// - /// + /// The `Object` at given index. protected internal virtual Object GetObjectAt(int index) { return null; @@ -285,7 +285,7 @@ public void UpdateLocalSpacePoses() /// Compute the number of floats needed to represent the poses for the given PhysicsSensorSettings. /// /// - /// + /// The number of floats needed to represent the poses for the given `PhysicsSensorSettings`. public int GetNumPoseObservations(PhysicsSensorSettings settings) { int obsPerPose = 0; @@ -355,7 +355,7 @@ internal struct DisplayNode /// /// Get a list of display nodes in depth-first order. /// - /// + /// The display nodes. internal IList GetDisplayNodes() { if (NumPoses == 0) @@ -434,7 +434,7 @@ public static class PoseExtensions /// will equal the identity pose (within tolerance). /// /// - /// + /// Inverse `Pose`. public static Pose Inverse(this Pose pose) { var rotationInverse = Quaternion.Inverse(pose.rotation); @@ -447,7 +447,7 @@ public static Pose Inverse(this Pose pose) /// /// /// - /// + /// Multiplied `Pose`. public static Pose Multiply(this Pose pose, Pose rhs) { return rhs.GetTransformedBy(pose); @@ -460,7 +460,7 @@ public static Pose Multiply(this Pose pose, Pose rhs) /// /// /// - /// + /// Multiplied `Pose`. public static Vector3 Multiply(this Pose pose, Vector3 rhs) { return pose.rotation * rhs + pose.position; diff --git a/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodyPoseExtractor.cs b/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodyPoseExtractor.cs index 38fad10fde..694b5974ab 100644 --- a/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodyPoseExtractor.cs +++ b/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodyPoseExtractor.cs @@ -163,7 +163,7 @@ protected internal override Object GetObjectAt(int index) /// /// Get a dictionary indicating which Rigidbodies' poses are enabled or disabled. /// - /// + /// `Dictionary` indicating which Rigidbodies' poses are enabled or disabled. internal Dictionary GetBodyPosesEnabled() { var bodyPosesEnabled = new Dictionary(m_Bodies.Length); diff --git a/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodySensorComponent.cs b/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodySensorComponent.cs index 283a37b3a5..6cfc4aa666 100644 --- a/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodySensorComponent.cs +++ b/com.unity.ml-agents.extensions/Runtime/Sensors/RigidBodySensorComponent.cs @@ -38,7 +38,7 @@ public class RigidBodySensorComponent : SensorComponent /// /// Creates a PhysicsBodySensor. /// - /// + /// Corresponding sensors. public override ISensor[] CreateSensors() { var _sensorName = string.IsNullOrEmpty(sensorName) ? $"PhysicsBodySensor:{RootBody?.name}" : sensorName; @@ -48,7 +48,7 @@ public override ISensor[] CreateSensors() /// /// Get the DisplayNodes of the hierarchy. /// - /// + /// The `DisplayNodes` of the hierarchy. internal IList GetDisplayNodes() { return GetPoseExtractor().GetDisplayNodes(); @@ -57,7 +57,7 @@ public override ISensor[] CreateSensors() /// /// Lazy construction of the PoseExtractor. /// - /// + /// Corresponding `RigidBodyPoseExtractor` RigidBodyPoseExtractor GetPoseExtractor() { if (m_PoseExtractor == null) diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index 8d963fe65e..1a0c5fece9 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -6,7 +6,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [4.0.0] - 2024-09-02 + ### Major Changes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) - Upgraded to Sentis 1.3.0-pre.3 (#6070) diff --git a/com.unity.ml-agents/Editor/EditorUtilities.cs b/com.unity.ml-agents/Editor/EditorUtilities.cs index 8ef266f259..1238bce7c3 100644 --- a/com.unity.ml-agents/Editor/EditorUtilities.cs +++ b/com.unity.ml-agents/Editor/EditorUtilities.cs @@ -10,7 +10,7 @@ public static class EditorUtilities /// /// Whether or not properties that affect the model can be updated at the current time. /// - /// + /// True if the model can be updated, False if not. public static bool CanUpdateModelProperties() { return !Application.isPlaying; diff --git a/com.unity.ml-agents/Runtime/Academy.cs b/com.unity.ml-agents/Runtime/Academy.cs index 52bfabb478..33c694500c 100644 --- a/com.unity.ml-agents/Runtime/Academy.cs +++ b/com.unity.ml-agents/Runtime/Academy.cs @@ -136,7 +136,7 @@ public static bool IsInitialized /// /// Reports whether or not the communicator is on. /// - /// + /// /// /// True, if communicator is on, false otherwise. /// @@ -400,7 +400,7 @@ static int ReadPortFromArgs() /// then the values of the parameters generated from the training process can be /// retrieved here. /// - /// + /// The `EnvironmentParameters` instance. public EnvironmentParameters EnvironmentParameters { get { return m_EnvironmentParameters; } @@ -410,7 +410,7 @@ public EnvironmentParameters EnvironmentParameters /// Returns the instance. This instance can be used /// to record any statistics from the Unity environment. /// - /// + /// The `StatsRecorder` instance. public StatsRecorder StatsRecorder { get { return m_StatsRecorder; } diff --git a/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs b/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs index af34bef3a3..f1e3036eeb 100644 --- a/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs +++ b/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs @@ -19,7 +19,7 @@ public abstract class ActuatorComponent : MonoBehaviour /// The specification of the possible actions for this ActuatorComponent. /// This must produce the same results as the corresponding IActuator's ActionSpec. /// - /// + /// public abstract ActionSpec ActionSpec { get; } } } diff --git a/com.unity.ml-agents/Runtime/Actuators/ActuatorManager.cs b/com.unity.ml-agents/Runtime/Actuators/ActuatorManager.cs index 1ff35557d9..6bb14a7a34 100644 --- a/com.unity.ml-agents/Runtime/Actuators/ActuatorManager.cs +++ b/com.unity.ml-agents/Runtime/Actuators/ActuatorManager.cs @@ -22,7 +22,7 @@ internal class ActuatorManager : IList /// /// Flag used to check if our IActuators are ready for execution. /// - /// + /// bool m_ReadyForExecution; /// @@ -143,7 +143,7 @@ internal static ActionSpec CombineActionSpecs(IList actuators) /// /// Returns an ActionSpec representing the concatenation of all IActuator's ActionSpecs /// - /// + /// `ActionSpec` representing the concatenation of all `ActionSpec`s. public ActionSpec GetCombinedActionSpec() { ReadyActuatorsForExecution(); diff --git a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs index 8f95de62e5..1dfc5de875 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs @@ -186,7 +186,7 @@ public interface IActionReceiver /// /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions /// - /// + /// void WriteDiscreteActionMask(IDiscreteActionMask actionMask); } } diff --git a/com.unity.ml-agents/Runtime/Actuators/IActuator.cs b/com.unity.ml-agents/Runtime/Actuators/IActuator.cs index aa2675905a..6a638bfd71 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IActuator.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IActuator.cs @@ -8,13 +8,13 @@ public interface IActuator : IActionReceiver, IHeuristicProvider /// /// The specification of the actions for this IActuator. /// - /// + /// ActionSpec ActionSpec { get; } /// /// Gets the name of this IActuator which will be used to sort it. /// - /// + /// The string name of this `IActuator` string Name { get; } /// @@ -33,7 +33,7 @@ public static class IActuatorExtensions /// Returns the number of discrete branches + the number of continuous actions. /// /// - /// + /// The number possible actions. public static int TotalNumberOfActions(this IActuator actuator) { return actuator.ActionSpec.NumContinuousActions + actuator.ActionSpec.NumDiscreteActions; diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index b1a3320e28..e3fe740204 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -228,9 +228,9 @@ internal struct AgentParameters /// Set to 0 for unlimited episode length. /// /// When an episode ends and a new one begins, the Agent object's - /// function is called. You can implement + /// function is called. You can implement /// to reset the agent or remove it from the - /// environment. An agent's episode can also end if you call its + /// environment. An agent's episode can also end if you call its /// method or an external process resets the environment through the . /// /// Consider limiting the number of steps in an episode to avoid wasting time during @@ -465,7 +465,7 @@ public void OnAfterDeserialize() /// Initializes the agent. Can be safely called multiple times. /// /// - /// This function calls your implementation, if one exists. + /// This function calls your implementation, if one exists. /// public void LazyInitialize() { @@ -560,7 +560,7 @@ enum DoneReason /// } /// /// - /// + /// protected virtual void OnDisable() { DemonstrationWriters.Clear(); @@ -685,9 +685,7 @@ internal void ReloadPolicy() /// /// Returns the current step counter (within the current episode). /// - /// - /// Current step count. - /// + /// The current step count. public int StepCount { get { return m_StepCount; } @@ -697,9 +695,7 @@ public int StepCount /// Returns the number of episodes that the Agent has completed (either /// was called, or maxSteps was reached). /// - /// - /// Current episode count. - /// + /// The current episode count. public int CompletedEpisodes { get { return m_CompletedEpisodes; } @@ -738,7 +734,7 @@ public void SetReward(float reward) /// Increments the step and episode rewards by the provided value. /// /// Use a positive reward to reinforce desired behavior. You can use a - /// negative reward to penalize mistakes. Use to + /// negative reward to penalize mistakes. Use to /// set the reward assigned to the current step with a specific value rather than /// increasing or decreasing it. /// @@ -796,8 +792,8 @@ void UpdateRewardStats() /// This should be used when the episode can no longer continue, such as when the Agent /// reaches the goal or fails at the task. /// - /// - /// + /// + /// public void EndEpisode() { EndEpisodeAndReset(DoneReason.DoneCalled); @@ -812,8 +808,8 @@ public void EndEpisode() /// This should be used when the episode could continue, but has gone on for /// a sufficient number of steps. /// - /// - /// + /// + /// public void EpisodeInterrupted() { EndEpisodeAndReset(DoneReason.MaxStepReached); @@ -838,11 +834,11 @@ void EndEpisodeAndReset(DoneReason reason) /// cannot use the decision every step, then you can request a decision less /// frequently. /// - /// You can add a component to the agent's + /// You can add a component to the agent's /// [GameObject] to drive the agent's decision making. When you use this component, /// do not call `RequestDecision()` separately. /// - /// Note that this function calls ; you do not need to + /// Note that this function calls ; you do not need to /// call both functions at the same time. /// /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html @@ -859,7 +855,7 @@ public void RequestDecision() /// /// Call `RequestAction()` to repeat the previous action returned by the agent's /// most recent decision. A new decision is not requested. When you call this function, - /// the Agent instance invokes with the + /// the Agent instance invokes with the /// existing action vector. /// /// You can use `RequestAction()` in situations where an agent must take an action @@ -867,11 +863,11 @@ public void RequestDecision() /// agent that moves through its environment might need to apply an action to keep /// moving, but only needs to make a decision to change course or speed occasionally. /// - /// You can add a component to the agent's + /// You can add a component to the agent's /// [GameObject] to drive the agent's decision making and action frequency. When you /// use this component, do not call `RequestAction()` separately. /// - /// Note that calls `RequestAction()`; you do not need to + /// Note that calls `RequestAction()`; you do not need to /// call both functions at the same time. /// /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html @@ -898,7 +894,7 @@ void ResetData() /// the Agent object needs references to other [GameObjects] in the scene, you /// can collect and store those references here. /// - /// Note that is called at the start of each of + /// Note that is called at the start of each of /// the agent's "episodes". You can use that function for items that need to be reset /// for each episode. /// @@ -919,7 +915,7 @@ public virtual void Initialize() { } /// The same array will be reused between steps. It is up to the user to initialize /// the values on each call, for example by calling `Array.Clear(actionsOut, 0, actionsOut.Length);`. /// Add values to the array at the same indexes as they are used in your - /// function, which receives this array and + /// function, which receives this array and /// implements the corresponding agent behavior. See [Actions] for more information /// about agent actions. /// Note : Do not create a new float array of action in the `Heuristic()` method, @@ -951,20 +947,20 @@ public virtual void Initialize() { } /// You can also use the [Input System package], which provides a more flexible and /// configurable input system. /// - /// public override void Heuristic(in ActionBuffers actionsOut) - /// { - /// var continuousActionsOut = actionsOut.ContinuousActions; - /// continuousActionsOut[0] = Input.GetAxis("Horizontal"); - /// continuousActionsOut[1] = Input.GetKey(KeyCode.Space) ? 1.0f : 0.0f; - /// continuousActionsOut[2] = Input.GetAxis("Vertical"); - /// } + /// public override void Heuristic(in ActionBuffers actionsOut) + /// { + /// var continuousActionsOut = actionsOut.ContinuousActions; + /// continuousActionsOut[0] = Input.GetAxis("Horizontal"); + /// continuousActionsOut[1] = Input.GetKey(KeyCode.Space) ? 1.0f : 0.0f; + /// continuousActionsOut[2] = Input.GetAxis("Vertical"); + /// } /// /// [Input Manager]: https://docs.unity3d.com/Manual/class-InputManager.html /// [Input System package]: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/index.html /// /// The which contain the continuous and /// discrete action buffers to write to. - /// + /// public virtual void Heuristic(in ActionBuffers actionsOut) { Debug.LogWarning("Heuristic method called but not implemented. Returning placeholder actions."); @@ -1175,7 +1171,7 @@ void ResetSensors() /// implement a `CollectObservations()` function. /// /// Add vector observations to the parameter passed to - /// this method by calling the helper methods: + /// this method by calling the helper methods: /// - /// - /// - @@ -1240,7 +1236,7 @@ public ReadOnlyCollection GetStackedObservations() /// /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions /// - /// + /// public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// @@ -1248,7 +1244,7 @@ public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// on the provided action. /// /// - /// An action is passed to this function in the form of an . + /// An action is passed to this function in the form of an . /// Your implementation must use the array to direct the agent's behavior for the /// current step. /// @@ -1258,7 +1254,7 @@ public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// three values in ActionBuffers.ContinuousActions array to use as the force components. /// During training, the agent's policy learns to set those particular elements of /// the array to maximize the training rewards the agent receives. (Of course, - /// if you implement a function, it must use the same + /// if you implement a function, it must use the same /// elements of the action array for the same purpose since there is no learning /// involved.) /// @@ -1315,8 +1311,8 @@ public virtual void OnActionReceived(ActionBuffers actions) { } /// Implement `OnEpisodeBegin()` to set up an Agent instance at the beginning /// of an episode. /// - /// - /// + /// + /// public virtual void OnEpisodeBegin() { } /// diff --git a/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs b/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs index 76d0cdd53b..7cf2b85ac1 100644 --- a/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs +++ b/com.unity.ml-agents/Runtime/Analytics/InferenceAnalytics.cs @@ -95,7 +95,6 @@ public static bool IsAnalyticsEnabled() /// List of ISensors for the Agent. Used to generate information about the observation space. /// ActionSpec for the Agent. Used to generate information about the action space. /// List of IActuators for the Agent. Used to generate information about the action space. - /// [Conditional("MLA_UNITY_ANALYTICS_MODULE")] public static void InferenceModelSet( ModelAsset nnModel, @@ -142,7 +141,7 @@ IList actuators /// /// /// - /// + /// `InferenceEvent` from the input model. internal static InferenceEvent GetEventForModel( ModelAsset nnModel, string behaviorName, @@ -203,7 +202,7 @@ IList actuators /// and the calculations are the same. /// /// - /// + /// The total model weight size in bytes. static long GetModelWeightSize(Model sentisModel) { long totalWeightsSizeInBytes = 0; @@ -260,7 +259,7 @@ public override string ToString() /// This increases the chance of a collision, but this should still be extremely rare. /// /// - /// + /// The hash of the model's layer data. static string GetModelHash(Model sentisModel) { var hash = new MLAgentsHash128(); diff --git a/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs b/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs index 480ea6dac2..8b9e8d7667 100644 --- a/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs +++ b/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs @@ -99,7 +99,7 @@ public static AgentInfoProto ToAgentInfoProto(this AgentInfo ai) /// Get summaries for the observations in the AgentInfo part of the AgentInfoActionPairProto. /// /// - /// + /// Summary of the observations. public static List GetObservationSummaries(this AgentInfoActionPairProto infoActionPair) { List summariesOut = new List(); @@ -337,7 +337,7 @@ public static ActionBuffers ToActionBuffers(this AgentActionProto proto) /// /// /// - /// + /// `ObservationProto` for the sensor. public static ObservationProto GetObservationProto(this ISensor sensor, ObservationWriter observationWriter) { var obsSpec = sensor.GetObservationSpec(); diff --git a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs index 2036a2aa28..b6cba33f36 100644 --- a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs +++ b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs @@ -167,7 +167,7 @@ public interface ICommunicator : IDisposable /// /// A key to identify which behavior actions to get. /// A key to identify which Agent actions to get. - /// + /// `ActionBuffers` corresponding to the input key. ActionBuffers GetActions(string key, int agentId); } } diff --git a/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs b/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs index 3dffcf52b7..2bbb2da168 100644 --- a/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs +++ b/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs @@ -38,7 +38,7 @@ public UnityRLCapabilities( /// Will print a warning to the console if Python does not support base capabilities and will /// return true if the warning was printed. /// - /// + /// True if the warning was printed, False if not. public bool WarnOnPythonMissingBaseRLCapabilities() { if (BaseRLCapabilities) diff --git a/com.unity.ml-agents/Runtime/DecisionRequester.cs b/com.unity.ml-agents/Runtime/DecisionRequester.cs index 37b5ad299c..49e92b4703 100644 --- a/com.unity.ml-agents/Runtime/DecisionRequester.cs +++ b/com.unity.ml-agents/Runtime/DecisionRequester.cs @@ -15,7 +15,7 @@ namespace Unity.MLAgents /// The DecisionRequester component provides a convenient and flexible way to /// trigger the agent decision making process. Without a DecisionRequester, /// your implementation must manually call its - /// function. + /// function. /// [AddComponentMenu("ML Agents/Decision Requester", (int)MenuGroup.Default)] [RequireComponent(typeof(Agent))] @@ -116,7 +116,7 @@ void MakeRequests(int academyStepCount) /// Whether Agent.RequestDecision should be called on this update step. /// /// - /// + /// True if the agent `RequestDecision` should be called on this update step, False if not. protected virtual bool ShouldRequestDecision(DecisionRequestContext context) { return context.AcademyStepCount % DecisionPeriod == DecisionStep; @@ -126,7 +126,7 @@ protected virtual bool ShouldRequestDecision(DecisionRequestContext context) /// Whether Agent.RequestAction should be called on this update step. /// /// - /// + /// True if the agent `RequestAction` should be called on this update step, False if not. protected virtual bool ShouldRequestAction(DecisionRequestContext context) { return TakeActionsBetweenDecisions; diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs index 13d623ebc3..91fac609db 100644 --- a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs @@ -150,7 +150,7 @@ internal static string SanitizeName(string demoName, int maxNameLength) /// /// /// - /// + /// Unique path. internal static string MakeDemonstrationFilePath( IFileSystem fileSystem, string demonstrationDirectory, string demonstrationName ) diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs index bd4426102f..f99a0202c2 100644 --- a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs @@ -9,7 +9,7 @@ namespace Unity.MLAgents.Demonstrations /// /// Responsible for writing demonstration data to stream (typically a file stream). /// - /// + /// public class DemonstrationWriter { /// diff --git a/com.unity.ml-agents/Runtime/EnvironmentParameters.cs b/com.unity.ml-agents/Runtime/EnvironmentParameters.cs index fc1c667cd6..dbf69415b0 100644 --- a/com.unity.ml-agents/Runtime/EnvironmentParameters.cs +++ b/com.unity.ml-agents/Runtime/EnvironmentParameters.cs @@ -35,7 +35,7 @@ internal EnvironmentParameters() /// /// The parameter key /// Default value for this parameter. - /// + /// The parameter value for the specified key. public float GetWithDefault(string key, float defaultValue) { return m_Channel.GetWithDefault(key, defaultValue); diff --git a/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs b/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs index 791c1319d2..a2ef038299 100644 --- a/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs +++ b/com.unity.ml-agents/Runtime/Inference/SentisModelInfo.cs @@ -97,7 +97,7 @@ public IReadOnlyList GetInputTensors() /// /// Gets the Discrete Action Output Shape as a Tensor. /// - /// + /// `Tensor` representation of the discret Action Ouptut Shape. public Tensor GetDiscreteActionOutputShape() { return (Tensor)GetTensorByName(TensorNames.DiscreteActionOutputShape); diff --git a/com.unity.ml-agents/Runtime/InplaceArray.cs b/com.unity.ml-agents/Runtime/InplaceArray.cs index 91208136d8..ab6fc0969f 100644 --- a/com.unity.ml-agents/Runtime/InplaceArray.cs +++ b/com.unity.ml-agents/Runtime/InplaceArray.cs @@ -84,7 +84,7 @@ public InplaceArray(T elem0, T elem1, T elem2, T elem3) /// The source must be non-empty and have at most 4 elements. /// /// - /// + /// Corresponding `InplaceArray` from the input IList. /// public static InplaceArray FromList(IList elems) { @@ -170,7 +170,7 @@ public int Length /// /// Returns a string representation of the array's elements. /// - /// + /// The string summary of the `InplaceArray`. /// public override string ToString() { @@ -231,7 +231,7 @@ public bool Equals(InplaceArray other) /// /// Get a hashcode for the array. /// - /// + /// The hashcode of the `InplaceArray`. public override int GetHashCode() { return (m_Elem0, m_Elem1, m_Elem2, m_Elem3, Length).GetHashCode(); diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs index d2f218a3f7..1a5a15b90d 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs @@ -35,8 +35,8 @@ public struct BoardSize /// /// Check that all fields of the left-hand BoardSize are less than or equal to the field of the right-hand BoardSize /// - /// - /// + /// The first 'BoardSize' to compare. + /// The second 'BoardSize' to compare. /// True if all fields are less than or equal. public static bool operator <=(BoardSize lhs, BoardSize rhs) { @@ -47,8 +47,8 @@ public struct BoardSize /// /// Check that all fields of the left-hand BoardSize are greater than or equal to the field of the right-hand BoardSize /// - /// - /// + /// The first 'BoardSize' to compare. + /// The second 'BoardSize' to compare. /// True if all fields are greater than or equal. public static bool operator >=(BoardSize lhs, BoardSize rhs) { @@ -59,7 +59,7 @@ public struct BoardSize /// /// Return a string representation of the BoardSize. /// - /// + /// The string summary of the `BoardSize`. public override string ToString() { return @@ -76,7 +76,7 @@ public abstract class AbstractBoard : MonoBehaviour /// Return the maximum size of the board. This is used to determine the size of observations and actions, /// so the returned values must not change. /// - /// + /// The maxium size of the board. public abstract BoardSize GetMaxBoardSize(); /// @@ -85,7 +85,7 @@ public abstract class AbstractBoard : MonoBehaviour /// By default, this will return ; if your board doesn't change size, you don't need to /// override it. /// - /// + /// The current size of the board. public virtual BoardSize GetCurrentBoardSize() { return GetMaxBoardSize(); @@ -96,9 +96,9 @@ public virtual BoardSize GetCurrentBoardSize() /// This should be between 0 and BoardSize.NumCellTypes-1 (inclusive). /// The actual order of the values doesn't matter. /// - /// - /// - /// + /// The row index. + /// The collunm index. + /// Color of piece at given row and column. public abstract int GetCellType(int row, int col); /// @@ -108,7 +108,7 @@ public virtual BoardSize GetCurrentBoardSize() /// /// /// - /// + /// The special type of the piece at the give row and column. public abstract int GetSpecialType(int row, int col); /// @@ -121,7 +121,7 @@ public virtual BoardSize GetCurrentBoardSize() /// passed to IsMoveValid(). /// /// The move to check. - /// + /// True if the move is valid False otherwise. public abstract bool IsMoveValid(Move m); /// @@ -130,13 +130,13 @@ public virtual BoardSize GetCurrentBoardSize() /// requested. If this happens, it is safe to do nothing and request another move. /// /// The move to carry out. - /// + /// True if the move was made, False otherwise. public abstract bool MakeMove(Move m); /// /// Return the total number of moves possible for the board. /// - /// + /// The total number of moves possible for the board. public int NumMoves() { return Move.NumPotentialMoves(GetMaxBoardSize()); @@ -151,7 +151,7 @@ public int NumMoves() /// /// Iterate through all moves on the board. /// - /// + /// The `IEnumerator` for iterating all moves. public IEnumerable AllMoves() { var maxBoardSize = GetMaxBoardSize(); @@ -171,7 +171,7 @@ public IEnumerable AllMoves() /// /// Iterate through all valid moves on the board. /// - /// + /// The `IEnumerator` for iterating the valid moves. public IEnumerable ValidMoves() { var maxBoardSize = GetMaxBoardSize(); @@ -194,7 +194,7 @@ public IEnumerable ValidMoves() /// to be moved; to add extra logic, incorporate it into your method. /// /// - /// + /// True if swapping the cells would result in 3 or more cells of the same type in a row. public bool SimpleIsMoveValid(Move move) { using (TimerStack.Instance.Scoped("SimpleIsMoveValid")) @@ -232,7 +232,7 @@ public bool SimpleIsMoveValid(Move move) /// /// /// - /// + /// True if one of the cells that is swapped during a move matches 3 or more, False otherwise. bool CheckHalfMove(int newRow, int newCol, int newValue, Direction incomingDirection) { var currentBoardSize = GetCurrentBoardSize(); diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs index 9bd60bd571..62a2b7df37 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs @@ -135,7 +135,7 @@ public void Heuristic(in ActionBuffers actionsOut) /// By default, EvalMovePoints() returns 1, so all valid moves are equally likely. Inherit from this class and /// override EvalMovePoints() to use your game's scoring as a better estimate. /// - /// + /// Valid mode. internal int GreedyMove() { var bestMoveIndex = 0; diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs index 50fcd7ece6..282aec5308 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs @@ -89,7 +89,7 @@ public Match3Sensor(AbstractBoard board, GridValueProvider gvp, int oneHotSize, /// The abstract board. /// Whether to produce vector or visual observations /// Name of the sensor. - /// + /// `Match3Sensor` that encodes the board cells as observations. public static Match3Sensor CellTypeSensor(AbstractBoard board, Match3ObservationType obsType, string name) { var maxBoardSize = board.GetMaxBoardSize(); @@ -103,7 +103,7 @@ public static Match3Sensor CellTypeSensor(AbstractBoard board, Match3Observation /// The abstract board. /// Whether to produce vector or visual observations /// Name of the sensor. - /// + /// `Match3Sensor` that encodes the board cell special types as observations. public static Match3Sensor SpecialTypeSensor(AbstractBoard board, Match3ObservationType obsType, string name) { var maxBoardSize = board.GetMaxBoardSize(); diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs index d4aac5f854..96fc75b857 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs @@ -66,7 +66,7 @@ public struct Move /// /// Must be between 0 and NumPotentialMoves(maxRows, maxCols). /// - /// + /// Corresponding `Move`. /// public static Move FromMoveIndex(int moveIndex, BoardSize maxBoardSize) { @@ -147,7 +147,7 @@ public void Next(BoardSize maxBoardSize) /// /// /// - /// + /// Corresponding `Move`. public static Move FromPositionAndDirection(int row, int col, Direction dir, BoardSize maxBoardSize) { // Check for out-of-bounds @@ -209,7 +209,7 @@ public static Move FromPositionAndDirection(int row, int col, Direction dir, Boa /// This will be passed the return value from AbstractBoard.GetCurrentBoardSize(). /// /// - /// + /// True if move is valide given input `boardSize`, False if not. public bool InRangeForBoard(BoardSize boardSize) { var (otherRow, otherCol) = OtherCell(); @@ -222,7 +222,7 @@ public bool InRangeForBoard(BoardSize boardSize) /// /// Get the other row and column that correspond to this move. /// - /// + /// Corresponding other (row, column) tuple for this move. /// public (int Row, int Column) OtherCell() { @@ -244,7 +244,7 @@ public bool InRangeForBoard(BoardSize boardSize) /// /// Get the opposite direction of this move. /// - /// + /// Oposit `Direction` of this move. /// public Direction OtherDirection() { @@ -268,7 +268,7 @@ public Direction OtherDirection() /// This is equivalent to the number of internal edges in the board. /// /// - /// + /// Number of potential moves given a boardsize. public static int NumPotentialMoves(BoardSize maxBoardSize) { return maxBoardSize.Rows * (maxBoardSize.Columns - 1) + (maxBoardSize.Rows - 1) * (maxBoardSize.Columns); diff --git a/com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs b/com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs index 598a450d30..06dc8d6e16 100644 --- a/com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs +++ b/com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs @@ -63,7 +63,7 @@ public enum ObservableAttributeOptions } /// - /// A component for setting an instance's behavior and + /// A component for setting an instance's behavior and /// brain properties. /// /// At runtime, this component generates the agent's policy objects diff --git a/com.unity.ml-agents/Runtime/Policies/BrainParameters.cs b/com.unity.ml-agents/Runtime/Policies/BrainParameters.cs index 882521a892..59b1f0e8c0 100644 --- a/com.unity.ml-agents/Runtime/Policies/BrainParameters.cs +++ b/com.unity.ml-agents/Runtime/Policies/BrainParameters.cs @@ -28,7 +28,7 @@ internal enum SpaceType /// /// /// Set brain parameters for an instance using the - /// component attached to the agent's [GameObject]. + /// component attached to the agent's [GameObject]. /// /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html /// diff --git a/com.unity.ml-agents/Runtime/SensorHelper.cs b/com.unity.ml-agents/Runtime/SensorHelper.cs index 978fc59f5e..97a21521e7 100644 --- a/com.unity.ml-agents/Runtime/SensorHelper.cs +++ b/com.unity.ml-agents/Runtime/SensorHelper.cs @@ -17,7 +17,7 @@ public static class SensorHelper /// /// /// - /// + /// True if the observations for the provided sensor equal the expected values, False if not. public static bool CompareObservation(ISensor sensor, float[] expected, out string errorMessage) { var numExpected = expected.Length; @@ -79,7 +79,7 @@ public static bool CompareObservation(ISensor sensor, float[] expected, out stri /// /// /// - /// + /// True if the generated observation for the provided sensor equal the expected values, False if not. public static bool CompareObservation(ISensor sensor, float[,,] expected, out string errorMessage) { var tensorShape = new TensorShape(0, expected.GetLength(0), expected.GetLength(1), expected.GetLength(2)); diff --git a/com.unity.ml-agents/Runtime/Sensors/BoxOverlapChecker.cs b/com.unity.ml-agents/Runtime/Sensors/BoxOverlapChecker.cs index 5ec58b1358..c73c36015d 100644 --- a/com.unity.ml-agents/Runtime/Sensors/BoxOverlapChecker.cs +++ b/com.unity.ml-agents/Runtime/Sensors/BoxOverlapChecker.cs @@ -152,7 +152,7 @@ public void UpdateGizmo() /// /// /// - /// + /// Found number of overlapping boxes. int BufferResizingOverlapBoxNonAlloc(Vector3 cellCenter, Vector3 halfCellScale, Quaternion rotation) { int numFound; diff --git a/com.unity.ml-agents/Runtime/Sensors/CameraSensor.cs b/com.unity.ml-agents/Runtime/Sensors/CameraSensor.cs index 12dc651387..f4e9275d4b 100644 --- a/com.unity.ml-agents/Runtime/Sensors/CameraSensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/CameraSensor.cs @@ -75,7 +75,7 @@ public string GetName() /// The dimensions have translational equivariance along width and height, /// and no property along the channels dimension. /// - /// + /// The `ObservationSpec`. public ObservationSpec GetObservationSpec() { return m_ObservationSpec; @@ -99,7 +99,7 @@ public byte[] GetCompressedObservation() /// Writes out the generated, uncompressed image to the provided . /// /// Where the observation is written to. - /// + /// The number of elements written. public int Write(ObservationWriter writer) { using (TimerStack.Instance.Scoped("CameraSensor.WriteToTensor")) diff --git a/com.unity.ml-agents/Runtime/Sensors/CompressionSpec.cs b/com.unity.ml-agents/Runtime/Sensors/CompressionSpec.cs index 76e283a14a..52248b2609 100644 --- a/com.unity.ml-agents/Runtime/Sensors/CompressionSpec.cs +++ b/com.unity.ml-agents/Runtime/Sensors/CompressionSpec.cs @@ -72,7 +72,7 @@ public CompressionSpec(SensorCompressionType sensorCompressionType, int[] compre /// /// Return a CompressionSpec indicating no compression. This is recommended for most sensors. /// - /// + /// `CompressionSpec` indicating no compression. public static CompressionSpec Default() { return new CompressionSpec @@ -86,7 +86,7 @@ public static CompressionSpec Default() /// Return whether the compressed channel mapping is "trivial"; if so it doesn't need to be sent to the /// trainer. /// - /// + /// True if the compressed channel mapping is trivial, False if not. internal bool IsTrivialMapping() { var mapping = CompressedChannelMapping; diff --git a/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs b/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs index 09e7c92c40..24df9ea228 100644 --- a/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs +++ b/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs @@ -189,13 +189,13 @@ void GridValuesToTexture(int channelIndex, int numChannelsToAdd) /// Default is to record the detected tag index. /// /// This method can be overridden to encode the observation differently or get custom data from the object. - /// When overriding this method, and + /// When overriding this method, and /// might also need to change accordingly. /// /// The game object that was detected within a certain cell /// The index of the detectedObject's tag in the DetectableObjects list /// The buffer to write the observation values. - /// The buffer size is configured by . + /// The buffer size is configured by . /// /// /// Here is an example of overriding GetObjectData to get the velocity of a potential Rigidbody: @@ -218,8 +218,8 @@ protected virtual void GetObjectData(GameObject detectedObject, int tagIndex, fl } /// - /// Get the observation size for each cell. This will be the size of dataBuffer for . - /// If overriding , override this method as well to the custom observation size. + /// Get the observation size for each cell. This will be the size of dataBuffer for . + /// If overriding , override this method as well to the custom observation size. /// /// The observation size of each cell. protected virtual int GetCellObservationSize() @@ -229,7 +229,7 @@ protected virtual int GetCellObservationSize() /// /// Whether the data is normalized within [0, 1]. The sensor can only use PNG compression if the data is normailzed. - /// If overriding , override this method as well according to the custom observation values. + /// If overriding , override this method as well according to the custom observation values. /// /// Bool value indicating whether data is normalized. protected virtual bool IsDataNormalized() @@ -239,7 +239,7 @@ protected virtual bool IsDataNormalized() /// /// Whether to process all detected colliders in a cell. Default to false and only use the one closest to the agent. - /// If overriding , consider override this method when needed. + /// If overriding , consider override this method when needed. /// /// Bool value indicating whether to process all detected colliders in a cell. protected internal virtual ProcessCollidersMethod GetProcessCollidersMethod() diff --git a/com.unity.ml-agents/Runtime/Sensors/ISensor.cs b/com.unity.ml-agents/Runtime/Sensors/ISensor.cs index ed93910fa0..f9f4f99ce0 100644 --- a/com.unity.ml-agents/Runtime/Sensors/ISensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/ISensor.cs @@ -114,7 +114,7 @@ public static class SensorExtensions /// shape elements). /// /// - /// + /// The total number of elements in the `ISensor`'s observation. public static int ObservationSize(this ISensor sensor) { var obsSpec = sensor.GetObservationSpec(); diff --git a/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs b/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs index 2974d7982d..af2fbc66b2 100644 --- a/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs +++ b/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs @@ -58,7 +58,7 @@ public int Rank /// /// /// - /// + /// `ObservationSpec` for 1-D observations of the requested length. public static ObservationSpec Vector(int length, ObservationType obsType = ObservationType.Default) { return new ObservationSpec( @@ -73,7 +73,7 @@ public static ObservationSpec Vector(int length, ObservationType obsType = Obser /// /// /// - /// + /// `ObservationSpec` for variable-length observations. public static ObservationSpec VariableLength(int obsSize, int maxNumObs) { var dimProps = new InplaceArray( @@ -94,7 +94,7 @@ public static ObservationSpec VariableLength(int obsSize, int maxNumObs) /// /// /// - /// + /// `ObservationSpec` for visual-like observations public static ObservationSpec Visual(int channels, int height, int width, ObservationType obsType = ObservationType.Default) { var dimProps = new InplaceArray( diff --git a/com.unity.ml-agents/Runtime/Sensors/OneHotGridSensor.cs b/com.unity.ml-agents/Runtime/Sensors/OneHotGridSensor.cs index 648c702d80..89be650e05 100644 --- a/com.unity.ml-agents/Runtime/Sensors/OneHotGridSensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/OneHotGridSensor.cs @@ -49,7 +49,7 @@ protected internal override ProcessCollidersMethod GetProcessCollidersMethod() /// The game object that was detected within a certain cell /// The index of the detectedObject's tag in the DetectableObjects list /// The buffer to write the observation values. - /// The buffer size is configured by . + /// The buffer size is configured by . /// protected override void GetObjectData(GameObject detectedObject, int tagIndex, float[] dataBuffer) { diff --git a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs index 55a6086660..5ecf3ca49b 100644 --- a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs @@ -82,7 +82,7 @@ public struct RayPerceptionInput /// /// Returns the expected number of floats in the output. /// - /// + /// The expected number of floats in the output. public int OutputSize() { return ((DetectableTags?.Count ?? 0) + 2) * (Angles?.Count ?? 0); @@ -317,7 +317,7 @@ internal void SetRayPerceptionInput(RayPerceptionInput rayInput) /// . /// /// Where the ray perception observations are written to. - /// + /// The number of written observations. public int Write(ObservationWriter writer) { using (TimerStack.Instance.Scoped("RayPerceptionSensor.Perceive")) @@ -427,7 +427,6 @@ public static RayPerceptionOutput Perceive(RayPerceptionInput input, bool batche /// /// /// - /// internal static void PerceiveBatchedRays(ref RayPerceptionOutput.RayOutput[] batchedRaycastOutputs, RayPerceptionInput input) { var numRays = input.Angles.Count; @@ -554,7 +553,7 @@ internal static void PerceiveBatchedRays(ref RayPerceptionOutput.RayOutput[] bat /// /// /// - /// + /// `RayOutput` result of a single raycast. internal static RayPerceptionOutput.RayOutput PerceiveSingleRay( RayPerceptionInput input, int rayIndex diff --git a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs index 35c4fd5320..a959f13aa6 100644 --- a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs +++ b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs @@ -188,13 +188,13 @@ public RayPerceptionSensor RaySensor /// /// Returns the for the associated raycast sensor. /// - /// + /// `RayPerceptionCastType` for the associated raycast sensor. public abstract RayPerceptionCastType GetCastType(); /// /// Returns the amount that the ray start is offset up or down by. /// - /// + /// The amount that the ray start is offset up or down by. public virtual float GetStartVerticalOffset() { return 0f; @@ -203,7 +203,7 @@ public virtual float GetStartVerticalOffset() /// /// Returns the amount that the ray end is offset up or down by. /// - /// + /// The amount that the ray end is offset up or down by. public virtual float GetEndVerticalOffset() { return 0f; @@ -212,7 +212,7 @@ public virtual float GetEndVerticalOffset() /// /// Returns an initialized raycast sensor. /// - /// + /// Initialized `ISensor` array. public override ISensor[] CreateSensors() { var rayPerceptionInput = GetRayPerceptionInput(); @@ -240,7 +240,7 @@ public override ISensor[] CreateSensors() /// Should be deprecated with a future major version release (doing so will break existing /// models). /// - /// + /// The corresponding ray angles. internal static float[] GetRayAnglesAlternating(int raysPerDirection, float maxRayDegrees) { // Example: @@ -267,7 +267,7 @@ internal static float[] GetRayAnglesAlternating(int raysPerDirection, float maxR /// Orders the rays from the left-most to the right-most which makes using a convolution /// in the model easier. /// - /// + /// The corresponding ray angles. internal static float[] GetRayAngles(int raysPerDirection, float maxRayDegrees) { // Example: @@ -286,7 +286,7 @@ internal static float[] GetRayAngles(int raysPerDirection, float maxRayDegrees) /// /// Get the RayPerceptionInput that is used by the . /// - /// + /// `RayPerceptionInput` that is used by the sensor. public RayPerceptionInput GetRayPerceptionInput() { var rayAngles = m_AlternatingRayOrder ? diff --git a/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs b/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs index a88528c873..e476a1170f 100644 --- a/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs +++ b/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs @@ -86,7 +86,7 @@ public ObservableAttribute(string name = null, int numStackedObservations = 1) /// /// Object being reflected /// Whether to exclude inherited properties or not. - /// + /// `FieldInfo` for all fields that have an O`bservableAttribute`. static IEnumerable<(FieldInfo, ObservableAttribute)> GetObservableFields(object o, bool excludeInherited) { // TODO cache these (and properties) by type, so that we only have to reflect once. @@ -107,7 +107,7 @@ public ObservableAttribute(string name = null, int numStackedObservations = 1) /// /// Object being reflected /// Whether to exclude inherited properties or not. - /// + /// `PropertyInfo` for all fields that have an `ObservableAttribute`. static IEnumerable<(PropertyInfo, ObservableAttribute)> GetObservableProperties(object o, bool excludeInherited) { var bindingFlags = k_BindingFlags | (excludeInherited ? BindingFlags.DeclaredOnly : 0); @@ -127,7 +127,7 @@ public ObservableAttribute(string name = null, int numStackedObservations = 1) /// /// Object being reflected /// Whether to exclude inherited properties or not. - /// + /// Corresponding list of sensors. internal static List CreateObservableSensors(object o, bool excludeInherited) { var sensorsOut = new List(); @@ -165,7 +165,7 @@ internal static List CreateObservableSensors(object o, bool excludeInhe /// /// /// - /// + /// The created `ISensor`. /// static ISensor CreateReflectionSensor(object o, FieldInfo fieldInfo, PropertyInfo propertyInfo, ObservableAttribute observableAttribute) { @@ -237,7 +237,7 @@ static ISensor CreateReflectionSensor(object o, FieldInfo fieldInfo, PropertyInf /// /// /// - /// + /// The total observation size. internal static int GetTotalObservationSize(object o, bool excludeInherited, List errorsOut) { int sizeOut = 0; diff --git a/com.unity.ml-agents/Runtime/Sensors/Reflection/ReflectionSensorBase.cs b/com.unity.ml-agents/Runtime/Sensors/Reflection/ReflectionSensorBase.cs index 9a0219146e..49aadfe595 100644 --- a/com.unity.ml-agents/Runtime/Sensors/Reflection/ReflectionSensorBase.cs +++ b/com.unity.ml-agents/Runtime/Sensors/Reflection/ReflectionSensorBase.cs @@ -70,7 +70,7 @@ public int Write(ObservationWriter writer) /// Get either the reflected field, or return the reflected property. /// This should be used by implementations in their WriteReflectedField() method. /// - /// + /// `object` representing either the reflected field, or return the reflected property. protected object GetReflectedValue() { return m_FieldInfo != null ? diff --git a/com.unity.ml-agents/Runtime/Sensors/VectorSensorComponent.cs b/com.unity.ml-agents/Runtime/Sensors/VectorSensorComponent.cs index 26deb7434f..71e36d9b5b 100644 --- a/com.unity.ml-agents/Runtime/Sensors/VectorSensorComponent.cs +++ b/com.unity.ml-agents/Runtime/Sensors/VectorSensorComponent.cs @@ -64,7 +64,7 @@ public int ObservationStacks /// /// Creates a VectorSensor. /// - /// + /// `ISensor` array. public override ISensor[] CreateSensors() { m_Sensor = new VectorSensor(m_ObservationSize, m_SensorName, m_ObservationType); @@ -78,7 +78,7 @@ public override ISensor[] CreateSensors() /// /// Returns the underlying VectorSensor /// - /// + /// Underlying `VectorSensor`. public VectorSensor GetSensor() { return m_Sensor; diff --git a/com.unity.ml-agents/Runtime/SideChannels/EnvironmentParametersChannel.cs b/com.unity.ml-agents/Runtime/SideChannels/EnvironmentParametersChannel.cs index 0e2b88b6ec..0395ca00c1 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/EnvironmentParametersChannel.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/EnvironmentParametersChannel.cs @@ -111,7 +111,7 @@ protected override void OnMessageReceived(IncomingMessage msg) /// /// Parameter key. /// Default value to return. - /// + /// The parameter value associated with the provided key. public float GetWithDefault(string key, float defaultValue) { Func valueOut; @@ -133,7 +133,7 @@ public void RegisterCallback(string key, Action action) /// /// Returns all parameter keys that have a registered value. /// - /// + /// All parameter keys that have a registered value. public IList ListParameters() { return new List(m_Parameters.Keys); diff --git a/com.unity.ml-agents/Runtime/SideChannels/FloatPropertiesChannel.cs b/com.unity.ml-agents/Runtime/SideChannels/FloatPropertiesChannel.cs index f4c293547b..d93728b0eb 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/FloatPropertiesChannel.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/FloatPropertiesChannel.cs @@ -67,7 +67,7 @@ public void Set(string key, float value) /// /// The string identifier of the property. /// The default value of the property. - /// + /// The parameter value associated with the provided key. public float GetWithDefault(string key, float defaultValue) { float valueOut; diff --git a/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs b/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs index 90425955de..a159591862 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs @@ -30,7 +30,7 @@ public IncomingMessage(byte[] data) /// Read a boolean value from the message. /// /// Default value to use if the end of the message is reached. - /// + /// True if boolean was read by the reader, False if not. public bool ReadBoolean(bool defaultValue = false) { return CanReadMore() ? m_Reader.ReadBoolean() : defaultValue; @@ -40,7 +40,7 @@ public bool ReadBoolean(bool defaultValue = false) /// Read an integer value from the message. /// /// Default value to use if the end of the message is reached. - /// + /// True if int32 was read by the reader, False if not. public int ReadInt32(int defaultValue = 0) { return CanReadMore() ? m_Reader.ReadInt32() : defaultValue; @@ -50,7 +50,7 @@ public int ReadInt32(int defaultValue = 0) /// Read a float value from the message. /// /// Default value to use if the end of the message is reached. - /// + /// True if float32 was read by the reader, False if not. public float ReadFloat32(float defaultValue = 0.0f) { return CanReadMore() ? m_Reader.ReadSingle() : defaultValue; @@ -60,7 +60,7 @@ public float ReadFloat32(float defaultValue = 0.0f) /// Read a string value from the message. /// /// Default value to use if the end of the message is reached. - /// + /// True if string was read by the reader, False if not. public string ReadString(string defaultValue = default) { if (!CanReadMore()) @@ -77,7 +77,7 @@ public string ReadString(string defaultValue = default) /// Reads a list of floats from the message. The length of the list is stored in the message. /// /// Default value to use if the end of the message is reached. - /// + /// True if list of float was read by the reader, False if not. public IList ReadFloatList(IList defaultValue = default) { if (!CanReadMore()) @@ -99,7 +99,7 @@ public IList ReadFloatList(IList defaultValue = default) /// Gets the original data of the message. Note that this will return all of the data, /// even if part of it has already been read. /// - /// + /// Original data of the message. public byte[] GetRawBytes() { return m_Data; @@ -117,7 +117,7 @@ public void Dispose() /// /// Whether or not there is more data left in the stream that can be read. /// - /// + /// True if there is still data left in the stream that can be read, False if not. [MethodImpl(MethodImplOptions.AggressiveInlining)] bool CanReadMore() { diff --git a/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs b/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs index 70a7948e22..673b4f20b9 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs @@ -101,7 +101,7 @@ public void SetRawBytes(byte[] data) /// /// Read the byte array of the message. /// - /// + /// The byte array of the message. internal byte[] ToByteArray() { return m_Stream.ToArray(); diff --git a/com.unity.ml-agents/Runtime/SideChannels/SideChannelManager.cs b/com.unity.ml-agents/Runtime/SideChannels/SideChannelManager.cs index bdcc596b85..b2d56b9c34 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/SideChannelManager.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/SideChannelManager.cs @@ -89,7 +89,7 @@ internal static void UnregisterAllSideChannels() /// If there are multiple SideChannels of the same type registered, the returned instance is arbitrary. /// /// - /// + /// SideChannel if there is one registered. internal static T GetSideChannel() where T : SideChannel { foreach (var sc in s_RegisteredChannels.Values) @@ -106,7 +106,7 @@ internal static T GetSideChannel() where T : SideChannel /// Grabs the messages that the registered side channels will send to Python at the current step /// into a singe byte array. /// - /// + /// The message that the registered side channels will send to Python at the current step. internal static byte[] GetSideChannelMessage() { return GetSideChannelMessage(s_RegisteredChannels); @@ -117,7 +117,7 @@ internal static byte[] GetSideChannelMessage() /// into a singe byte array. /// /// A dictionary of channel type to channel. - /// + /// The message that the registered side channels will send to Python at the current step. internal static byte[] GetSideChannelMessage(Dictionary sideChannels) { if (!HasOutgoingMessages(sideChannels)) @@ -151,7 +151,7 @@ internal static byte[] GetSideChannelMessage(Dictionary sideC /// Check whether any of the sidechannels have queued messages. /// /// - /// + /// True if the sidechannel has queued messages, False if not. static bool HasOutgoingMessages(Dictionary sideChannels) { foreach (var sideChannel in sideChannels.Values) diff --git a/com.unity.ml-agents/Runtime/Timer.cs b/com.unity.ml-agents/Runtime/Timer.cs index 7de390343f..a0f2bcf8d8 100644 --- a/com.unity.ml-agents/Runtime/Timer.cs +++ b/com.unity.ml-agents/Runtime/Timer.cs @@ -160,7 +160,7 @@ public void End() /// Note that these allocations only happen once for a given timed block. /// /// - /// + /// The `TimerNode` child node. public TimerNode GetChild(string name) { // Lazily create the children dictionary. @@ -185,7 +185,7 @@ public TimerNode GetChild(string name) /// /// /// - /// + /// The string summary of the `TimerNode`. public string DebugGetTimerString(string parentName = "", int level = 0) { var indent = new string(' ', 2 * level); // TODO generalize @@ -456,7 +456,7 @@ void Pop() /// Start a scoped timer. This should be used with the "using" statement. /// /// - /// + /// `TimerStack` scoped timer. public TimerStack Scoped(string name) { Push(name); @@ -478,7 +478,7 @@ public void Dispose() /// Get a string representation of the timers. /// Potentially slow so call sparingly. /// - /// + /// The string summary of the `TimerStack`. internal string DebugGetTimerString() { return m_RootNode.DebugGetTimerString(); diff --git a/com.unity.ml-agents/Tests/Editor/Integrations/Match3/Match3SensorTests.cs b/com.unity.ml-agents/Tests/Editor/Integrations/Match3/Match3SensorTests.cs index 1dc9d6f150..09d882427a 100644 --- a/com.unity.ml-agents/Tests/Editor/Integrations/Match3/Match3SensorTests.cs +++ b/com.unity.ml-agents/Tests/Editor/Integrations/Match3/Match3SensorTests.cs @@ -351,7 +351,7 @@ public void TestCompressedVisualObservationsSpecial(bool fullBoard, bool useSpec /// Helper method for un-concatenating PNG observations. /// /// - /// + /// The PNG observations. List SplitPNGs(byte[] concatenated) { var pngsOut = new List(); From 66d15088ab4725896456fe0cb0f2cb38442dd700 Mon Sep 17 00:00:00 2001 From: alexandre-ribard Date: Mon, 2 Sep 2024 16:47:42 -0400 Subject: [PATCH 05/43] adressing xml docs --- .../Editor/DemonstrationDrawer.cs | 2 +- com.unity.ml-agents/Runtime/Academy.cs | 7 ---- com.unity.ml-agents/Runtime/Agent.cs | 3 +- .../Runtime/DecisionRequester.cs | 4 +-- .../Demonstrations/DemonstrationRecorder.cs | 4 +-- com.unity.ml-agents/Runtime/InplaceArray.cs | 34 +++++++++---------- .../Integrations/Match3/AbstractBoard.cs | 6 ++-- com.unity.ml-agents/Runtime/SensorHelper.cs | 6 ++-- 8 files changed, 29 insertions(+), 37 deletions(-) diff --git a/com.unity.ml-agents/Editor/DemonstrationDrawer.cs b/com.unity.ml-agents/Editor/DemonstrationDrawer.cs index 484e6b6a9a..7a8f4854bd 100644 --- a/com.unity.ml-agents/Editor/DemonstrationDrawer.cs +++ b/com.unity.ml-agents/Editor/DemonstrationDrawer.cs @@ -95,7 +95,7 @@ void MakeActionsProperty(SerializedProperty property) /// /// Render the observation shapes of a DemonstrationSummary. /// - /// + /// Serialized properties. void MakeObservationsProperty(SerializedProperty obsSummariesProperty) { var shapesLabels = new List(); diff --git a/com.unity.ml-agents/Runtime/Academy.cs b/com.unity.ml-agents/Runtime/Academy.cs index 33c694500c..1c220b7e6b 100644 --- a/com.unity.ml-agents/Runtime/Academy.cs +++ b/com.unity.ml-agents/Runtime/Academy.cs @@ -410,7 +410,6 @@ public EnvironmentParameters EnvironmentParameters /// Returns the instance. This instance can be used /// to record any statistics from the Unity environment. /// - /// The `StatsRecorder` instance. public StatsRecorder StatsRecorder { get { return m_StatsRecorder; } @@ -537,9 +536,6 @@ public int EpisodeCount /// /// The current step count (within the current episode). /// - /// - /// Current step count. - /// public int StepCount { get { return m_StepCount; } @@ -548,9 +544,6 @@ public int StepCount /// /// Returns the total step count. /// - /// - /// Total step count. - /// public int TotalStepCount { get { return m_TotalStepCount; } diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index e3fe740204..7f6dfd9661 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -695,7 +695,6 @@ public int StepCount /// Returns the number of episodes that the Agent has completed (either /// was called, or maxSteps was reached). /// - /// The current episode count. public int CompletedEpisodes { get { return m_CompletedEpisodes; } @@ -818,7 +817,7 @@ public void EpisodeInterrupted() /// /// Internal method to end the episode and reset the Agent. /// - /// + /// reason to end the episode. void EndEpisodeAndReset(DoneReason reason) { NotifyAgentDone(reason); diff --git a/com.unity.ml-agents/Runtime/DecisionRequester.cs b/com.unity.ml-agents/Runtime/DecisionRequester.cs index 49e92b4703..178c9c0864 100644 --- a/com.unity.ml-agents/Runtime/DecisionRequester.cs +++ b/com.unity.ml-agents/Runtime/DecisionRequester.cs @@ -115,7 +115,7 @@ void MakeRequests(int academyStepCount) /// /// Whether Agent.RequestDecision should be called on this update step. /// - /// + /// `RequestDecision` context. /// True if the agent `RequestDecision` should be called on this update step, False if not. protected virtual bool ShouldRequestDecision(DecisionRequestContext context) { @@ -125,7 +125,7 @@ protected virtual bool ShouldRequestDecision(DecisionRequestContext context) /// /// Whether Agent.RequestAction should be called on this update step. /// - /// + /// `RequestDecision` context. /// True if the agent `RequestAction` should be called on this update step, False if not. protected virtual bool ShouldRequestAction(DecisionRequestContext context) { diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs index 91fac609db..61b97eed73 100644 --- a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs @@ -203,7 +203,7 @@ void OnDestroy() /// Add additional DemonstrationWriter to the Agent. It is still up to the user to Close this /// DemonstrationWriters when recording is done. /// - /// + /// `DemonstrationWriter` demonstation writer public void AddDemonstrationWriterToAgent(DemonstrationWriter demoWriter) { var behaviorParams = GetComponent(); @@ -219,7 +219,7 @@ public void AddDemonstrationWriterToAgent(DemonstrationWriter demoWriter) /// Remove additional DemonstrationWriter to the Agent. It is still up to the user to Close this /// DemonstrationWriters when recording is done. /// - /// + /// `DemonstrationWriter` demonstation writer public void RemoveDemonstrationWriterFromAgent(DemonstrationWriter demoWriter) { m_Agent.DemonstrationWriters.Remove(demoWriter); diff --git a/com.unity.ml-agents/Runtime/InplaceArray.cs b/com.unity.ml-agents/Runtime/InplaceArray.cs index ab6fc0969f..47d733cbe1 100644 --- a/com.unity.ml-agents/Runtime/InplaceArray.cs +++ b/com.unity.ml-agents/Runtime/InplaceArray.cs @@ -24,7 +24,7 @@ public struct InplaceArray : IEquatable> where T : struct /// /// Create a length-1 array. /// - /// + /// Length of axis 0. public InplaceArray(T elem0) { m_Length = 1; @@ -37,8 +37,8 @@ public InplaceArray(T elem0) /// /// Create a length-2 array. /// - /// - /// + /// Length of axis 0. + /// Length of axis 1. public InplaceArray(T elem0, T elem1) { m_Length = 2; @@ -51,9 +51,9 @@ public InplaceArray(T elem0, T elem1) /// /// Create a length-3 array. /// - /// - /// - /// + /// Length of axis 0. + /// Length of axis 1. + /// Length of axis 2. public InplaceArray(T elem0, T elem1, T elem2) { m_Length = 3; @@ -66,10 +66,10 @@ public InplaceArray(T elem0, T elem1, T elem2) /// /// Create a length-3 array. /// - /// - /// - /// - /// + /// Length of axis 0. + /// Length of axis 1. + /// Length of axis 2. + /// Length of axis 3. public InplaceArray(T elem0, T elem1, T elem2, T elem3) { m_Length = 4; @@ -106,7 +106,7 @@ public static InplaceArray FromList(IList elems) /// /// Per-element access. /// - /// + /// The index to get or set. /// public T this[int index] { @@ -192,8 +192,8 @@ public override string ToString() /// /// Check that the arrays have the same length and have all equal values. /// - /// - /// + /// The first 'InplaceArray' to compare. + /// The second 'InplaceArray' to compare. /// Whether the arrays are equivalent. public static bool operator ==(InplaceArray lhs, InplaceArray rhs) { @@ -203,22 +203,22 @@ public override string ToString() /// /// Check that the arrays are not equivalent. /// - /// - /// + /// The first 'InplaceArray' to compare. + /// The second 'InplaceArray' to compare. /// Whether the arrays are not equivalent public static bool operator !=(InplaceArray lhs, InplaceArray rhs) => !lhs.Equals(rhs); /// /// Check that the arrays are equivalent. /// - /// + /// The other 'InplaceArray' to compare. /// Whether the arrays are not equivalent public override bool Equals(object other) => other is InplaceArray other1 && this.Equals(other1); /// /// Check that the arrays are equivalent. /// - /// + /// The other 'InplaceArray' to compare. /// Whether the arrays are not equivalent public bool Equals(InplaceArray other) { diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs index 1a5a15b90d..585be89197 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/AbstractBoard.cs @@ -106,8 +106,8 @@ public virtual BoardSize GetCurrentBoardSize() /// This should be between 0 and BoardSize.NumSpecialTypes (inclusive). /// The actual order of the values doesn't matter. /// - /// - /// + /// The row index. + /// The collunm index. /// The special type of the piece at the give row and column. public abstract int GetSpecialType(int row, int col); @@ -193,7 +193,7 @@ public IEnumerable ValidMoves() /// 3 or more cells of the same type in a row. This assumes that all pieces are allowed /// to be moved; to add extra logic, incorporate it into your method. /// - /// + /// The `Move`. /// True if swapping the cells would result in 3 or more cells of the same type in a row. public bool SimpleIsMoveValid(Move move) { diff --git a/com.unity.ml-agents/Runtime/SensorHelper.cs b/com.unity.ml-agents/Runtime/SensorHelper.cs index 97a21521e7..b219988756 100644 --- a/com.unity.ml-agents/Runtime/SensorHelper.cs +++ b/com.unity.ml-agents/Runtime/SensorHelper.cs @@ -14,9 +14,9 @@ public static class SensorHelper /// This should not generally be used in production code. It is only intended for /// simplifying unit tests. /// - /// - /// - /// + /// The `ISensor` to compare observation from. + /// The expected observations. + /// The error message to throw if sensor observation doesn't match. /// True if the observations for the provided sensor equal the expected values, False if not. public static bool CompareObservation(ISensor sensor, float[] expected, out string errorMessage) { From d8e30fa0baf284e7a8430ee30e51990725736325 Mon Sep 17 00:00:00 2001 From: alexandre-ribard Date: Tue, 3 Sep 2024 17:06:11 -0400 Subject: [PATCH 06/43] more docs --- com.unity.ml-agents/Runtime/InplaceArray.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.ml-agents/Runtime/InplaceArray.cs b/com.unity.ml-agents/Runtime/InplaceArray.cs index 47d733cbe1..387fd3bb35 100644 --- a/com.unity.ml-agents/Runtime/InplaceArray.cs +++ b/com.unity.ml-agents/Runtime/InplaceArray.cs @@ -83,7 +83,7 @@ public InplaceArray(T elem0, T elem1, T elem2, T elem3) /// Construct an InplaceArray from an IList (e.g. Array or List). /// The source must be non-empty and have at most 4 elements. /// - /// + /// The `IList` to construct the array from. /// Corresponding `InplaceArray` from the input IList. /// public static InplaceArray FromList(IList elems) From 3ce9849f528f1da5e568ce6b3d11cbb4e0932b79 Mon Sep 17 00:00:00 2001 From: alexandre-ribard Date: Wed, 4 Sep 2024 09:23:04 -0400 Subject: [PATCH 07/43] updating the release --- com.unity.ml-agents/CHANGELOG.md | 2 +- com.unity.ml-agents/Runtime/SensorHelper.cs | 2 +- com.unity.ml-agents/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index 1a0c5fece9..9bc677baeb 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [4.0.0] - 2024-09-02 +## [3.0.0] - 2024-09-02 ### Major Changes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) diff --git a/com.unity.ml-agents/Runtime/SensorHelper.cs b/com.unity.ml-agents/Runtime/SensorHelper.cs index b219988756..eae927c526 100644 --- a/com.unity.ml-agents/Runtime/SensorHelper.cs +++ b/com.unity.ml-agents/Runtime/SensorHelper.cs @@ -76,7 +76,7 @@ public static bool CompareObservation(ISensor sensor, float[] expected, out stri /// This should not generally be used in production code. It is only intended for /// simplifying unit tests. /// - /// + /// `ISensor` to generate observation from. /// /// /// True if the generated observation for the provided sensor equal the expected values, False if not. diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index b42ea2f949..f658dffdc4 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -1,7 +1,7 @@ { "name": "com.unity.ml-agents", "displayName": "ML Agents", - "version": "4.0.0", + "version": "3.0.0", "unity": "2023.2", "description": "Use state-of-the-art machine learning to create intelligent character behaviors in any Unity environment (games, robotics, film, etc.).", "dependencies": { From eb3b742a37549d573eea59d48dfcb96a43a6e4fc Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Tue, 10 Sep 2024 11:18:56 +0300 Subject: [PATCH 08/43] test xmldoc fixes --- com.unity.ml-agents/Runtime/Academy.cs | 4 ++-- com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs | 2 +- com.unity.ml-agents/Runtime/Agent.cs | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/com.unity.ml-agents/Runtime/Academy.cs b/com.unity.ml-agents/Runtime/Academy.cs index 1c220b7e6b..dc602bd42e 100644 --- a/com.unity.ml-agents/Runtime/Academy.cs +++ b/com.unity.ml-agents/Runtime/Academy.cs @@ -136,7 +136,7 @@ public static bool IsInitialized /// /// Reports whether or not the communicator is on. /// - /// + /// /// /// True, if communicator is on, false otherwise. /// @@ -400,7 +400,7 @@ static int ReadPortFromArgs() /// then the values of the parameters generated from the training process can be /// retrieved here. /// - /// The `EnvironmentParameters` instance. + /// The `EnvironmentParameters` instance. public EnvironmentParameters EnvironmentParameters { get { return m_EnvironmentParameters; } diff --git a/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs b/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs index f1e3036eeb..af34bef3a3 100644 --- a/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs +++ b/com.unity.ml-agents/Runtime/Actuators/ActuatorComponent.cs @@ -19,7 +19,7 @@ public abstract class ActuatorComponent : MonoBehaviour /// The specification of the possible actions for this ActuatorComponent. /// This must produce the same results as the corresponding IActuator's ActionSpec. /// - /// + /// public abstract ActionSpec ActionSpec { get; } } } diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index 7f6dfd9661..f23911c042 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -239,9 +239,11 @@ internal struct AgentParameters /// reset and start a new training episode rather than continue to fail. /// /// + /// /// To use a step limit when training while allowing agents to run without resetting /// outside of training, you can set the max step to 0 in /// if the is not connected to an external process. + /// /// /// using Unity.MLAgents; /// From f82f8cd81ca764badf959b618fcdffb1c3982c72 Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Tue, 10 Sep 2024 13:14:49 +0300 Subject: [PATCH 09/43] more xml doc fixes --- .../Runtime/Actuators/IActionReceiver.cs | 4 ++-- .../Runtime/Actuators/IActuator.cs | 4 ++-- com.unity.ml-agents/Runtime/Agent.cs | 2 +- .../Communicator/UnityRLCapabilities.cs | 2 +- .../Demonstrations/DemonstrationWriter.cs | 2 +- com.unity.ml-agents/Runtime/InplaceArray.cs | 8 +++---- .../Integrations/Match3/Match3Actuator.cs | 4 ++-- .../Integrations/Match3/Match3Sensor.cs | 4 ++-- .../Runtime/Integrations/Match3/Move.cs | 20 ++++++++-------- com.unity.ml-agents/Runtime/SensorHelper.cs | 4 ++-- .../Runtime/Sensors/ISensor.cs | 2 +- .../Runtime/Sensors/ObservationSpec.cs | 24 +++++++++---------- .../Runtime/Sensors/RayPerceptionSensor.cs | 14 +++++------ .../Runtime/Sensors/VectorSensor.cs | 2 +- .../Runtime/SideChannels/IncomingMessage.cs | 2 +- .../Runtime/SideChannels/OutgoingMessage.cs | 14 +++++------ .../Runtime/SideChannels/SideChannel.cs | 2 +- 17 files changed, 57 insertions(+), 57 deletions(-) diff --git a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs index 1dfc5de875..0d8f837440 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs @@ -43,7 +43,7 @@ public static ActionBuffers FromDiscreteActions(float[] discreteActions) /// /// Construct an instance with the continuous and discrete actions that will /// be used. - /// /// + /// /// The continuous actions to send to an . /// The discrete actions to send to an . public ActionBuffers(float[] continuousActions, int[] discreteActions) @@ -63,7 +63,7 @@ public ActionBuffers(ActionSegment continuousActions, ActionSegment /// /// Construct an instance with . All values are initialized to zeros. - /// /// + /// /// The to send to an . public ActionBuffers(ActionSpec actionSpec) : this(new ActionSegment(new float[actionSpec.NumContinuousActions]), diff --git a/com.unity.ml-agents/Runtime/Actuators/IActuator.cs b/com.unity.ml-agents/Runtime/Actuators/IActuator.cs index 6a638bfd71..7637d57a9f 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IActuator.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IActuator.cs @@ -14,7 +14,7 @@ public interface IActuator : IActionReceiver, IHeuristicProvider /// /// Gets the name of this IActuator which will be used to sort it. /// - /// The string name of this `IActuator` + /// The string name of this `IActuator` string Name { get; } /// @@ -32,7 +32,7 @@ public static class IActuatorExtensions /// /// Returns the number of discrete branches + the number of continuous actions. /// - /// + /// Actuator /// The number possible actions. public static int TotalNumberOfActions(this IActuator actuator) { diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index f23911c042..45505697e4 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -687,7 +687,7 @@ internal void ReloadPolicy() /// /// Returns the current step counter (within the current episode). /// - /// The current step count. + /// The current step count. public int StepCount { get { return m_StepCount; } diff --git a/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs b/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs index 2bbb2da168..a82b0b1da7 100644 --- a/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs +++ b/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs @@ -36,7 +36,7 @@ public UnityRLCapabilities( /// /// Will print a warning to the console if Python does not support base capabilities and will - /// return true if the warning was printed. + /// return true if the warning was printed. /// /// True if the warning was printed, False if not. public bool WarnOnPythonMissingBaseRLCapabilities() diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs index f99a0202c2..d7db680eaa 100644 --- a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs @@ -26,7 +26,7 @@ public class DemonstrationWriter /// Create a DemonstrationWriter that will write to the specified stream. /// The stream must support writes and seeking. /// - /// + /// Target stream public DemonstrationWriter(Stream stream) { m_Writer = stream; diff --git a/com.unity.ml-agents/Runtime/InplaceArray.cs b/com.unity.ml-agents/Runtime/InplaceArray.cs index 387fd3bb35..b5472cf010 100644 --- a/com.unity.ml-agents/Runtime/InplaceArray.cs +++ b/com.unity.ml-agents/Runtime/InplaceArray.cs @@ -10,7 +10,7 @@ namespace Unity.MLAgents /// /// This does not implement any interfaces such as IList, in order to avoid any accidental boxing allocations. /// - /// + /// T public struct InplaceArray : IEquatable> where T : struct { private const int k_MaxLength = 4; @@ -85,7 +85,7 @@ public InplaceArray(T elem0, T elem1, T elem2, T elem3) /// /// The `IList` to construct the array from. /// Corresponding `InplaceArray` from the input IList. - /// + /// Argument out of range public static InplaceArray FromList(IList elems) { switch (elems.Count) @@ -107,7 +107,7 @@ public static InplaceArray FromList(IList elems) /// Per-element access. /// /// The index to get or set. - /// + /// Index out of range public T this[int index] { get @@ -171,7 +171,7 @@ public int Length /// Returns a string representation of the array's elements. /// /// The string summary of the `InplaceArray`. - /// + /// Index out of range public override string ToString() { switch (m_Length) diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs index 62a2b7df37..3c919079bd 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Actuator.cs @@ -19,11 +19,11 @@ public class Match3Actuator : IActuator, IBuiltInActuator /// /// Create a Match3Actuator. /// - /// + /// Board /// Whether the inference action should be ignored and the Agent's Heuristic /// should be called. This should only be used for generating comparison stats of the Heuristic. /// The seed used to initialize . - /// + /// Name public Match3Actuator(AbstractBoard board, bool forceHeuristic, int seed, diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs index 282aec5308..6252a641e4 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs @@ -8,8 +8,8 @@ namespace Unity.MLAgents.Integrations.Match3 /// /// Delegate that provides integer values at a given (x,y) coordinate. /// - /// - /// + /// X + /// Y public delegate int GridValueProvider(int x, int y); /// diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs index 96fc75b857..a3b72ad11b 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs @@ -65,9 +65,9 @@ public struct Move /// the Move corresponding to an Agent decision. /// /// Must be between 0 and NumPotentialMoves(maxRows, maxCols). - /// + /// Max board size /// Corresponding `Move`. - /// + /// Argument out of range public static Move FromMoveIndex(int moveIndex, BoardSize maxBoardSize) { var maxRows = maxBoardSize.Rows; @@ -104,7 +104,7 @@ public static Move FromMoveIndex(int moveIndex, BoardSize maxBoardSize) /// /// Increment the Move to the next MoveIndex, and update the Row, Column, and Direction accordingly. /// - /// + /// Max board size public void Next(BoardSize maxBoardSize) { var maxRows = maxBoardSize.Rows; @@ -143,10 +143,10 @@ public void Next(BoardSize maxBoardSize) /// /// Construct a Move from the row, column, direction, and board size. /// - /// - /// - /// - /// + /// Row + /// Col + /// Dir + /// Max board size /// Corresponding `Move`. public static Move FromPositionAndDirection(int row, int col, Direction dir, BoardSize maxBoardSize) { @@ -208,7 +208,7 @@ public static Move FromPositionAndDirection(int row, int col, Direction dir, Boa /// Check if the move is valid for the given board size. /// This will be passed the return value from AbstractBoard.GetCurrentBoardSize(). /// - /// + /// Board size /// True if move is valide given input `boardSize`, False if not. public bool InRangeForBoard(BoardSize boardSize) { @@ -223,7 +223,7 @@ public bool InRangeForBoard(BoardSize boardSize) /// Get the other row and column that correspond to this move. /// /// Corresponding other (row, column) tuple for this move. - /// + /// Argument out of range public (int Row, int Column) OtherCell() { switch (Direction) @@ -267,7 +267,7 @@ public Direction OtherDirection() /// Return the number of potential moves for a board of the given size. /// This is equivalent to the number of internal edges in the board. /// - /// + /// Max board size /// Number of potential moves given a boardsize. public static int NumPotentialMoves(BoardSize maxBoardSize) { diff --git a/com.unity.ml-agents/Runtime/SensorHelper.cs b/com.unity.ml-agents/Runtime/SensorHelper.cs index eae927c526..3c3a713051 100644 --- a/com.unity.ml-agents/Runtime/SensorHelper.cs +++ b/com.unity.ml-agents/Runtime/SensorHelper.cs @@ -77,8 +77,8 @@ public static bool CompareObservation(ISensor sensor, float[] expected, out stri /// simplifying unit tests. /// /// `ISensor` to generate observation from. - /// - /// + /// The expected observations. + /// The error message to throw if sensor observation doesn't match. /// True if the generated observation for the provided sensor equal the expected values, False if not. public static bool CompareObservation(ISensor sensor, float[,,] expected, out string errorMessage) { diff --git a/com.unity.ml-agents/Runtime/Sensors/ISensor.cs b/com.unity.ml-agents/Runtime/Sensors/ISensor.cs index f9f4f99ce0..46786cf642 100644 --- a/com.unity.ml-agents/Runtime/Sensors/ISensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/ISensor.cs @@ -113,7 +113,7 @@ public static class SensorExtensions /// Get the total number of elements in the ISensor's observation (i.e. the product of the /// shape elements). /// - /// + /// Sensor /// The total number of elements in the `ISensor`'s observation. public static int ObservationSize(this ISensor sensor) { diff --git a/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs b/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs index af2fbc66b2..0e8de15df1 100644 --- a/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs +++ b/com.unity.ml-agents/Runtime/Sensors/ObservationSpec.cs @@ -56,8 +56,8 @@ public int Rank /// /// Construct an ObservationSpec for 1-D observations of the requested length. /// - /// - /// + /// Length + /// Observation type /// `ObservationSpec` for 1-D observations of the requested length. public static ObservationSpec Vector(int length, ObservationType obsType = ObservationType.Default) { @@ -71,8 +71,8 @@ public static ObservationSpec Vector(int length, ObservationType obsType = Obser /// /// Construct an ObservationSpec for variable-length observations. /// - /// - /// + /// Observation size + /// Max number of observations /// `ObservationSpec` for variable-length observations. public static ObservationSpec VariableLength(int obsSize, int maxNumObs) { @@ -90,10 +90,10 @@ public static ObservationSpec VariableLength(int obsSize, int maxNumObs) /// Construct an ObservationSpec for visual-like observations, e.g. observations /// with a height, width, and possible multiple channels. /// - /// - /// - /// - /// + /// Height + /// Width + /// Channels + /// Observation type /// `ObservationSpec` for visual-like observations public static ObservationSpec Visual(int channels, int height, int width, ObservationType obsType = ObservationType.Default) { @@ -116,10 +116,10 @@ public static ObservationSpec Visual(int channels, int height, int width, Observ /// Note that not all combinations of DimensionProperty may be supported by the trainer. /// shape and dimensionProperties must have the same size. /// - /// - /// - /// - /// + /// Shape + /// Dimension properties + /// Observation type + /// Unity agents exception public ObservationSpec( InplaceArray shape, InplaceArray dimensionProperties, diff --git a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs index 5ecf3ca49b..332b40ad56 100644 --- a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensor.cs @@ -91,7 +91,7 @@ public int OutputSize() /// /// Get the cast start and end points for the given ray index/ /// - /// + /// Ray index /// A tuple of the start and end positions in world space. public (Vector3 StartPositionWorld, Vector3 EndPositionWorld) RayExtents(int rayIndex) { @@ -219,8 +219,8 @@ public float ScaledRayLength /// 3. The 'numDetectableTags+1' element of the sublist will contain the normalized distance to the object /// hit, or 1.0 if nothing was hit. /// - /// - /// + /// Number of detectable tags + /// Ray index /// Output buffer. The size must be equal to (numDetectableTags+2) * RayOutputs.Length public void ToFloatArray(int numDetectableTags, int rayIndex, float[] buffer) { @@ -425,8 +425,8 @@ public static RayPerceptionOutput Perceive(RayPerceptionInput input, bool batche /// /// Evaluate the raycast results of all the rays from the RayPerceptionInput as a batch. /// - /// - /// + /// Input + /// Ray index internal static void PerceiveBatchedRays(ref RayPerceptionOutput.RayOutput[] batchedRaycastOutputs, RayPerceptionInput input) { var numRays = input.Angles.Count; @@ -551,8 +551,8 @@ internal static void PerceiveBatchedRays(ref RayPerceptionOutput.RayOutput[] bat /// /// Evaluate the raycast results of a single ray from the RayPerceptionInput. /// - /// - /// + /// Input + /// Ray index /// `RayOutput` result of a single raycast. internal static RayPerceptionOutput.RayOutput PerceiveSingleRay( RayPerceptionInput input, diff --git a/com.unity.ml-agents/Runtime/Sensors/VectorSensor.cs b/com.unity.ml-agents/Runtime/Sensors/VectorSensor.cs index d4bd0507c4..3f6a79f4ba 100644 --- a/com.unity.ml-agents/Runtime/Sensors/VectorSensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/VectorSensor.cs @@ -20,7 +20,7 @@ public class VectorSensor : ISensor, IBuiltInSensor /// /// Number of vector observations. /// Name of the sensor. - /// + /// Observation type public VectorSensor(int observationSize, string name = null, ObservationType observationType = ObservationType.Default) { if (string.IsNullOrEmpty(name)) diff --git a/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs b/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs index a159591862..f6991f76d9 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/IncomingMessage.cs @@ -18,7 +18,7 @@ public class IncomingMessage : IDisposable /// /// Construct an IncomingMessage from the byte array. /// - /// + /// Byte array public IncomingMessage(byte[] data) { m_Data = data; diff --git a/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs b/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs index 673b4f20b9..7f00b90e74 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/OutgoingMessage.cs @@ -34,16 +34,16 @@ public void Dispose() /// /// Write a boolean value to the message. /// - /// + /// Boolean value public void WriteBoolean(bool b) { m_Writer.Write(b); } /// - /// Write an interger value to the message. + /// Write an integer value to the message. /// - /// + /// Integer value public void WriteInt32(int i) { m_Writer.Write(i); @@ -52,7 +52,7 @@ public void WriteInt32(int i) /// /// Write a float values to the message. /// - /// + /// Float value public void WriteFloat32(float f) { m_Writer.Write(f); @@ -61,7 +61,7 @@ public void WriteFloat32(float f) /// /// Write a string value to the message. /// - /// + /// String value public void WriteString(string s) { var stringEncoded = Encoding.ASCII.GetBytes(s); @@ -72,7 +72,7 @@ public void WriteString(string s) /// /// Write a list or array of floats to the message. /// - /// + /// Float list public void WriteFloatList(IList floatList) { WriteInt32(floatList.Count); @@ -85,7 +85,7 @@ public void WriteFloatList(IList floatList) /// /// Overwrite the message with a specific byte array. /// - /// + /// Data public void SetRawBytes(byte[] data) { // Reset first. Set the length to zero so that if there's more data than we're going to diff --git a/com.unity.ml-agents/Runtime/SideChannels/SideChannel.cs b/com.unity.ml-agents/Runtime/SideChannels/SideChannel.cs index 250e638b0f..fc94c72c31 100644 --- a/com.unity.ml-agents/Runtime/SideChannels/SideChannel.cs +++ b/com.unity.ml-agents/Runtime/SideChannels/SideChannel.cs @@ -26,7 +26,7 @@ public abstract class SideChannel /// An int identifier for the SideChannel. Ensures that there is only ever one side channel /// of each type. Ensure the Unity side channels will be linked to their Python equivalent. /// - /// The integer identifier of the SideChannel. + /// The integer identifier of the SideChannel. public Guid ChannelId { get; From d67dc941922c382046efe404446f477d41794f62 Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Tue, 10 Sep 2024 13:53:18 +0300 Subject: [PATCH 10/43] Uncompress the 3DBall sample --- .../Samples/3DBall/3DBall.unitypackage | Bin 173671 -> 0 bytes ...DBall.unitypackage.meta => ML-Agents.meta} | 3 +- .../Samples/3DBall/ML-Agents/Examples.meta | 8 + .../3DBall/ML-Agents/Examples/3DBall.meta | 8 + .../ML-Agents/Examples/3DBall/Prefabs.meta | 8 + .../Examples/3DBall/Prefabs/3DBall.prefab | 770 +++++++++++ .../3DBall/Prefabs/3DBall.prefab.meta | 8 + .../ML-Agents/Examples/3DBall/Scenes.meta | 8 + .../Examples/3DBall/Scenes/3DBall.unity | 1135 +++++++++++++++++ .../Examples/3DBall/Scenes/3DBall.unity.meta | 9 + .../ML-Agents/Examples/3DBall/Scripts.meta | 8 + .../Examples/3DBall/Scripts/Ball3DAgent.cs | 95 ++ .../3DBall/Scripts/Ball3DAgent.cs.meta | 12 + .../3DBall/Scripts/Ball3DHardAgent.cs | 91 ++ .../3DBall/Scripts/Ball3DHardAgent.cs.meta | 12 + .../ML-Agents/Examples/3DBall/TFModels.meta | 8 + .../Examples/3DBall/TFModels/3DBall.onnx | Bin 0 -> 74869 bytes .../Examples/3DBall/TFModels/3DBall.onnx.meta | 11 + .../ML-Agents/Examples/SharedAssets.meta | 8 + .../Examples/SharedAssets/Materials.meta | 8 + .../SharedAssets/Materials/AgentBlue.mat | 80 ++ .../SharedAssets/Materials/AgentBlue.mat.meta | 8 + .../SharedAssets/Materials/Checkers_Ball.mat | 80 ++ .../Materials/Checkers_Ball.mat.meta | 8 + .../Examples/SharedAssets/Materials/Eye.mat | 77 ++ .../SharedAssets/Materials/Eye.mat.meta | 8 + .../SharedAssets/Materials/Headband.mat | 76 ++ .../SharedAssets/Materials/Headband.mat.meta | 8 + .../SharedAssets/Materials/Textures.meta | 8 + .../Materials/Textures/CheckersGray_BC.png | Bin 0 -> 160263 bytes .../Textures/CheckersGray_BC.png.meta | 76 ++ .../Materials/Textures/U_Logo_White_RGB.png | Bin 0 -> 19716 bytes .../Textures/U_Logo_White_RGB.png.meta | 108 ++ .../Examples/SharedAssets/Prefabs.meta | 8 + .../Prefabs/Canvas_Watermark.prefab | 177 +++ .../Prefabs/Canvas_Watermark.prefab.meta | 8 + .../Prefabs/Directional_Light.prefab | 96 ++ .../Prefabs/Directional_Light.prefab.meta | 8 + .../Examples/SharedAssets/Scripts.meta | 8 + .../Scripts/AdjustTrainingTimescale.cs | 54 + .../Scripts/AdjustTrainingTimescale.cs.meta | 11 + .../Examples/SharedAssets/Scripts/Area.cs | 11 + .../SharedAssets/Scripts/Area.cs.meta | 12 + .../SharedAssets/Scripts/CameraFollow.cs | 31 + .../SharedAssets/Scripts/CameraFollow.cs.meta | 12 + .../Scripts/CollisionCallbacks.cs | 141 ++ .../Scripts/CollisionCallbacks.cs.meta | 11 + .../Scripts/DirectionIndicator.cs | 37 + .../Scripts/DirectionIndicator.cs.meta | 11 + .../SharedAssets/Scripts/FlyCamera.cs | 116 ++ .../SharedAssets/Scripts/FlyCamera.cs.meta | 12 + .../SharedAssets/Scripts/GroundContact.cs | 53 + .../Scripts/GroundContact.cs.meta | 11 + .../Scripts/JointDriveController.cs | 188 +++ .../Scripts/JointDriveController.cs.meta | 11 + .../SharedAssets/Scripts/ModelOverrider.cs | 426 +++++++ .../Scripts/ModelOverrider.cs.meta | 3 + .../Examples/SharedAssets/Scripts/Monitor.cs | 563 ++++++++ .../SharedAssets/Scripts/Monitor.cs.meta | 11 + .../Scripts/OrientationCubeController.cs | 24 + .../Scripts/OrientationCubeController.cs.meta | 11 + .../Scripts/ProjectSettingsOverrides.cs | 69 + .../Scripts/ProjectSettingsOverrides.cs.meta | 11 + .../SharedAssets/Scripts/SensorBase.cs | 59 + .../SharedAssets/Scripts/SensorBase.cs.meta | 11 + .../SharedAssets/Scripts/TargetContact.cs | 38 + .../Scripts/TargetContact.cs.meta | 11 + .../SharedAssets/Scripts/TargetController.cs | 133 ++ .../Scripts/TargetController.cs.meta | 11 + 69 files changed, 5154 insertions(+), 1 deletion(-) delete mode 100644 com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage rename com.unity.ml-agents/Samples/3DBall/{3DBall.unitypackage.meta => ML-Agents.meta} (67%) create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs create mode 100755 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs create mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta diff --git a/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage b/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage deleted file mode 100644 index 339b85f7291dbcecbb1c155d10e19c9c9f5c1891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173671 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 + /// Utility class to allow target placement and collision detection with an agent + /// Add this script to the target you want the agent to touch. + /// Callbacks will be triggered any time the target is touched with a collider tagged as 'tagToDetect' + /// + public class CollisionCallbacks : MonoBehaviour + { + // [System.Serializable] public class BoolEvent : UnityEvent { } + // [SerializeField] BoolEvent boolEvent = new BoolEvent(); + // public void OnBoolEvent(bool value) + // { + // Debug.Log($"OnBoolEvent {value}"); + // } + + + [Header("Collider Tag To Detect")] + public string tagToDetect = "agent"; //collider tag to detect + + // [Header("Target Placement")] + // public float spawnRadius; //The radius in which a target can be randomly spawned. + // public bool respawnIfTouched; //Should the target respawn to a different position when touched + // + // [Header("Target Fell Protection")] + // public bool respawnIfFallsOffPlatform = true; //If the target falls off the platform, reset the position. + // public float fallDistance = 5; //distance below the starting height that will trigger a respawn + // + // + // private Vector3 m_startingPos; //the starting position of the target + // private Agent m_agentTouching; //the agent currently touching the target + + [System.Serializable] + // public class TriggerEvent : UnityEvent + public class TriggerEvent : UnityEvent + { + } + + [Header("Trigger Callbacks")] + public TriggerEvent onTriggerEnterEvent = new TriggerEvent(); + public TriggerEvent onTriggerStayEvent = new TriggerEvent(); + public TriggerEvent onTriggerExitEvent = new TriggerEvent(); + + [System.Serializable] + public class CollisionEvent : UnityEvent + { + } + + [Header("Collision Callbacks")] + public CollisionEvent onCollisionEnterEvent = new CollisionEvent(); + public CollisionEvent onCollisionStayEvent = new CollisionEvent(); + public CollisionEvent onCollisionExitEvent = new CollisionEvent(); + + // // Start is called before the first frame update + // void OnEnable() + // { + // m_startingPos = transform.position; + // if (respawnIfTouched) + // { + // MoveTargetToRandomPosition(); + // } + // } + + // void Update() + // { + // if (respawnIfFallsOffPlatform) + // { + // if (transform.position.y < m_startingPos.y - fallDistance) + // { + // Debug.Log($"{transform.name} Fell Off Platform"); + // MoveTargetToRandomPosition(); + // } + // } + // } + + // /// + // /// Moves target to a random position within specified radius. + // /// + // public void MoveTargetToRandomPosition() + // { + // var newTargetPos = m_startingPos + (Random.insideUnitSphere * spawnRadius); + // newTargetPos.y = m_startingPos.y; + // transform.position = newTargetPos; + // } + + private void OnCollisionEnter(Collision col) + { + if (col.transform.CompareTag(tagToDetect)) + { + onCollisionEnterEvent.Invoke(col, transform); + // if (respawnIfTouched) + // { + // MoveTargetToRandomPosition(); + // } + } + } + + private void OnCollisionStay(Collision col) + { + if (col.transform.CompareTag(tagToDetect)) + { + onCollisionStayEvent.Invoke(col, transform); + } + } + + private void OnCollisionExit(Collision col) + { + if (col.transform.CompareTag(tagToDetect)) + { + onCollisionExitEvent.Invoke(col, transform); + } + } + + private void OnTriggerEnter(Collider col) + { + if (col.CompareTag(tagToDetect)) + { + onTriggerEnterEvent.Invoke(col); + } + } + + private void OnTriggerStay(Collider col) + { + if (col.CompareTag(tagToDetect)) + { + onTriggerStayEvent.Invoke(col); + } + } + + private void OnTriggerExit(Collider col) + { + if (col.CompareTag(tagToDetect)) + { + onTriggerExitEvent.Invoke(col); + } + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta new file mode 100644 index 0000000000..c9219d2c74 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df05ec10e50114a9d92106879d04d89d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs new file mode 100644 index 0000000000..fe6a07f0c7 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +namespace Unity.MLAgentsExamples +{ + public class DirectionIndicator : MonoBehaviour + { + + public bool updatedByAgent; //should this be updated by the agent? If not, it will use local settings + public Transform transformToFollow; //ex: hips or body + public Transform targetToLookAt; //target in the scene the indicator will point to + public float heightOffset; + private float m_StartingYPos; + + void OnEnable() + { + m_StartingYPos = transform.position.y; + } + + void Update() + { + if (updatedByAgent) + return; + transform.position = new Vector3(transformToFollow.position.x, m_StartingYPos + heightOffset, + transformToFollow.position.z); + Vector3 walkDir = targetToLookAt.position - transform.position; + walkDir.y = 0; //flatten dir on the y + transform.rotation = Quaternion.LookRotation(walkDir); + } + + //Public method to allow an agent to directly update this component + public void MatchOrientation(Transform t) + { + transform.position = new Vector3(t.position.x, m_StartingYPos + heightOffset, t.position.z); + transform.rotation = t.rotation; + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta new file mode 100644 index 0000000000..7d3b7674ca --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1513f8a85fedd47efba089213b7c5bde +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs new file mode 100644 index 0000000000..8fe3fd0cdd --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs @@ -0,0 +1,116 @@ +using UnityEngine; + +namespace Unity.MLAgentsExamples +{ + public class FlyCamera : MonoBehaviour + { + /* + wasd : basic movement + shift : Makes camera accelerate + space : Moves camera on X and Z axis only. So camera doesn't gain any height*/ + + + public float mainSpeed = 100.0f; // regular speed + public float shiftAdd = 250.0f; // multiplied by how long shift is held. Basically running + public float maxShift = 1000.0f; // Maximum speed when holdin gshift + public float camSens = 0.25f; // How sensitive it with mouse + public bool rotateOnlyIfMousedown = true; + public bool movementStaysFlat = true; + + Vector3 + m_LastMouse = + new Vector3(255, 255, + 255); // kind of in the middle of the screen, rather than at the top (play) + + float m_TotalRun = 1.0f; + + void Awake() + { + Debug.Log("FlyCamera Awake() - RESETTING CAMERA POSITION"); // nop? + // nop: + // transform.position.Set(0,8,-32); + // transform.rotation.Set(15,0,0,1); + transform.position = new Vector3(0, 8, -32); + transform.rotation = Quaternion.Euler(25, 0, 0); + } + + void Update() + { + if (Input.GetMouseButtonDown(1)) + { + m_LastMouse = Input.mousePosition; // $CTK reset when we begin + } + + if (!rotateOnlyIfMousedown || + (rotateOnlyIfMousedown && Input.GetMouseButton(1))) + { + m_LastMouse = Input.mousePosition - m_LastMouse; + m_LastMouse = new Vector3(-m_LastMouse.y * camSens, m_LastMouse.x * camSens, 0); + m_LastMouse = new Vector3(transform.eulerAngles.x + m_LastMouse.x, + transform.eulerAngles.y + m_LastMouse.y, 0); + transform.eulerAngles = m_LastMouse; + m_LastMouse = Input.mousePosition; + // Mouse camera angle done. + } + + // Keyboard commands + var p = GetBaseInput(); + if (Input.GetKey(KeyCode.LeftShift)) + { + m_TotalRun += Time.deltaTime; + p = shiftAdd * m_TotalRun * p; + p.x = Mathf.Clamp(p.x, -maxShift, maxShift); + p.y = Mathf.Clamp(p.y, -maxShift, maxShift); + p.z = Mathf.Clamp(p.z, -maxShift, maxShift); + } + else + { + m_TotalRun = Mathf.Clamp(m_TotalRun * 0.5f, 1f, 1000f); + p = p * mainSpeed; + } + + p = p * Time.deltaTime; + var newPosition = transform.position; + if (Input.GetKey(KeyCode.Space) + || (movementStaysFlat && !(rotateOnlyIfMousedown && Input.GetMouseButton(1)))) + { + // If player wants to move on X and Z axis only + transform.Translate(p); + newPosition.x = transform.position.x; + newPosition.z = transform.position.z; + transform.position = newPosition; + } + else + { + transform.Translate(p); + } + } + + Vector3 GetBaseInput() + { + // returns the basic values, if it's 0 than it's not active. + var pVelocity = new Vector3(); + if (Input.GetKey(KeyCode.W)) + { + pVelocity += new Vector3(0, 0, 1); + } + + if (Input.GetKey(KeyCode.S)) + { + pVelocity += new Vector3(0, 0, -1); + } + + if (Input.GetKey(KeyCode.A)) + { + pVelocity += new Vector3(-1, 0, 0); + } + + if (Input.GetKey(KeyCode.D)) + { + pVelocity += new Vector3(1, 0, 0); + } + + return pVelocity; + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta new file mode 100644 index 0000000000..31dd480473 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 83d7b886385fb48b999bc3fbc41bc181 +timeCreated: 1508627099 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs new file mode 100644 index 0000000000..785d357981 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs @@ -0,0 +1,53 @@ +using UnityEngine; +using Unity.MLAgents; + +namespace Unity.MLAgentsExamples +{ + /// + /// This class contains logic for locomotion agents with joints which might make contact with the ground. + /// By attaching this as a component to those joints, their contact with the ground can be used as either + /// an observation for that agent, and/or a means of punishing the agent for making undesirable contact. + /// + [DisallowMultipleComponent] + public class GroundContact : MonoBehaviour + { + [HideInInspector] public Agent agent; + + [Header("Ground Check")] public bool agentDoneOnGroundContact; // Whether to reset agent on ground contact. + public bool penalizeGroundContact; // Whether to penalize on contact. + public float groundContactPenalty; // Penalty amount (ex: -1). + public bool touchingGround; + const string k_Ground = "ground"; // Tag of ground object. + + /// + /// Check for collision with ground, and optionally penalize agent. + /// + void OnCollisionEnter(Collision col) + { + if (col.transform.CompareTag(k_Ground)) + { + touchingGround = true; + if (penalizeGroundContact) + { + agent.SetReward(groundContactPenalty); + } + + if (agentDoneOnGroundContact) + { + agent.EndEpisode(); + } + } + } + + /// + /// Check for end of ground collision and reset flag appropriately. + /// + void OnCollisionExit(Collision other) + { + if (other.transform.CompareTag(k_Ground)) + { + touchingGround = false; + } + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta new file mode 100644 index 0000000000..d0857933f2 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2666e257ea992476cae0f7f163165e71 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs new file mode 100644 index 0000000000..3a443978b5 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs @@ -0,0 +1,188 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Serialization; +using Unity.MLAgents; + +namespace Unity.MLAgentsExamples +{ + /// + /// Used to store relevant information for acting and learning for each body part in agent. + /// + [System.Serializable] + public class BodyPart + { + [Header("Body Part Info")][Space(10)] public ConfigurableJoint joint; + public Rigidbody rb; + [HideInInspector] public Vector3 startingPos; + [HideInInspector] public Quaternion startingRot; + + [Header("Ground & Target Contact")] + [Space(10)] + public GroundContact groundContact; + + public TargetContact targetContact; + + [FormerlySerializedAs("thisJDController")] + [HideInInspector] public JointDriveController thisJdController; + + [Header("Current Joint Settings")] + [Space(10)] + public Vector3 currentEularJointRotation; + + [HideInInspector] public float currentStrength; + public float currentXNormalizedRot; + public float currentYNormalizedRot; + public float currentZNormalizedRot; + + [Header("Other Debug Info")] + [Space(10)] + public Vector3 currentJointForce; + + public float currentJointForceSqrMag; + public Vector3 currentJointTorque; + public float currentJointTorqueSqrMag; + public AnimationCurve jointForceCurve = new AnimationCurve(); + public AnimationCurve jointTorqueCurve = new AnimationCurve(); + + /// + /// Reset body part to initial configuration. + /// + public void Reset(BodyPart bp) + { + bp.rb.transform.position = bp.startingPos; + bp.rb.transform.rotation = bp.startingRot; + bp.rb.velocity = Vector3.zero; + bp.rb.angularVelocity = Vector3.zero; + if (bp.groundContact) + { + bp.groundContact.touchingGround = false; + } + + if (bp.targetContact) + { + bp.targetContact.touchingTarget = false; + } + } + + /// + /// Apply torque according to defined goal `x, y, z` angle and force `strength`. + /// + public void SetJointTargetRotation(float x, float y, float z) + { + x = (x + 1f) * 0.5f; + y = (y + 1f) * 0.5f; + z = (z + 1f) * 0.5f; + + var xRot = Mathf.Lerp(joint.lowAngularXLimit.limit, joint.highAngularXLimit.limit, x); + var yRot = Mathf.Lerp(-joint.angularYLimit.limit, joint.angularYLimit.limit, y); + var zRot = Mathf.Lerp(-joint.angularZLimit.limit, joint.angularZLimit.limit, z); + + currentXNormalizedRot = + Mathf.InverseLerp(joint.lowAngularXLimit.limit, joint.highAngularXLimit.limit, xRot); + currentYNormalizedRot = Mathf.InverseLerp(-joint.angularYLimit.limit, joint.angularYLimit.limit, yRot); + currentZNormalizedRot = Mathf.InverseLerp(-joint.angularZLimit.limit, joint.angularZLimit.limit, zRot); + + joint.targetRotation = Quaternion.Euler(xRot, yRot, zRot); + currentEularJointRotation = new Vector3(xRot, yRot, zRot); + } + + public void SetJointStrength(float strength) + { + var rawVal = (strength + 1f) * 0.5f * thisJdController.maxJointForceLimit; + var jd = new JointDrive + { + positionSpring = thisJdController.maxJointSpring, + positionDamper = thisJdController.jointDampen, + maximumForce = rawVal + }; + joint.slerpDrive = jd; + currentStrength = jd.maximumForce; + } + } + + public class JointDriveController : MonoBehaviour + { + [Header("Joint Drive Settings")] + [Space(10)] + public float maxJointSpring; + + public float jointDampen; + public float maxJointForceLimit; + + [HideInInspector] public Dictionary bodyPartsDict = new Dictionary(); + + [HideInInspector] public List bodyPartsList = new List(); + const float k_MaxAngularVelocity = 50.0f; + + /// + /// Create BodyPart object and add it to dictionary. + /// + public void SetupBodyPart(Transform t) + { + var bp = new BodyPart + { + rb = t.GetComponent(), + joint = t.GetComponent(), + startingPos = t.position, + startingRot = t.rotation + }; + bp.rb.maxAngularVelocity = k_MaxAngularVelocity; + + // Add & setup the ground contact script + bp.groundContact = t.GetComponent(); + if (!bp.groundContact) + { + bp.groundContact = t.gameObject.AddComponent(); + bp.groundContact.agent = gameObject.GetComponent(); + } + else + { + bp.groundContact.agent = gameObject.GetComponent(); + } + + if (bp.joint) + { + var jd = new JointDrive + { + positionSpring = maxJointSpring, + positionDamper = jointDampen, + maximumForce = maxJointForceLimit + }; + bp.joint.slerpDrive = jd; + } + + bp.thisJdController = this; + bodyPartsDict.Add(t, bp); + bodyPartsList.Add(bp); + } + + public void GetCurrentJointForces() + { + foreach (var bodyPart in bodyPartsDict.Values) + { + if (bodyPart.joint) + { + bodyPart.currentJointForce = bodyPart.joint.currentForce; + bodyPart.currentJointForceSqrMag = bodyPart.joint.currentForce.magnitude; + bodyPart.currentJointTorque = bodyPart.joint.currentTorque; + bodyPart.currentJointTorqueSqrMag = bodyPart.joint.currentTorque.magnitude; + if (Application.isEditor) + { + if (bodyPart.jointForceCurve.length > 1000) + { + bodyPart.jointForceCurve = new AnimationCurve(); + } + + if (bodyPart.jointTorqueCurve.length > 1000) + { + bodyPart.jointTorqueCurve = new AnimationCurve(); + } + + bodyPart.jointForceCurve.AddKey(Time.time, bodyPart.currentJointForceSqrMag); + bodyPart.jointTorqueCurve.AddKey(Time.time, bodyPart.currentJointTorqueSqrMag); + } + } + } + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta new file mode 100644 index 0000000000..03c214aea1 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b29724baddfa457da6eeab446fa49ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs new file mode 100644 index 0000000000..2a69cb4fe6 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs @@ -0,0 +1,426 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Unity.Sentis; +using System.IO; +using Unity.MLAgents; +using Unity.MLAgents.Policies; +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace Unity.MLAgentsExamples +{ + /// + /// Utility class to allow the ModelAsset file for an agent to be overriden during inference. + /// This is used internally to validate the file after training is done. + /// The behavior name to override and file path are specified on the commandline, e.g. + /// player.exe --mlagents-override-model-directory /path/to/models + /// + /// Additionally, a number of episodes to run can be specified; after this, the application will quit. + /// Note this will only work with example scenes that have 1:1 Agent:Behaviors. More complicated scenes like WallJump + /// probably won't override correctly. + /// + public class ModelOverrider : MonoBehaviour + { + HashSet k_SupportedExtensions = new HashSet { "nn", "onnx" }; + const string k_CommandLineModelOverrideDirectoryFlag = "--mlagents-override-model-directory"; + const string k_CommandLineModelOverrideExtensionFlag = "--mlagents-override-model-extension"; + const string k_CommandLineQuitAfterEpisodesFlag = "--mlagents-quit-after-episodes"; + const string k_CommandLineQuitAfterSeconds = "--mlagents-quit-after-seconds"; + const string k_CommandLineQuitOnLoadFailure = "--mlagents-quit-on-load-failure"; + + // The attached Agent + Agent m_Agent; + + // Whether or not the commandline args have already been processed. + // Used to make sure that HasOverrides doesn't spam the logs if it's called multiple times. + private bool m_HaveProcessedCommandLine; + + string m_BehaviorNameOverrideDirectory; + + private string m_OriginalBehaviorName; + + private List m_OverrideExtensions = new List(); + + // Cached loaded ModelAssets, with the behavior name as the key. + Dictionary m_CachedModels = new Dictionary(); + + // Max episodes to run. Only used if > 0 + // Will default to 1 if override models are specified, otherwise 0. + int m_MaxEpisodes; + + // Deadline - exit if the time exceeds this + DateTime m_Deadline = DateTime.MaxValue; + + int m_NumSteps; + int m_PreviousNumSteps; + int m_PreviousAgentCompletedEpisodes; + + bool m_QuitOnLoadFailure; + [Tooltip("Debug values to be used in place of the command line for overriding models.")] + public string debugCommandLineOverride; + + // Static values to keep track of completed episodes and steps across resets + // These are updated in OnDisable. + static int s_PreviousAgentCompletedEpisodes; + static int s_PreviousNumSteps; + + int TotalCompletedEpisodes + { + get { return m_PreviousAgentCompletedEpisodes + (m_Agent == null ? 0 : m_Agent.CompletedEpisodes); } + } + + int TotalNumSteps + { + get { return m_PreviousNumSteps + m_NumSteps; } + } + + public bool HasOverrides + { + get + { + GetAssetPathFromCommandLine(); + return !string.IsNullOrEmpty(m_BehaviorNameOverrideDirectory); + } + } + + /// + /// The original behavior name of the agent. The actual behavior name will change when it is overridden. + /// + public string OriginalBehaviorName + { + get + { + if (string.IsNullOrEmpty(m_OriginalBehaviorName)) + { + var bp = m_Agent.GetComponent(); + m_OriginalBehaviorName = bp.BehaviorName; + } + + return m_OriginalBehaviorName; + } + } + + public static string GetOverrideBehaviorName(string originalBehaviorName) + { + return $"Override_{originalBehaviorName}"; + } + + /// + /// Get the asset path to use from the commandline arguments. + /// Can be called multiple times - if m_HaveProcessedCommandLine is set, will have no effect. + /// + /// + void GetAssetPathFromCommandLine() + { + if (m_HaveProcessedCommandLine) + { + return; + } + + var maxEpisodes = 0; + var timeoutSeconds = 0; + + string[] commandLineArgsOverride = null; + if (!string.IsNullOrEmpty(debugCommandLineOverride) && Application.isEditor) + { + commandLineArgsOverride = debugCommandLineOverride.Split(' '); + } + + var args = commandLineArgsOverride ?? Environment.GetCommandLineArgs(); + for (var i = 0; i < args.Length; i++) + { + if (args[i] == k_CommandLineModelOverrideDirectoryFlag && i < args.Length - 1) + { + m_BehaviorNameOverrideDirectory = args[i + 1].Trim(); + } + else if (args[i] == k_CommandLineModelOverrideExtensionFlag && i < args.Length - 1) + { + var overrideExtension = args[i + 1].Trim().ToLower(); + var isKnownExtension = k_SupportedExtensions.Contains(overrideExtension); + if (!isKnownExtension) + { + Debug.LogError($"loading unsupported format: {overrideExtension}"); + Application.Quit(1); +#if UNITY_EDITOR + EditorApplication.isPlaying = false; +#endif + } + + m_OverrideExtensions.Add(overrideExtension); + } + else if (args[i] == k_CommandLineQuitAfterEpisodesFlag && i < args.Length - 1) + { + Int32.TryParse(args[i + 1], out maxEpisodes); + } + else if (args[i] == k_CommandLineQuitAfterSeconds && i < args.Length - 1) + { + Int32.TryParse(args[i + 1], out timeoutSeconds); + } + else if (args[i] == k_CommandLineQuitOnLoadFailure) + { + m_QuitOnLoadFailure = true; + } + } + + if (!string.IsNullOrEmpty(m_BehaviorNameOverrideDirectory)) + { + // If overriding models, set maxEpisodes to 1 or the command line value + m_MaxEpisodes = maxEpisodes > 0 ? maxEpisodes : 1; + Debug.Log($"setting m_MaxEpisodes to {maxEpisodes}"); + } + + if (timeoutSeconds > 0) + { + m_Deadline = DateTime.Now + TimeSpan.FromSeconds(timeoutSeconds); + Debug.Log($"setting deadline to {timeoutSeconds} from now."); + } + + m_HaveProcessedCommandLine = true; + } + + void OnEnable() + { + // Start with these initialized to previous values in the case where we're resetting scenes. + m_PreviousNumSteps = s_PreviousNumSteps; + m_PreviousAgentCompletedEpisodes = s_PreviousAgentCompletedEpisodes; + + m_Agent = GetComponent(); + + GetAssetPathFromCommandLine(); + if (HasOverrides) + { + OverrideModel(); + } + } + + void OnDisable() + { + // Update the static episode and step counts. + // For a single agent in the scene, this will be a straightforward increment. + // If there are multiple agents, we'll increment the count by the Agent that completed the most episodes. + s_PreviousAgentCompletedEpisodes = Mathf.Max(s_PreviousAgentCompletedEpisodes, TotalCompletedEpisodes); + s_PreviousNumSteps = Mathf.Max(s_PreviousNumSteps, TotalNumSteps); + } + + void FixedUpdate() + { + if (m_MaxEpisodes > 0) + { + // For Agents without maxSteps, exit as soon as we've hit the target number of episodes. + // For Agents that specify MaxStep, also make sure we've gone at least that many steps. + // Since we exit as soon as *any* Agent hits its target, the maxSteps condition keeps us running + // a bit longer in case there's an early failure. + if (TotalCompletedEpisodes >= m_MaxEpisodes && TotalNumSteps > m_MaxEpisodes * m_Agent.MaxStep) + { + Debug.Log($"ModelOverride reached {TotalCompletedEpisodes} episodes and {TotalNumSteps} steps. Exiting."); + Application.Quit(0); +#if UNITY_EDITOR + EditorApplication.isPlaying = false; +#endif + } + else if (DateTime.Now >= m_Deadline) + { + Debug.Log( + $"Deadline exceeded. " + + $"{TotalCompletedEpisodes}/{m_MaxEpisodes} episodes and " + + $"{TotalNumSteps}/{m_MaxEpisodes * m_Agent.MaxStep} steps completed. Exiting."); + Application.Quit(0); +#if UNITY_EDITOR + EditorApplication.isPlaying = false; +#endif + } + } + + m_NumSteps++; + } + + public ModelAsset GetModelForBehaviorName(string behaviorName) + { + if (m_CachedModels.ContainsKey(behaviorName)) + { + return m_CachedModels[behaviorName]; + } + + if (string.IsNullOrEmpty(m_BehaviorNameOverrideDirectory)) + { + Debug.Log($"No override directory set."); + return null; + } + + // Try the override extensions in order. If they weren't set, try .nn first, then .onnx. + var overrideExtensions = (m_OverrideExtensions.Count > 0) + ? m_OverrideExtensions.ToArray() + : new[] { "nn", "onnx" }; + + byte[] rawModel = null; + bool isOnnx = false; + string assetName = null; + foreach (var overrideExtension in overrideExtensions) + { + var assetPath = Path.Combine(m_BehaviorNameOverrideDirectory, $"{behaviorName}.{overrideExtension}"); + try + { + rawModel = File.ReadAllBytes(assetPath); + isOnnx = overrideExtension.Equals("onnx"); + assetName = "Override - " + Path.GetFileName(assetPath); + break; + } + catch (IOException) + { + // Do nothing - try the next extension, or we'll exit if nothing loaded. + } + } + + if (rawModel == null) + { + Debug.Log($"Couldn't load model file(s) for {behaviorName} in {m_BehaviorNameOverrideDirectory} (full path: {Path.GetFullPath(m_BehaviorNameOverrideDirectory)}"); + + // Cache the null so we don't repeatedly try to load a missing file + m_CachedModels[behaviorName] = null; + return null; + } + + // TODO enable this when we have a decision on supporting loading/converting an ONNX model directly into a ModelAsset + // ModelAsset asset; + // if (isOnnx) + // { + // var modelName = Path.Combine(m_BehaviorNameOverrideDirectory, $"{behaviorName}.onnx"); + // asset = LoadOnnxModel(modelName); + // } + // else + // { + // asset = LoadSentisModel(rawModel); + // } + // var asset = isOnnx ? LoadOnnxModel(rawModel) : LoadSentisModel(rawModel); + var asset = LoadSentisModel(rawModel); + asset.name = assetName; + m_CachedModels[behaviorName] = asset; + return asset; + } + + ModelAsset LoadSentisModel(byte[] rawModel) + { + var asset = ScriptableObject.CreateInstance(); + asset.modelAssetData = ScriptableObject.CreateInstance(); + asset.modelAssetData.value = rawModel; + return asset; + } + + // TODO enable this when we have a decision on supporting loading/converting an ONNX model directly into a ModelAsset + // ModelAsset LoadOnnxModel(string modelName) + // { + // Debug.Log($"Loading model for override: {modelName}"); + // var converter = new ONNXModelConverter(true); + // var directoryName = Path.GetDirectoryName(modelName); + // var model = converter.Convert(modelName, directoryName); + // var asset = ScriptableObject.CreateInstance(); + // var assetData = ScriptableObject.CreateInstance(); + // var descStream = new MemoryStream(); + // ModelWriter.SaveModelDesc(descStream, model); + // assetData.value = descStream.ToArray(); + // assetData.name = "Data"; + // assetData.hideFlags = HideFlags.HideInHierarchy; + // descStream.Close(); + // descStream.Dispose(); + // asset.modelAssetData = assetData; + // var weightStreams = new List(); + // ModelWriter.SaveModelWeights(weightStreams, model); + // + // asset.modelWeightsChunks = new ModelAssetWeightsData[weightStreams.Count]; + // for (int i = 0; i < weightStreams.Count; i++) + // { + // var stream = weightStreams[i]; + // asset.modelWeightsChunks[i] = ScriptableObject.CreateInstance(); + // asset.modelWeightsChunks[i].value = stream.ToArray(); + // asset.modelWeightsChunks[i].name = "Data"; + // asset.modelWeightsChunks[i].hideFlags = HideFlags.HideInHierarchy; + // stream.Close(); + // stream.Dispose(); + // } + // + // return asset; + // } + + // TODO this should probably be deprecated since Sentis does not support direct conversion from byte arrays + // ModelAsset LoadOnnxModel(byte[] rawModel) + // { + // var converter = new ONNXModelConverter(true); + // var onnxModel = converter.Convert(rawModel); + // + // ModelAssetData assetData = ScriptableObject.CreateInstance(); + // using (var memoryStream = new MemoryStream()) + // using (var writer = new BinaryWriter(memoryStream)) + // { + // ModelWriter.Save(writer, onnxModel); + // assetData.value = memoryStream.ToArray(); + // } + // assetData.name = "Data"; + // assetData.hideFlags = HideFlags.HideInHierarchy; + // + // var asset = ScriptableObject.CreateInstance(); + // asset.modelAssetData = assetData; + // return asset; + // } + + /// + /// Load the ModelAsset file from the specified path, and give it to the attached agent. + /// + void OverrideModel() + { + bool overrideOk = false; + string overrideError = null; + + m_Agent.LazyInitialize(); + + ModelAsset ModelAsset = null; + try + { + ModelAsset = GetModelForBehaviorName(OriginalBehaviorName); + } + catch (Exception e) + { + overrideError = $"Exception calling GetModelForBehaviorName: {e}"; + } + + if (ModelAsset == null) + { + if (string.IsNullOrEmpty(overrideError)) + { + overrideError = + $"Didn't find a model for behaviorName {OriginalBehaviorName}. Make " + + "sure the behaviorName is set correctly in the commandline " + + "and that the model file exists"; + } + } + else + { + var modelName = ModelAsset != null ? ModelAsset.name : ""; + Debug.Log($"Overriding behavior {OriginalBehaviorName} for agent with model {modelName}"); + try + { + m_Agent.SetModel(GetOverrideBehaviorName(OriginalBehaviorName), ModelAsset); + overrideOk = true; + } + catch (Exception e) + { + overrideError = $"Exception calling Agent.SetModel: {e}"; + } + } + + if (!overrideOk && m_QuitOnLoadFailure) + { + if (!string.IsNullOrEmpty(overrideError)) + { + Debug.LogWarning(overrideError); + } + + Application.Quit(1); +#if UNITY_EDITOR + EditorApplication.isPlaying = false; +#endif + } + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta new file mode 100644 index 0000000000..91271a0617 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3a6da8f78a394c6ab027688eab81e04d +timeCreated: 1579651041 \ No newline at end of file diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs new file mode 100644 index 0000000000..73e7c34d23 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs @@ -0,0 +1,563 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace Unity.MLAgents +{ + /// + /// Monitor is used to display information about the Agent within the Unity + /// scene. Use the log function to add information to your monitor. + /// + public class Monitor : MonoBehaviour + { + /// + /// The type of monitor the information must be displayed in. + /// corresponds to a single rectangle whose width is given + /// by a float between -1 and 1. (green is positive, red is negative) + /// + /// corresponds to n vertical sliders. + /// is a text field. + /// is a rectangle of fixed length to represent the proportions + /// of a list of floats. + /// + public enum DisplayType + { + Independent, + Proportion + } + + /// + /// Represents how high above the target the monitors will be. + /// + public static float verticalOffset = 3f; + + static bool s_IsInstantiated; + static GameObject s_Canvas; + static Dictionary> s_DisplayTransformValues; + + /// + /// Camera used to calculate GUI screen position relative to the target + /// transform. + /// + static Dictionary s_TransformCamera; + + static Color[] s_BarColors; + + struct DisplayValue + { + public float time; + public string stringValue; + public float floatValue; + public float[] floatArrayValues; + + public enum ValueType + { + Float, + FloatarrayIndependent, + FloatarrayProportion, + String + } + + public ValueType valueType; + } + + static GUIStyle s_KeyStyle; + static GUIStyle s_ValueStyle; + static GUIStyle s_GreenStyle; + static GUIStyle s_RedStyle; + static GUIStyle[] s_ColorStyle; + static bool s_Initialized; + + /// + /// Use the Monitor.Log static function to attach information to a transform. + /// + /// The log. + /// The name of the information you wish to Log. + /// The string value you want to display. + /// The transform you want to attach the information to. + /// + /// Camera used to calculate GUI position relative to + /// the target. If null, `Camera.main` will be used. + public static void Log( + string key, + string value, + Transform target = null, + Camera camera = null) + { + if (!s_IsInstantiated) + { + InstantiateCanvas(); + s_IsInstantiated = true; + } + if (s_Canvas == null) + { + return; + } + + if (target == null) + { + target = s_Canvas.transform; + } + + s_TransformCamera[target] = camera; + + if (!s_DisplayTransformValues.Keys.Contains(target)) + { + s_DisplayTransformValues[target] = + new Dictionary(); + } + + var displayValues = + s_DisplayTransformValues[target]; + + if (value == null) + { + RemoveValue(target, key); + return; + } + + if (!displayValues.ContainsKey(key)) + { + var dv = new DisplayValue(); + dv.time = Time.timeSinceLevelLoad; + dv.stringValue = value; + dv.valueType = DisplayValue.ValueType.String; + displayValues[key] = dv; + while (displayValues.Count > 20) + { + var max = ( + displayValues + .Aggregate((l, r) => l.Value.time < r.Value.time ? l : r) + .Key + ); + RemoveValue(target, max); + } + } + else + { + var dv = displayValues[key]; + dv.stringValue = value; + dv.valueType = DisplayValue.ValueType.String; + displayValues[key] = dv; + } + } + + /// + /// Use the Monitor.Log static function to attach information to a transform. + /// + /// The log. + /// The name of the information you wish to Log. + /// The float value you want to display. + /// The transform you want to attach the information to. + /// + /// Camera used to calculate GUI position relative to + /// the target. If null, `Camera.main` will be used. + public static void Log( + string key, + float value, + Transform target = null, + Camera camera = null) + { + if (!s_IsInstantiated) + { + InstantiateCanvas(); + s_IsInstantiated = true; + } + + if (target == null) + { + target = s_Canvas.transform; + } + + s_TransformCamera[target] = camera; + + if (!s_DisplayTransformValues.Keys.Contains(target)) + { + s_DisplayTransformValues[target] = new Dictionary(); + } + + var displayValues = s_DisplayTransformValues[target]; + + if (!displayValues.ContainsKey(key)) + { + var dv = new DisplayValue(); + dv.time = Time.timeSinceLevelLoad; + dv.floatValue = value; + dv.valueType = DisplayValue.ValueType.Float; + displayValues[key] = dv; + while (displayValues.Count > 20) + { + var max = ( + displayValues.Aggregate((l, r) => l.Value.time < r.Value.time ? l : r).Key); + RemoveValue(target, max); + } + } + else + { + var dv = displayValues[key]; + dv.floatValue = value; + dv.valueType = DisplayValue.ValueType.Float; + displayValues[key] = dv; + } + } + + /// + /// Use the Monitor.Log static function to attach information to a transform. + /// + /// The log. + /// The name of the information you wish to Log. + /// The array of float you want to display. + /// The type of display. + /// The transform you want to attach the information to. + /// + /// Camera used to calculate GUI position relative to + /// the target. If null, `Camera.main` will be used. + public static void Log( + string key, + float[] value, + Transform target = null, + DisplayType displayType = DisplayType.Independent, + Camera camera = null + ) + { + if (!s_IsInstantiated) + { + InstantiateCanvas(); + s_IsInstantiated = true; + } + + if (target == null) + { + target = s_Canvas.transform; + } + + s_TransformCamera[target] = camera; + + if (!s_DisplayTransformValues.Keys.Contains(target)) + { + s_DisplayTransformValues[target] = new Dictionary(); + } + + var displayValues = s_DisplayTransformValues[target]; + + if (!displayValues.ContainsKey(key)) + { + var dv = new DisplayValue(); + dv.time = Time.timeSinceLevelLoad; + dv.floatArrayValues = value; + if (displayType == DisplayType.Independent) + { + dv.valueType = DisplayValue.ValueType.FloatarrayIndependent; + } + else + { + dv.valueType = DisplayValue.ValueType.FloatarrayProportion; + } + + displayValues[key] = dv; + while (displayValues.Count > 20) + { + var max = ( + displayValues.Aggregate((l, r) => l.Value.time < r.Value.time ? l : r).Key); + RemoveValue(target, max); + } + } + else + { + var dv = displayValues[key]; + dv.floatArrayValues = value; + if (displayType == DisplayType.Independent) + { + dv.valueType = DisplayValue.ValueType.FloatarrayIndependent; + } + else + { + dv.valueType = DisplayValue.ValueType.FloatarrayProportion; + } + + displayValues[key] = dv; + } + } + + /// + /// Remove a value from a monitor. + /// + /// + /// The transform to which the information is attached. + /// + /// The key of the information you want to remove. + public static void RemoveValue(Transform target, string key) + { + if (target == null) + { + target = s_Canvas.transform; + } + + if (s_DisplayTransformValues.Keys.Contains(target)) + { + if (s_DisplayTransformValues[target].ContainsKey(key)) + { + s_DisplayTransformValues[target].Remove(key); + if (s_DisplayTransformValues[target].Keys.Count == 0) + { + s_DisplayTransformValues.Remove(target); + } + } + } + } + + /// + /// Remove all information from a monitor. + /// + /// + /// The transform to which the information is attached. + /// + public static void RemoveAllValues(Transform target) + { + if (target == null) + { + target = s_Canvas.transform; + } + + if (s_DisplayTransformValues.Keys.Contains(target)) + { + s_DisplayTransformValues.Remove(target); + } + } + + /// + /// Use SetActive to enable or disable the Monitor via script + /// + /// Value to set the Monitor's status to. + public static void SetActive(bool active) + { + if (!s_IsInstantiated) + { + InstantiateCanvas(); + s_IsInstantiated = true; + } + + if (s_Canvas != null) + { + s_Canvas.SetActive(active); + } + } + + /// Initializes the canvas. + static void InstantiateCanvas() + { + s_Canvas = GameObject.Find("AgentMonitorCanvas"); + if (s_Canvas == null) + { + s_Canvas = new GameObject(); + s_Canvas.name = "AgentMonitorCanvas"; + s_Canvas.AddComponent(); + } + + s_DisplayTransformValues = new Dictionary>(); + + s_TransformCamera = new Dictionary(); + } + + void OnGUI() + { + if (!s_Initialized) + { + Initialize(); + s_Initialized = true; + } + + var toIterate = s_DisplayTransformValues.Keys.ToList(); + foreach (var target in toIterate) + { + if (target == null) + { + s_DisplayTransformValues.Remove(target); + continue; + } + + // get camera + var cam = s_TransformCamera[target]; + if (cam == null) + { + cam = Camera.main; + } + + var widthScaler = (Screen.width / 1000f); + var keyPixelWidth = 100 * widthScaler; + var keyPixelHeight = 20 * widthScaler; + var paddingWidth = 10 * widthScaler; + + var scale = 1f; + var origin = new Vector3( + Screen.width / 2.0f - keyPixelWidth, Screen.height); + if (!(target == s_Canvas.transform)) + { + var camTransform = cam.transform; + var position = target.position; + var cam2Obj = position - camTransform.position; + scale = Mathf.Min( + 1, + 20f / (Vector3.Dot(cam2Obj, camTransform.forward))); + var worldPosition = cam.WorldToScreenPoint( + position + new Vector3(0, verticalOffset, 0)); + origin = new Vector3( + worldPosition.x - keyPixelWidth * scale, Screen.height - worldPosition.y); + } + + keyPixelWidth *= scale; + keyPixelHeight *= scale; + paddingWidth *= scale; + s_KeyStyle.fontSize = (int)(keyPixelHeight * 0.8f); + if (s_KeyStyle.fontSize < 2) + { + continue; + } + + + var displayValues = s_DisplayTransformValues[target]; + + var index = 0; + var orderedKeys = displayValues.Keys.OrderBy(x => -displayValues[x].time); + foreach (var key in orderedKeys) + { + s_KeyStyle.alignment = TextAnchor.MiddleRight; + GUI.Label( + new Rect( + origin.x, origin.y - (index + 1) * keyPixelHeight, + keyPixelWidth, keyPixelHeight), + key, + s_KeyStyle); + float[] vals; + GUIStyle s; + switch (displayValues[key].valueType) + { + case DisplayValue.ValueType.String: + s_ValueStyle.alignment = TextAnchor.MiddleLeft; + GUI.Label( + new Rect( + origin.x + paddingWidth + keyPixelWidth, + origin.y - (index + 1) * keyPixelHeight, + keyPixelWidth, keyPixelHeight), + displayValues[key].stringValue, + s_ValueStyle); + break; + case DisplayValue.ValueType.Float: + var sliderValue = displayValues[key].floatValue; + sliderValue = Mathf.Min(1f, sliderValue); + s = s_GreenStyle; + if (sliderValue < 0) + { + sliderValue = Mathf.Min(1f, -sliderValue); + s = s_RedStyle; + } + + GUI.Box( + new Rect( + origin.x + paddingWidth + keyPixelWidth, + origin.y - (index + 0.9f) * keyPixelHeight, + keyPixelWidth * sliderValue, keyPixelHeight * 0.8f), + GUIContent.none, + s); + break; + + case DisplayValue.ValueType.FloatarrayIndependent: + const float histWidth = 0.15f; + vals = displayValues[key].floatArrayValues; + for (var i = 0; i < vals.Length; i++) + { + var value = Mathf.Min(vals[i], 1); + s = s_GreenStyle; + if (value < 0) + { + value = Mathf.Min(1f, -value); + s = s_RedStyle; + } + + GUI.Box( + new Rect( + origin.x + paddingWidth + keyPixelWidth + + (keyPixelWidth * histWidth + paddingWidth / 2) * i, + origin.y - (index + 0.1f) * keyPixelHeight, + keyPixelWidth * histWidth, -keyPixelHeight * value), + GUIContent.none, + s); + } + + break; + + case DisplayValue.ValueType.FloatarrayProportion: + var valsSum = 0f; + var valsCum = 0f; + vals = displayValues[key].floatArrayValues; + foreach (var f in vals) + { + valsSum += Mathf.Max(f, 0); + } + + if (valsSum < float.Epsilon) + { + Debug.LogError( + $"The Monitor value for key {key} " + + "must be a list or array of " + + "positive values and cannot " + + "be empty."); + } + else + { + for (var i = 0; i < vals.Length; i++) + { + var value = Mathf.Max(vals[i], 0) / valsSum; + GUI.Box( + new Rect( + origin.x + paddingWidth + + keyPixelWidth + keyPixelWidth * valsCum, + origin.y - (index + 0.9f) * keyPixelHeight, + keyPixelWidth * value, keyPixelHeight * 0.8f), + GUIContent.none, + s_ColorStyle[i % s_ColorStyle.Length]); + valsCum += value; + } + } + + break; + } + + index++; + } + } + } + + /// Helper method used to initialize the GUI. Called once. + void Initialize() + { + s_KeyStyle = GUI.skin.label; + s_ValueStyle = GUI.skin.label; + s_ValueStyle.clipping = TextClipping.Overflow; + s_ValueStyle.wordWrap = false; + s_BarColors = new[] + { + Color.magenta, + Color.blue, + Color.cyan, + Color.green, + Color.yellow, + Color.red + }; + s_ColorStyle = new GUIStyle[s_BarColors.Length]; + for (var i = 0; i < s_BarColors.Length; i++) + { + var texture = new Texture2D(1, 1, TextureFormat.ARGB32, false); + texture.SetPixel(0, 0, s_BarColors[i]); + texture.Apply(); + var staticRectStyle = new GUIStyle(); + staticRectStyle.normal.background = texture; + s_ColorStyle[i] = staticRectStyle; + } + + s_GreenStyle = s_ColorStyle[3]; + s_RedStyle = s_ColorStyle[5]; + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta new file mode 100644 index 0000000000..e10bd36d98 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eca114d0a5b45439384024291ba7d40a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs new file mode 100644 index 0000000000..b257b30215 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs @@ -0,0 +1,24 @@ +using UnityEngine; + +namespace Unity.MLAgentsExamples +{ + /// + /// Utility class to allow a stable observation platform. + /// + public class OrientationCubeController : MonoBehaviour + { + //Update position and Rotation + public void UpdateOrientation(Transform rootBP, Transform target) + { + var dirVector = target.position - transform.position; + dirVector.y = 0; //flatten dir on the y. this will only work on level, uneven surfaces + var lookRot = + dirVector == Vector3.zero + ? Quaternion.identity + : Quaternion.LookRotation(dirVector); //get our look rot to the target + + //UPDATE ORIENTATION CUBE POS & ROT + transform.SetPositionAndRotation(rootBP.position, lookRot); + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta new file mode 100644 index 0000000000..9fb2a07fac --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 771e78c5e980e440e8cd19716b55075f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs new file mode 100644 index 0000000000..9b77251e65 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs @@ -0,0 +1,69 @@ +using UnityEngine; +using Unity.MLAgents; + +namespace Unity.MLAgentsExamples +{ + /// + /// A helper class for the ML-Agents example scenes to override various + /// global settings, and restore them afterwards. + /// This can modify some Physics and time-stepping properties, so you + /// shouldn't copy it into your project unless you know what you're doing. + /// + public class ProjectSettingsOverrides : MonoBehaviour + { + // Original values + Vector3 m_OriginalGravity; + float m_OriginalFixedDeltaTime; + float m_OriginalMaximumDeltaTime; + int m_OriginalSolverIterations; + int m_OriginalSolverVelocityIterations; + bool m_OriginalReuseCollisionCallbacks; + + [Tooltip("Increase or decrease the scene gravity. Use ~3x to make things less floaty")] + public float gravityMultiplier = 1.0f; + + [Header("Advanced physics settings")] + [Tooltip("The interval in seconds at which physics and other fixed frame rate updates (like MonoBehaviour's FixedUpdate) are performed.")] + public float fixedDeltaTime = .02f; + [Tooltip("The maximum time a frame can take. Physics and other fixed frame rate updates (like MonoBehaviour's FixedUpdate) will be performed only for this duration of time per frame.")] + public float maximumDeltaTime = 1.0f / 3.0f; + [Tooltip("Determines how accurately Rigidbody joints and collision contacts are resolved. (default 6). Must be positive.")] + public int solverIterations = 6; + [Tooltip("Affects how accurately the Rigidbody joints and collision contacts are resolved. (default 1). Must be positive.")] + public int solverVelocityIterations = 1; + [Tooltip("Determines whether the garbage collector should reuse only a single instance of a Collision type for all collision callbacks. Reduces Garbage.")] + public bool reuseCollisionCallbacks = true; + + public void Awake() + { + // Save the original values + m_OriginalGravity = Physics.gravity; + m_OriginalFixedDeltaTime = Time.fixedDeltaTime; + m_OriginalMaximumDeltaTime = Time.maximumDeltaTime; + m_OriginalSolverIterations = Physics.defaultSolverIterations; + m_OriginalSolverVelocityIterations = Physics.defaultSolverVelocityIterations; + m_OriginalReuseCollisionCallbacks = Physics.reuseCollisionCallbacks; + + // Override + Physics.gravity *= gravityMultiplier; + Time.fixedDeltaTime = fixedDeltaTime; + Time.maximumDeltaTime = maximumDeltaTime; + Physics.defaultSolverIterations = solverIterations; + Physics.defaultSolverVelocityIterations = solverVelocityIterations; + Physics.reuseCollisionCallbacks = reuseCollisionCallbacks; + + // Make sure the Academy singleton is initialized first, since it will create the SideChannels. + Academy.Instance.EnvironmentParameters.RegisterCallback("gravity", f => { Physics.gravity = new Vector3(0, -f, 0); }); + } + + public void OnDestroy() + { + Physics.gravity = m_OriginalGravity; + Time.fixedDeltaTime = m_OriginalFixedDeltaTime; + Time.maximumDeltaTime = m_OriginalMaximumDeltaTime; + Physics.defaultSolverIterations = m_OriginalSolverIterations; + Physics.defaultSolverVelocityIterations = m_OriginalSolverVelocityIterations; + Physics.reuseCollisionCallbacks = m_OriginalReuseCollisionCallbacks; + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta new file mode 100644 index 0000000000..9dbadc5b82 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec51f47c5ed0478080c449c74fd9c154 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 100 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs new file mode 100644 index 0000000000..31bc7c8556 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs @@ -0,0 +1,59 @@ +using Unity.MLAgents.Sensors; + +namespace Unity.MLAgentsExamples +{ + /// + /// A simple sensor that provides a number default implementations. + /// + public abstract class SensorBase : ISensor + { + /// + /// Write the observations to the output buffer. This size of the buffer will be product + /// of the Shape array values returned by . + /// + /// + public abstract void WriteObservation(float[] output); + + /// + public abstract ObservationSpec GetObservationSpec(); + + /// + public abstract string GetName(); + + /// + /// Default implementation of Write interface. This creates a temporary array, + /// calls WriteObservation, and then writes the results to the ObservationWriter. + /// + /// + /// The number of elements written. + public virtual int Write(ObservationWriter writer) + { + // TODO reuse buffer for similar agents + var numFloats = this.ObservationSize(); + float[] buffer = new float[numFloats]; + WriteObservation(buffer); + + writer.AddList(buffer); + + return numFloats; + } + + /// + public void Update() { } + + /// + public void Reset() { } + + /// + public virtual byte[] GetCompressedObservation() + { + return null; + } + + /// + public virtual CompressionSpec GetCompressionSpec() + { + return CompressionSpec.Default(); + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta new file mode 100644 index 0000000000..af6783dbf6 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf19888920fa24df7ad75a52ede51cf3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs new file mode 100644 index 0000000000..fa4580f40b --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs @@ -0,0 +1,38 @@ +using UnityEngine; + +namespace Unity.MLAgentsExamples +{ + /// + /// This class contains logic for locomotion agents with joints which might make contact with a target. + /// By attaching this as a component to those joints, their contact with the ground can be used as + /// an observation for that agent. + /// + [DisallowMultipleComponent] + public class TargetContact : MonoBehaviour + { + [Header("Detect Targets")] public bool touchingTarget; + const string k_Target = "target"; // Tag on target object. + + /// + /// Check for collision with a target. + /// + void OnCollisionEnter(Collision col) + { + if (col.transform.CompareTag(k_Target)) + { + touchingTarget = true; + } + } + + /// + /// Check for end of ground collision and reset flag appropriately. + /// + void OnCollisionExit(Collision other) + { + if (other.transform.CompareTag(k_Target)) + { + touchingTarget = false; + } + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta new file mode 100644 index 0000000000..02b1fe71b1 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5086c435d3e8b44ffa8262a5c124661f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs new file mode 100644 index 0000000000..e2b2c62778 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs @@ -0,0 +1,133 @@ +using UnityEngine; +using Random = UnityEngine.Random; +using Unity.MLAgents; +using UnityEngine.Events; + +namespace Unity.MLAgentsExamples +{ + /// + /// Utility class to allow target placement and collision detection with an agent + /// Add this script to the target you want the agent to touch. + /// Callbacks will be triggered any time the target is touched with a collider tagged as 'tagToDetect' + /// + public class TargetController : MonoBehaviour + { + + [Header("Collider Tag To Detect")] + public string tagToDetect = "agent"; //collider tag to detect + + [Header("Target Placement")] + public float spawnRadius; //The radius in which a target can be randomly spawned. + public bool respawnIfTouched; //Should the target respawn to a different position when touched + + [Header("Target Fell Protection")] + public bool respawnIfFallsOffPlatform = true; //If the target falls off the platform, reset the position. + public float fallDistance = 5; //distance below the starting height that will trigger a respawn + + private Vector3 m_startingPos; //the starting position of the target + + [System.Serializable] + public class TriggerEvent : UnityEvent + { + } + + [Header("Trigger Callbacks")] + public TriggerEvent onTriggerEnterEvent = new TriggerEvent(); + public TriggerEvent onTriggerStayEvent = new TriggerEvent(); + public TriggerEvent onTriggerExitEvent = new TriggerEvent(); + + [System.Serializable] + public class CollisionEvent : UnityEvent + { + } + + [Header("Collision Callbacks")] + public CollisionEvent onCollisionEnterEvent = new CollisionEvent(); + public CollisionEvent onCollisionStayEvent = new CollisionEvent(); + public CollisionEvent onCollisionExitEvent = new CollisionEvent(); + + // Start is called before the first frame update + void OnEnable() + { + m_startingPos = transform.position; + if (respawnIfTouched) + { + MoveTargetToRandomPosition(); + } + } + + void Update() + { + if (respawnIfFallsOffPlatform) + { + if (transform.position.y < m_startingPos.y - fallDistance) + { + Debug.Log($"{transform.name} Fell Off Platform"); + MoveTargetToRandomPosition(); + } + } + } + + /// + /// Moves target to a random position within specified radius. + /// + public void MoveTargetToRandomPosition() + { + var newTargetPos = m_startingPos + (Random.insideUnitSphere * spawnRadius); + newTargetPos.y = m_startingPos.y; + transform.position = newTargetPos; + } + + private void OnCollisionEnter(Collision col) + { + if (col.transform.CompareTag(tagToDetect)) + { + onCollisionEnterEvent.Invoke(col); + if (respawnIfTouched) + { + MoveTargetToRandomPosition(); + } + } + } + + private void OnCollisionStay(Collision col) + { + if (col.transform.CompareTag(tagToDetect)) + { + onCollisionStayEvent.Invoke(col); + } + } + + private void OnCollisionExit(Collision col) + { + if (col.transform.CompareTag(tagToDetect)) + { + onCollisionExitEvent.Invoke(col); + } + } + + private void OnTriggerEnter(Collider col) + { + if (col.CompareTag(tagToDetect)) + { + onTriggerEnterEvent.Invoke(col); + } + } + + private void OnTriggerStay(Collider col) + { + if (col.CompareTag(tagToDetect)) + { + onTriggerStayEvent.Invoke(col); + } + } + + private void OnTriggerExit(Collider col) + { + if (col.CompareTag(tagToDetect)) + { + onTriggerExitEvent.Invoke(col); + } + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta new file mode 100644 index 0000000000..439d4c10ea --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c8f113a8b8d94967b1b1782c549be81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From d93a5fca5f8f252b9f84e993b04ca9f7bd170fc7 Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Tue, 10 Sep 2024 15:13:42 +0300 Subject: [PATCH 11/43] Fix API documentation --- com.unity.ml-agents/Runtime/Agent.cs | 6 +++ .../Communicator/CommunicatorFactory.cs | 9 +++++ .../Runtime/Communicator/ICommunicator.cs | 10 +++++ .../Communicator/UnityRLCapabilities.cs | 37 +++++++++++++++++++ .../Integrations/Match3/Match3Sensor.cs | 1 + .../Runtime/Sensors/ObservationWriter.cs | 6 +++ .../RayPerceptionSensorComponentBase.cs | 3 ++ .../Runtime/Sensors/SensorShapeValidator.cs | 4 ++ 8 files changed, 76 insertions(+) diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index 45505697e4..1a6ff1219d 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -60,11 +60,17 @@ public struct AgentInfo /// public int groupId; + /// + /// Clear stored actions. + /// public void ClearActions() { storedActions.Clear(); } + /// + /// Copy actions. + /// public void CopyActions(ActionBuffers actionBuffers) { var continuousActions = storedActions.ContinuousActions; diff --git a/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs b/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs index 02d1e4efbd..7771d26e75 100644 --- a/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs +++ b/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs @@ -23,6 +23,9 @@ public static bool Enabled set => s_Enabled = value; } + /// + /// Check if a communicator has been registered. + /// public static bool CommunicatorRegistered => s_Creator != null; internal static ICommunicator Create() @@ -30,11 +33,17 @@ internal static ICommunicator Create() return s_Enabled ? s_Creator() : null; } + /// + /// Register a function that will create an ICommunicator instance. + /// public static void Register(Func creator) where T : ICommunicator { s_Creator = () => creator(); } + /// + /// Clear the registered creator. + /// public static void ClearCreator() { s_Creator = null; diff --git a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs index b6cba33f36..c47de92fa9 100644 --- a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs +++ b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs @@ -5,6 +5,9 @@ namespace Unity.MLAgents { + /// + /// Communicator initialization parameters. + /// public struct CommunicatorInitParameters { /// @@ -32,6 +35,10 @@ public struct CommunicatorInitParameters /// public UnityRLCapabilities CSharpCapabilities; } + + /// + /// Initialization parameters for the Unity environment. + /// public struct UnityRLInitParameters { ///

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 N{{f?srJ(?P2ms-O|HS|R diff --git a/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents.meta similarity index 67% rename from com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage.meta rename to com.unity.ml-agents/Samples/3DBall/ML-Agents.meta index 192f96c439..72c6cd48d9 100644 --- a/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage.meta +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents.meta @@ -1,5 +1,6 @@ fileFormatVersion: 2 -guid: 2cbb8a3a456e1424ba7f2dccd529477a +guid: 05ef2c5e362bc441aa586a4a29d0f3a9 +folderAsset: yes DefaultImporter: externalObjects: {} userData: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta new file mode 100644 index 0000000000..e98267bd96 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd2eecf27a198431da97a77d847bea15 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta new file mode 100644 index 0000000000..b812a4d67e --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3c9e3c82c7c614209aef50a223212c8b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta new file mode 100644 index 0000000000..0bb88ba983 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0c7ab37f49daa4a88a71f9cf14ad8236 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab new file mode 100644 index 0000000000..63f15a3853 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab @@ -0,0 +1,770 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1036225416237908 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4259352808153402} + - component: {fileID: 33399516572863624} + - component: {fileID: 135693586603893602} + - component: {fileID: 23610325484096200} + - component: {fileID: 54597526346971362} + m_Layer: 0 + m_Name: Ball + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4259352808153402 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1036225416237908} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 4.31, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4679453577574622} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33399516572863624 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1036225416237908} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!135 &135693586603893602 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1036225416237908} + m_Material: {fileID: 13400000, guid: 56162663048874fd4b10e065f9cf78b7, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &23610325484096200 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1036225416237908} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: cf2a3769e6d5446698f2e3f5aab68915, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!54 &54597526346971362 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1036225416237908} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.01 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &1218265376493012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4082575947564308} + - component: {fileID: 33986757750372936} + - component: {fileID: 23248495933290848} + m_Layer: 0 + m_Name: eye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4082575947564308 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218265376493012} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0.29999995, y: 0.07399994, z: 0.50040054} + m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294419716796784} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!33 &33986757750372936 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218265376493012} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23248495933290848 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218265376493012} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f731be6866ce749fd8349e67ae81f76a, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1321468028730240 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4679453577574622} + m_Layer: 0 + m_Name: 3DBall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4679453577574622 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1321468028730240} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 5} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4259352808153402} + - {fileID: 4780098186595842} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1424713891854676 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4780098186595842} + - component: {fileID: 65010516625723872} + - component: {fileID: 114368073295828880} + - component: {fileID: 114715123104194396} + - component: {fileID: 1306725529891448089} + - component: {fileID: 1758424554059689351} + m_Layer: 0 + m_Name: Agent + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4780098186595842 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424713891854676} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294419716796784} + m_Father: {fileID: 4679453577574622} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &65010516625723872 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424713891854676} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &114368073295828880 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424713891854676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5d1c4e0b1822b495aa52bc52839ecb30, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BrainParameters: + VectorObservationSize: 8 + NumStackedVectorObservations: 1 + m_ActionSpec: + m_NumContinuousActions: 2 + BranchSizes: + VectorActionSize: 02000000 + VectorActionDescriptions: [] + VectorActionSpaceType: 1 + hasUpgradedBrainParametersWithActionSpec: 1 + m_Model: {fileID: 5022602860645237092, guid: f86b312d0d1de43a1a403c15978cc438, type: 3} + m_InferenceDevice: 2 + m_BehaviorType: 0 + m_BehaviorName: 3DBall + TeamId: 0 + m_UseChildSensors: 1 + m_UseChildActuators: 1 + m_DeterministicInference: 0 + m_ObservableAttributeHandling: 0 +--- !u!114 &114715123104194396 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424713891854676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aaba48bf82bee4751aa7b89569e57f73, type: 3} + m_Name: + m_EditorClassIdentifier: + agentParameters: + maxStep: 0 + hasUpgradedFromAgentParameters: 1 + MaxStep: 5000 + ball: {fileID: 1036225416237908} + useVecObs: 1 +--- !u!114 &1306725529891448089 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424713891854676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3a5c9d521e5ef4759a8246a07d52221e, type: 3} + m_Name: + m_EditorClassIdentifier: + DecisionPeriod: 5 + TakeActionsBetweenDecisions: 1 +--- !u!114 &1758424554059689351 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424713891854676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3a6da8f78a394c6ab027688eab81e04d, type: 3} + m_Name: + m_EditorClassIdentifier: + debugCommandLineOverride: +--- !u!1 &1533320402322554 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4667923401885968} + - component: {fileID: 20793118999710892} + m_Layer: 0 + m_Name: AgentCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &4667923401885968 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1533320402322554} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.15} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294419716796784} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &20793118999710892 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1533320402322554} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.46666667, g: 0.5647059, b: 0.60784316, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294950911 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &1619100162539582 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4425897039098228} + - component: {fileID: 33259119028337980} + - component: {fileID: 23108868206887546} + m_Layer: 0 + m_Name: mouth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4425897039098228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1619100162539582} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: -0.18299997, z: 0.50040054} + m_LocalScale: {x: 0.27602, y: 0.042489994, z: 0.13891} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294419716796784} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!33 &33259119028337980 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1619100162539582} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23108868206887546 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1619100162539582} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f731be6866ce749fd8349e67ae81f76a, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1854695166504686 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4300192163442926} + - component: {fileID: 33165976320323760} + - component: {fileID: 23468552506669568} + m_Layer: 0 + m_Name: Headband + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4300192163442926 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1854695166504686} + m_LocalRotation: {x: -0, y: -0, z: 0.016506119, w: 0.9998638} + m_LocalPosition: {x: 0, y: 0.341, z: 0} + m_LocalScale: {x: 1.0441425, y: 0.19278127, z: 1.0441422} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294419716796784} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: -179.99998, z: 1.8920001} +--- !u!33 &33165976320323760 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1854695166504686} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23468552506669568 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1854695166504686} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 04be259c590de46f69db4cbd1da877d5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1859240399150782 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294419716796784} + - component: {fileID: 33973749152356522} + - component: {fileID: 23340305563606254} + m_Layer: 0 + m_Name: AgentCube_Blue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4294419716796784 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1859240399150782} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4667923401885968} + - {fileID: 4082575947564308} + - {fileID: 4144856465265480} + - {fileID: 4425897039098228} + - {fileID: 4300192163442926} + m_Father: {fileID: 4780098186595842} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!33 &33973749152356522 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1859240399150782} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23340305563606254 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1859240399150782} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c9fa44c2c3f8ce74ca39a3355ea42631, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1999020414315134 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4144856465265480} + - component: {fileID: 33069174244444078} + - component: {fileID: 23048386147321498} + m_Layer: 0 + m_Name: eye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4144856465265480 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999020414315134} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: -0.29999995, y: 0.07399994, z: 0.50040054} + m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294419716796784} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!33 &33069174244444078 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999020414315134} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23048386147321498 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1999020414315134} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f731be6866ce749fd8349e67ae81f76a, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta new file mode 100644 index 0000000000..72aeab1bd8 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cfa81c019162c4e3caf6e2999c6fdf48 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta new file mode 100644 index 0000000000..b2d86629d1 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 46e0b55583dcc4c05bc93d785cccbba5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity new file mode 100644 index 0000000000..698e2134bd --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity @@ -0,0 +1,1135 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44971168, g: 0.4997775, b: 0.57563686, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 1354181355} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1001 &126840690 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (7) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 18 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: -9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &255414642 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1537641056927260, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} +--- !u!1001 &502565578 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (5) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: -9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: -9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &544070511 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (6) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 11 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: -9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &667695845 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (3) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: -9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &717322969 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1 &807556622 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 807556627} + - component: {fileID: 807556626} + - component: {fileID: 807556624} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!124 &807556624 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 807556622} + m_Enabled: 1 +--- !u!20 &807556626 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 807556622} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.46666667, g: 0.5647059, b: 0.60784316, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 35 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &807556627 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 807556622} + m_LocalRotation: {x: 0.13052616, y: 0, z: 0, w: 0.9914449} + m_LocalPosition: {x: 4.5, y: 15, z: -43.83} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 15, y: 0, z: 0} +--- !u!1001 &949996849 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (8) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 13 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &1223600457 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (9) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 14 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: -9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &1334647069 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (10) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 15 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &1345277686 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (1) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!850595691 &1354181355 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Settings.lighting + serializedVersion: 4 + m_GIWorkflowMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 0 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_LightmapCompression: 3 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_PVRTiledBaking: 0 +--- !u!1001 &1442662986 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (11) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 18 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &1531193856 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (4) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: -9 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1 &1583402087 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 1408885610532680, guid: 00a1ebe742cf2394d8c21484e3a02412, + type: 2} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1583402088} + - component: {fileID: 1583402090} + m_Layer: 0 + m_Name: Ball3DSettings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1583402088 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 4673284961943764, guid: 00a1ebe742cf2394d8c21484e3a02412, + type: 2} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583402087} + m_LocalRotation: {x: -0.069583125, y: 0.0049145464, z: 0.0702813, w: 0.99508524} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5, y: 0.19999993, z: 5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1583402090 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583402087} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ec51f47c5ed0478080c449c74fd9c154, type: 3} + m_Name: + m_EditorClassIdentifier: + gravityMultiplier: 1 + fixedDeltaTime: 0.02 + maximumDeltaTime: 0.33333334 + solverIterations: 6 + solverVelocityIterations: 1 + reuseCollisionCallbacks: 1 +--- !u!1 &1746325439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1746325442} + - component: {fileID: 1746325441} + - component: {fileID: 1746325440} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1746325440 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746325439} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1746325441 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746325439} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1746325442 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746325439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1773419472 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_Name + value: 3DBall (2) + objectReference: {fileID: 0} + - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.x + value: 18 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalPosition.z + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} +--- !u!1001 &1916479629 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalRotation.w + value: 0.8681629 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalRotation.x + value: 0.31598538 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalRotation.y + value: -0.3596048 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalRotation.z + value: 0.13088542 + objectReference: {fileID: 0} + - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -45 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta new file mode 100644 index 0000000000..5a1b20b5d7 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b9ac0cbf961bf4dacbfa0aa9c0d60aaa +timeCreated: 1513216032 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta new file mode 100644 index 0000000000..3c2c83f642 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 281ad9894bad943deaf7ec62f03bedec +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs new file mode 100644 index 0000000000..8b16087f22 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs @@ -0,0 +1,95 @@ +using UnityEngine; +using Unity.MLAgents; +using Unity.MLAgents.Actuators; +using Unity.MLAgents.Sensors; +using Random = UnityEngine.Random; + +public class Ball3DAgent : Agent +{ + [Header("Specific to Ball3D")] + public GameObject ball; + [Tooltip("Whether to use vector observation. This option should be checked " + + "in 3DBall scene, and unchecked in Visual3DBall scene. ")] + public bool useVecObs; + Rigidbody m_BallRb; + EnvironmentParameters m_ResetParams; + + public override void Initialize() + { + m_BallRb = ball.GetComponent(); + m_ResetParams = Academy.Instance.EnvironmentParameters; + SetResetParameters(); + } + + public override void CollectObservations(VectorSensor sensor) + { + if (useVecObs) + { + sensor.AddObservation(gameObject.transform.rotation.z); + sensor.AddObservation(gameObject.transform.rotation.x); + sensor.AddObservation(ball.transform.position - gameObject.transform.position); + sensor.AddObservation(m_BallRb.velocity); + } + } + + public override void OnActionReceived(ActionBuffers actionBuffers) + { + var actionZ = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[0], -1f, 1f); + var actionX = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[1], -1f, 1f); + + if ((gameObject.transform.rotation.z < 0.25f && actionZ > 0f) || + (gameObject.transform.rotation.z > -0.25f && actionZ < 0f)) + { + gameObject.transform.Rotate(new Vector3(0, 0, 1), actionZ); + } + + if ((gameObject.transform.rotation.x < 0.25f && actionX > 0f) || + (gameObject.transform.rotation.x > -0.25f && actionX < 0f)) + { + gameObject.transform.Rotate(new Vector3(1, 0, 0), actionX); + } + if ((ball.transform.position.y - gameObject.transform.position.y) < -2f || + Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f || + Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f) + { + SetReward(-1f); + EndEpisode(); + } + else + { + SetReward(0.1f); + } + } + + public override void OnEpisodeBegin() + { + gameObject.transform.rotation = new Quaternion(0f, 0f, 0f, 0f); + gameObject.transform.Rotate(new Vector3(1, 0, 0), Random.Range(-10f, 10f)); + gameObject.transform.Rotate(new Vector3(0, 0, 1), Random.Range(-10f, 10f)); + m_BallRb.velocity = new Vector3(0f, 0f, 0f); + ball.transform.position = new Vector3(Random.Range(-1.5f, 1.5f), 4f, Random.Range(-1.5f, 1.5f)) + + gameObject.transform.position; + //Reset the parameters when the Agent is reset. + SetResetParameters(); + } + + public override void Heuristic(in ActionBuffers actionsOut) + { + var continuousActionsOut = actionsOut.ContinuousActions; + continuousActionsOut[0] = -Input.GetAxis("Horizontal"); + continuousActionsOut[1] = Input.GetAxis("Vertical"); + } + + public void SetBall() + { + //Set the attributes of the ball by fetching the information from the academy + m_BallRb.mass = m_ResetParams.GetWithDefault("mass", 1.0f); + var scale = m_ResetParams.GetWithDefault("scale", 1.0f); + ball.transform.localScale = new Vector3(scale, scale, scale); + } + + public void SetResetParameters() + { + SetBall(); + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta new file mode 100755 index 0000000000..da785c5063 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aaba48bf82bee4751aa7b89569e57f73 +timeCreated: 1502223572 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs new file mode 100644 index 0000000000..ddc335316c --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs @@ -0,0 +1,91 @@ +using UnityEngine; +using Unity.MLAgents; +using Unity.MLAgents.Actuators; +using Unity.MLAgents.Sensors.Reflection; + +public class Ball3DHardAgent : Agent +{ + [Header("Specific to Ball3DHard")] + public GameObject ball; + Rigidbody m_BallRb; + EnvironmentParameters m_ResetParams; + + public override void Initialize() + { + m_BallRb = ball.GetComponent(); + m_ResetParams = Academy.Instance.EnvironmentParameters; + SetResetParameters(); + } + + [Observable(numStackedObservations: 9)] + Vector2 Rotation + { + get + { + return new Vector2(gameObject.transform.rotation.z, gameObject.transform.rotation.x); + } + } + + [Observable(numStackedObservations: 9)] + Vector3 PositionDelta + { + get + { + return ball.transform.position - gameObject.transform.position; + } + } + + public override void OnActionReceived(ActionBuffers actionBuffers) + + { + var continuousActions = actionBuffers.ContinuousActions; + var actionZ = 2f * Mathf.Clamp(continuousActions[0], -1f, 1f); + var actionX = 2f * Mathf.Clamp(continuousActions[1], -1f, 1f); + + if ((gameObject.transform.rotation.z < 0.25f && actionZ > 0f) || + (gameObject.transform.rotation.z > -0.25f && actionZ < 0f)) + { + gameObject.transform.Rotate(new Vector3(0, 0, 1), actionZ); + } + + if ((gameObject.transform.rotation.x < 0.25f && actionX > 0f) || + (gameObject.transform.rotation.x > -0.25f && actionX < 0f)) + { + gameObject.transform.Rotate(new Vector3(1, 0, 0), actionX); + } + if ((ball.transform.position.y - gameObject.transform.position.y) < -2f || + Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f || + Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f) + { + SetReward(-1f); + EndEpisode(); + } + else + { + SetReward(0.1f); + } + } + + public override void OnEpisodeBegin() + { + gameObject.transform.rotation = new Quaternion(0f, 0f, 0f, 0f); + gameObject.transform.Rotate(new Vector3(1, 0, 0), Random.Range(-10f, 10f)); + gameObject.transform.Rotate(new Vector3(0, 0, 1), Random.Range(-10f, 10f)); + m_BallRb.velocity = new Vector3(0f, 0f, 0f); + ball.transform.position = new Vector3(Random.Range(-1.5f, 1.5f), 4f, Random.Range(-1.5f, 1.5f)) + + gameObject.transform.position; + } + + public void SetBall() + { + //Set the attributes of the ball by fetching the information from the academy + m_BallRb.mass = m_ResetParams.GetWithDefault("mass", 1.0f); + var scale = m_ResetParams.GetWithDefault("scale", 1.0f); + ball.transform.localScale = new Vector3(scale, scale, scale); + } + + public void SetResetParameters() + { + SetBall(); + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta new file mode 100644 index 0000000000..48fa44afe9 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: edf26e11cf4ed42eaa3ffb7b91bb4676 +timeCreated: 1517967179 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta new file mode 100644 index 0000000000..fd7da10292 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1157e6fb1823148f28a4e26a98bbbcc1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx new file mode 100644 index 0000000000000000000000000000000000000000..469ca0ad20619d1c5dc3be2a2d21b2add8785cc1 GIT binary patch literal 74869 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 literal 0 HcmV?d00001 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta new file mode 100644 index 0000000000..a0e2fa478c --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f86b312d0d1de43a1a403c15978cc438 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3} + optimizeModel: 1 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta new file mode 100644 index 0000000000..e6320f726b --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b27a66299cd240ceab55d2f44596ccc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta new file mode 100644 index 0000000000..8b6d9ce494 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 97ae7b93d7f6441039a84896f8d5cee1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat new file mode 100644 index 0000000000..98afe276c8 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: AgentBlue + m_Shader: {fileID: 47, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.12941177, g: 0.5882353, b: 0.9529412, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta new file mode 100644 index 0000000000..af271123ae --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c9fa44c2c3f8ce74ca39a3355ea42631 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat new file mode 100644 index 0000000000..2be8f242e3 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Checkers_Ball + m_Shader: {fileID: 47, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 2, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: c922805328ab07d4396783401534201b, type: 3} + m_Scale: {x: 2, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta new file mode 100644 index 0000000000..3111a08278 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf2a3769e6d5446698f2e3f5aab68915 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat new file mode 100644 index 0000000000..703bddeb2b --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Eye + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHATEST_ON _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 1 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.058823526, g: 0.058823526, b: 0.058823526, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta new file mode 100644 index 0000000000..9e5b564d11 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f731be6866ce749fd8349e67ae81f76a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat new file mode 100644 index 0000000000..13b5854401 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Headband + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.98039216, g: 0.6509804, b: 0.16078432, a: 1} + - _EmissionColor: {r: 0.98039216, g: 0.6509804, b: 0.16078432, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta new file mode 100644 index 0000000000..2d90b1a9f6 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 04be259c590de46f69db4cbd1da877d5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta new file mode 100644 index 0000000000..4a8fca975f --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bc99450cc5b9d4f3d8d579ba6e655e2e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png new file mode 100644 index 0000000000000000000000000000000000000000..084b1d5806ec5b4d8f96123c16a5fd518b008552 GIT binary patch literal 160263 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ς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 literal 0 HcmV?d00001 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta new file mode 100644 index 0000000000..c339b6cd70 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: ff9a4fb150ec44c1dae2f2c249a05286 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta new file mode 100644 index 0000000000..d848c3a433 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f26a3490d9f744d84aae5899f2f377da +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab new file mode 100644 index 0000000000..078274d921 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab @@ -0,0 +1,177 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1508578353888260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224796324260922368} + - component: {fileID: 222875034646499690} + - component: {fileID: 114223610671736162} + m_Layer: 5 + m_Name: Logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224796324260922368 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1508578353888260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.3300893, y: 0.3300892, z: 0.3300892} + m_Children: [] + m_Father: {fileID: 224194346362733190} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -209, y: -116} + m_SizeDelta: {x: 715.7, y: 715.69995} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222875034646499690 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1508578353888260} + m_CullTransparentMesh: 1 +--- !u!114 &114223610671736162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1508578353888260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ff9a4fb150ec44c1dae2f2c249a05286, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1537641056927260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224194346362733190} + - component: {fileID: 223703725700644330} + - component: {fileID: 114816648722094340} + - component: {fileID: 114595077744033850} + m_Layer: 5 + m_Name: Canvas_Watermark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224194346362733190 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537641056927260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 224796324260922368} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &223703725700644330 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537641056927260} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &114816648722094340 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537641056927260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1200} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &114595077744033850 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537641056927260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta new file mode 100644 index 0000000000..22504d9589 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3ce107b4a79bc4eef83afde434932a68 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab new file mode 100644 index 0000000000..f6cbffb608 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab @@ -0,0 +1,96 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1537121661968964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4943719350691982} + - component: {fileID: 108227806558212132} + m_Layer: 0 + m_Name: Directional_Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!4 &4943719350691982 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537121661968964} + m_LocalRotation: {x: 0.31598538, y: -0.3596048, z: 0.13088542, w: 0.8681629} + m_LocalPosition: {x: 106.38621, y: 38.840767, z: 34.72934} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 40, y: -45, z: 0} +--- !u!108 &108227806558212132 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537121661968964} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.99570733, b: 0.984, a: 1} + m_Intensity: 0.7 + m_Range: 27.9 + m_SpotAngle: 74.8 + m_InnerSpotAngle: 57.579865 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 0.8 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta new file mode 100644 index 0000000000..7e04d96f74 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5889392e3f05b448a8a06c5def6c2dec +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta new file mode 100644 index 0000000000..31d0dff382 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a5d6e96a2ced43ec8739744ade8d3e8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs new file mode 100644 index 0000000000..e111353c99 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs @@ -0,0 +1,54 @@ +//This script lets you change time scale during training. It is not a required script for this demo to function + +using UnityEngine; + +namespace MLAgentsExamples +{ + public class AdjustTrainingTimescale : MonoBehaviour + { + // Update is called once per frame + void Update() + { + if (Input.GetKeyDown(KeyCode.Alpha1)) + { + Time.timeScale = 1f; + } + if (Input.GetKeyDown(KeyCode.Alpha2)) + { + Time.timeScale = 2f; + } + if (Input.GetKeyDown(KeyCode.Alpha3)) + { + Time.timeScale = 3f; + } + if (Input.GetKeyDown(KeyCode.Alpha4)) + { + Time.timeScale = 4f; + } + if (Input.GetKeyDown(KeyCode.Alpha5)) + { + Time.timeScale = 5f; + } + if (Input.GetKeyDown(KeyCode.Alpha6)) + { + Time.timeScale = 6f; + } + if (Input.GetKeyDown(KeyCode.Alpha7)) + { + Time.timeScale = 7f; + } + if (Input.GetKeyDown(KeyCode.Alpha8)) + { + Time.timeScale = 8f; + } + if (Input.GetKeyDown(KeyCode.Alpha9)) + { + Time.timeScale = 9f; + } + if (Input.GetKeyDown(KeyCode.Alpha0)) + { + Time.timeScale *= 2f; + } + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta new file mode 100644 index 0000000000..ed6469dcb4 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d6f3eab3776b4fb79724ac4216dfd7b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs new file mode 100644 index 0000000000..65bc08acda --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs @@ -0,0 +1,11 @@ +using UnityEngine; + +namespace Unity.MLAgentsExamples +{ + public class Area : MonoBehaviour + { + public virtual void ResetArea() + { + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta new file mode 100644 index 0000000000..b08c7db438 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b46b66a9b32b24fab9d7ffcca24f1f43 +timeCreated: 1506809357 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs new file mode 100644 index 0000000000..d387223c67 --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs @@ -0,0 +1,31 @@ +using UnityEngine; + +namespace Unity.MLAgentsExamples +{ + public class CameraFollow : MonoBehaviour + { + [Tooltip("The target to follow")] public Transform target; + + [Tooltip("The time it takes to move to the new position")] + public float smoothingTime; //The time it takes to move to the new position + + private Vector3 m_Offset; + private Vector3 m_CamVelocity; //Camera's velocity (used by SmoothDamp) + + // Use this for initialization + void Start() + { + m_Offset = gameObject.transform.position - target.position; + } + + void FixedUpdate() + { + var newPosition = new Vector3(target.position.x + m_Offset.x, transform.position.y, + target.position.z + m_Offset.z); + + gameObject.transform.position = + Vector3.SmoothDamp(transform.position, newPosition, ref m_CamVelocity, smoothingTime, Mathf.Infinity, + Time.fixedDeltaTime); + } + } +} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta new file mode 100644 index 0000000000..cd6bf5139e --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ec40c70d5160b47cd8deaab79e24892c +timeCreated: 1508523647 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs new file mode 100644 index 0000000000..c9a26bfc8c --- /dev/null +++ b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs @@ -0,0 +1,141 @@ +using UnityEngine; +using UnityEngine.Events; + +namespace Unity.MLAgentsExamples +{ + ///

@@ -119,6 +126,9 @@ Since the messages are sent back and forth with exchange and simultaneously when UnityOutput and UnityInput can be extended to provide functionalities beyond RL UnityRLOutput and UnityRLInput can be extended to provide new RL functionalities */ + /// + /// Interface of the Communicators + /// public interface ICommunicator : IDisposable { /// diff --git a/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs b/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs index a82b0b1da7..af91dcd771 100644 --- a/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs +++ b/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs @@ -2,20 +2,57 @@ namespace Unity.MLAgents { + /// + /// A class holding the capabilities flags for Reinforcement Learning across C# and the Trainer codebase. + /// public class UnityRLCapabilities { + /// + /// Base RL capabilities. + /// public bool BaseRLCapabilities; + + /// + /// Concatenated PNG observations. + /// public bool ConcatenatedPngObservations; + + /// + /// Compressed channel mapping. + /// public bool CompressedChannelMapping; + + /// + /// Hybrid actions. + /// public bool HybridActions; + + /// + /// Training analytics. + /// public bool TrainingAnalytics; + + /// + /// Variable length observation. + /// public bool VariableLengthObservation; + + /// + /// Multi-agent groups. + /// public bool MultiAgentGroups; /// /// A class holding the capabilities flags for Reinforcement Learning across C# and the Trainer codebase. This /// struct will be used to inform users if and when they are using C# / Trainer features that are mismatched. /// + /// Base RL capabilities. + /// Concatenated PNG observations. + /// Compressed channel mapping. + /// Hybrid actions. + /// Training analytics. + /// Variable length observation. + /// Multi-agent groups. public UnityRLCapabilities( bool baseRlCapabilities = true, bool concatenatedPngObservations = true, diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs index 6252a641e4..ac0cdccbb1 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Match3Sensor.cs @@ -10,6 +10,7 @@ namespace Unity.MLAgents.Integrations.Match3 /// /// X /// Y + /// The integer value at the given (x,y) coordinate. public delegate int GridValueProvider(int x, int y); /// diff --git a/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs b/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs index 3a34834b1f..c4b77f99cf 100644 --- a/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs +++ b/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs @@ -20,6 +20,9 @@ public class ObservationWriter TensorShape m_TensorShape; + /// + /// Initializes a new instance of the class. + /// public ObservationWriter() { } /// @@ -96,6 +99,9 @@ public float this[int index] } } + /// + /// Write access at the specified channel and width. + /// public float this[int ch, int w] { set diff --git a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs index a959f13aa6..7c6eb2dc26 100644 --- a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs +++ b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs @@ -127,6 +127,9 @@ public int ObservationStacks set { m_ObservationStacks = value; } } + /// + /// Disable to provide the rays in left to right order + /// [HideInInspector, SerializeField] [Tooltip("Disable to provide the rays in left to right order. Warning: Alternating order will be deprecated, disable it to ensure compatibility with future versions of ML-Agents.")] public bool m_AlternatingRayOrder = true; diff --git a/com.unity.ml-agents/Runtime/Sensors/SensorShapeValidator.cs b/com.unity.ml-agents/Runtime/Sensors/SensorShapeValidator.cs index 2d80d75234..879e8924c1 100644 --- a/com.unity.ml-agents/Runtime/Sensors/SensorShapeValidator.cs +++ b/com.unity.ml-agents/Runtime/Sensors/SensorShapeValidator.cs @@ -3,6 +3,9 @@ namespace Unity.MLAgents.Sensors { + /// + /// Check that List Sensors are the same shape as the previous ones. + /// public class SensorShapeValidator { List m_SensorShapes; @@ -11,6 +14,7 @@ public class SensorShapeValidator /// Check that the List Sensors are the same shape as the previous ones. /// If this is the first List of Sensors being checked, its Sensor sizes will be saved. /// + /// List of Sensors to validate public void ValidateSensors(List sensors) { if (m_SensorShapes == null) From 3008e79eb5440e440ea2e9eec76bb51c47bbe48c Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Wed, 11 Sep 2024 12:38:06 +0300 Subject: [PATCH 12/43] more xml doc fixes --- .../Runtime/Actuators/IActionReceiver.cs | 2 +- .../Runtime/Actuators/IActuator.cs | 2 +- com.unity.ml-agents/Runtime/Agent.cs | 24 +++++++++++-------- .../Communicator/CommunicatorFactory.cs | 2 ++ .../Demonstrations/DemonstrationWriter.cs | 2 +- .../Runtime/Integrations/Match3/Move.cs | 2 +- .../Runtime/Sensors/GridSensorBase.cs | 2 ++ .../Runtime/Sensors/GridSensorComponent.cs | 3 +++ .../Runtime/Sensors/ObservationWriter.cs | 8 ++++--- .../RayPerceptionSensorComponentBase.cs | 3 +++ .../Sensors/Reflection/ObservableAttribute.cs | 2 ++ 11 files changed, 35 insertions(+), 17 deletions(-) diff --git a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs index 0d8f837440..af201cacf1 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs @@ -186,7 +186,7 @@ public interface IActionReceiver /// /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions /// - /// + /// void WriteDiscreteActionMask(IDiscreteActionMask actionMask); } } diff --git a/com.unity.ml-agents/Runtime/Actuators/IActuator.cs b/com.unity.ml-agents/Runtime/Actuators/IActuator.cs index 7637d57a9f..bb408af31c 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IActuator.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IActuator.cs @@ -8,7 +8,7 @@ public interface IActuator : IActionReceiver, IHeuristicProvider /// /// The specification of the actions for this IActuator. /// - /// + /// ActionSpec ActionSpec { get; } /// diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index 1a6ff1219d..d94c2031b4 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -71,6 +71,7 @@ public void ClearActions() /// /// Copy actions. /// + /// The ActionBuffers to copy from. public void CopyActions(ActionBuffers actionBuffers) { var continuousActions = storedActions.ContinuousActions; @@ -568,7 +569,7 @@ enum DoneReason /// } /// /// - /// + /// protected virtual void OnDisable() { DemonstrationWriters.Clear(); @@ -799,8 +800,8 @@ void UpdateRewardStats() /// This should be used when the episode can no longer continue, such as when the Agent /// reaches the goal or fails at the task. /// - /// - /// + /// + /// public void EndEpisode() { EndEpisodeAndReset(DoneReason.DoneCalled); @@ -815,8 +816,8 @@ public void EndEpisode() /// This should be used when the episode could continue, but has gone on for /// a sufficient number of steps. /// - /// - /// + /// + /// public void EpisodeInterrupted() { EndEpisodeAndReset(DoneReason.MaxStepReached); @@ -948,11 +949,13 @@ public virtual void Initialize() { } /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html /// /// + /// /// The following example illustrates a `Heuristic()` function that provides WASD-style /// keyboard control for an agent that can move in two dimensions as well as jump. See /// [Input Manager] for more information about the built-in Unity input functions. /// You can also use the [Input System package], which provides a more flexible and /// configurable input system. + /// /// /// public override void Heuristic(in ActionBuffers actionsOut) /// { @@ -967,7 +970,7 @@ public virtual void Initialize() { } /// /// The which contain the continuous and /// discrete action buffers to write to. - /// + /// public virtual void Heuristic(in ActionBuffers actionsOut) { Debug.LogWarning("Heuristic method called but not implemented. Returning placeholder actions."); @@ -1243,7 +1246,7 @@ public ReadOnlyCollection GetStackedObservations() /// /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions /// - /// + /// public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// @@ -1251,6 +1254,7 @@ public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// on the provided action. /// /// + /// /// An action is passed to this function in the form of an . /// Your implementation must use the array to direct the agent's behavior for the /// current step. @@ -1276,7 +1280,7 @@ public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// When an agent uses discrete actions, the values in the ActionBuffers.DiscreteActions array /// are integers that each represent a specific, discrete action. For example, /// you could define a set of discrete actions such as: - /// + /// /// /// 0 = Do nothing /// 1 = Move one space left @@ -1318,8 +1322,8 @@ public virtual void OnActionReceived(ActionBuffers actions) { } /// Implement `OnEpisodeBegin()` to set up an Agent instance at the beginning /// of an episode. /// - /// - /// + /// + /// public virtual void OnEpisodeBegin() { } /// diff --git a/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs b/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs index 7771d26e75..712a643b44 100644 --- a/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs +++ b/com.unity.ml-agents/Runtime/Communicator/CommunicatorFactory.cs @@ -36,6 +36,8 @@ internal static ICommunicator Create() /// /// Register a function that will create an ICommunicator instance. /// + /// Creator + /// Type of communicator public static void Register(Func creator) where T : ICommunicator { s_Creator = () => creator(); diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs index d7db680eaa..952b0a800d 100644 --- a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs @@ -9,7 +9,7 @@ namespace Unity.MLAgents.Demonstrations /// /// Responsible for writing demonstration data to stream (typically a file stream). /// - /// + /// public class DemonstrationWriter { /// diff --git a/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs b/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs index a3b72ad11b..8fc1af6bb9 100644 --- a/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs +++ b/com.unity.ml-agents/Runtime/Integrations/Match3/Move.cs @@ -245,7 +245,7 @@ public bool InRangeForBoard(BoardSize boardSize) /// Get the opposite direction of this move. /// /// Oposit `Direction` of this move. - /// + /// Argument out of range public Direction OtherDirection() { switch (Direction) diff --git a/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs b/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs index 24df9ea228..05325d9207 100644 --- a/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs +++ b/com.unity.ml-agents/Runtime/Sensors/GridSensorBase.cs @@ -198,7 +198,9 @@ void GridValuesToTexture(int channelIndex, int numChannelsToAdd) /// The buffer size is configured by . /// /// + /// /// Here is an example of overriding GetObjectData to get the velocity of a potential Rigidbody: + /// /// /// protected override void GetObjectData(GameObject detectedObject, int tagIndex, float[] dataBuffer) /// { diff --git a/com.unity.ml-agents/Runtime/Sensors/GridSensorComponent.cs b/com.unity.ml-agents/Runtime/Sensors/GridSensorComponent.cs index 004a04f396..95f255ba5b 100644 --- a/com.unity.ml-agents/Runtime/Sensors/GridSensorComponent.cs +++ b/com.unity.ml-agents/Runtime/Sensors/GridSensorComponent.cs @@ -15,6 +15,9 @@ public class GridSensorComponent : SensorComponent List m_Sensors; internal IGridPerception m_GridPerception; + /// + /// Name of the generated object. + /// [HideInInspector, SerializeField] protected internal string m_SensorName = "GridSensor"; /// diff --git a/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs b/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs index c4b77f99cf..503b4d49c5 100644 --- a/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs +++ b/com.unity.ml-agents/Runtime/Sensors/ObservationWriter.cs @@ -102,6 +102,8 @@ public float this[int index] /// /// Write access at the specified channel and width. /// + /// Channels + /// Width public float this[int ch, int w] { set @@ -122,9 +124,9 @@ public float this[int index] /// /// 3D write access at the specified height, width, and channel. /// - /// - /// - /// + /// Height + /// Width + /// Channels public float this[int ch, int h, int w] { set diff --git a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs index 7c6eb2dc26..dbb93a2ea0 100644 --- a/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs +++ b/com.unity.ml-agents/Runtime/Sensors/RayPerceptionSensorComponentBase.cs @@ -148,6 +148,9 @@ public bool AlternatingRayOrder set { m_AlternatingRayOrder = value; } } + /// + /// Determines whether to use batched raycasts and the jobs system. Default = false. + /// [HideInInspector, SerializeField] [Tooltip("Enable to use batched raycasts and the jobs system.")] public bool m_UseBatchedRaycasts = false; diff --git a/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs b/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs index e476a1170f..cdfe9938cd 100644 --- a/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs +++ b/com.unity.ml-agents/Runtime/Sensors/Reflection/ObservableAttribute.cs @@ -24,8 +24,10 @@ namespace Unity.MLAgents.Sensors.Reflection /// to fields or properties. /// /// + /// /// This sample class will produce two observations, one for the m_Health field, and one /// for the HealthPercent property. + /// /// /// using Unity.MLAgents; /// using Unity.MLAgents.Sensors.Reflection; From 2ee26c17b72a86a1cb30c3cdd2c3d7b23d4f1238 Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Wed, 11 Sep 2024 12:42:19 +0300 Subject: [PATCH 13/43] Revert "Uncompress the 3DBall sample" This reverts commit d67dc941922c382046efe404446f477d41794f62. --- .../Samples/3DBall/3DBall.unitypackage | Bin 0 -> 173671 bytes ...L-Agents.meta => 3DBall.unitypackage.meta} | 3 +- .../Samples/3DBall/ML-Agents/Examples.meta | 8 - .../3DBall/ML-Agents/Examples/3DBall.meta | 8 - .../ML-Agents/Examples/3DBall/Prefabs.meta | 8 - .../Examples/3DBall/Prefabs/3DBall.prefab | 770 ----------- .../3DBall/Prefabs/3DBall.prefab.meta | 8 - .../ML-Agents/Examples/3DBall/Scenes.meta | 8 - .../Examples/3DBall/Scenes/3DBall.unity | 1135 ----------------- .../Examples/3DBall/Scenes/3DBall.unity.meta | 9 - .../ML-Agents/Examples/3DBall/Scripts.meta | 8 - .../Examples/3DBall/Scripts/Ball3DAgent.cs | 95 -- .../3DBall/Scripts/Ball3DAgent.cs.meta | 12 - .../3DBall/Scripts/Ball3DHardAgent.cs | 91 -- .../3DBall/Scripts/Ball3DHardAgent.cs.meta | 12 - .../ML-Agents/Examples/3DBall/TFModels.meta | 8 - .../Examples/3DBall/TFModels/3DBall.onnx | Bin 74869 -> 0 bytes .../Examples/3DBall/TFModels/3DBall.onnx.meta | 11 - .../ML-Agents/Examples/SharedAssets.meta | 8 - .../Examples/SharedAssets/Materials.meta | 8 - .../SharedAssets/Materials/AgentBlue.mat | 80 -- .../SharedAssets/Materials/AgentBlue.mat.meta | 8 - .../SharedAssets/Materials/Checkers_Ball.mat | 80 -- .../Materials/Checkers_Ball.mat.meta | 8 - .../Examples/SharedAssets/Materials/Eye.mat | 77 -- .../SharedAssets/Materials/Eye.mat.meta | 8 - .../SharedAssets/Materials/Headband.mat | 76 -- .../SharedAssets/Materials/Headband.mat.meta | 8 - .../SharedAssets/Materials/Textures.meta | 8 - .../Materials/Textures/CheckersGray_BC.png | Bin 160263 -> 0 bytes .../Textures/CheckersGray_BC.png.meta | 76 -- .../Materials/Textures/U_Logo_White_RGB.png | Bin 19716 -> 0 bytes .../Textures/U_Logo_White_RGB.png.meta | 108 -- .../Examples/SharedAssets/Prefabs.meta | 8 - .../Prefabs/Canvas_Watermark.prefab | 177 --- .../Prefabs/Canvas_Watermark.prefab.meta | 8 - .../Prefabs/Directional_Light.prefab | 96 -- .../Prefabs/Directional_Light.prefab.meta | 8 - .../Examples/SharedAssets/Scripts.meta | 8 - .../Scripts/AdjustTrainingTimescale.cs | 54 - .../Scripts/AdjustTrainingTimescale.cs.meta | 11 - .../Examples/SharedAssets/Scripts/Area.cs | 11 - .../SharedAssets/Scripts/Area.cs.meta | 12 - .../SharedAssets/Scripts/CameraFollow.cs | 31 - .../SharedAssets/Scripts/CameraFollow.cs.meta | 12 - .../Scripts/CollisionCallbacks.cs | 141 -- .../Scripts/CollisionCallbacks.cs.meta | 11 - .../Scripts/DirectionIndicator.cs | 37 - .../Scripts/DirectionIndicator.cs.meta | 11 - .../SharedAssets/Scripts/FlyCamera.cs | 116 -- .../SharedAssets/Scripts/FlyCamera.cs.meta | 12 - .../SharedAssets/Scripts/GroundContact.cs | 53 - .../Scripts/GroundContact.cs.meta | 11 - .../Scripts/JointDriveController.cs | 188 --- .../Scripts/JointDriveController.cs.meta | 11 - .../SharedAssets/Scripts/ModelOverrider.cs | 426 ------- .../Scripts/ModelOverrider.cs.meta | 3 - .../Examples/SharedAssets/Scripts/Monitor.cs | 563 -------- .../SharedAssets/Scripts/Monitor.cs.meta | 11 - .../Scripts/OrientationCubeController.cs | 24 - .../Scripts/OrientationCubeController.cs.meta | 11 - .../Scripts/ProjectSettingsOverrides.cs | 69 - .../Scripts/ProjectSettingsOverrides.cs.meta | 11 - .../SharedAssets/Scripts/SensorBase.cs | 59 - .../SharedAssets/Scripts/SensorBase.cs.meta | 11 - .../SharedAssets/Scripts/TargetContact.cs | 38 - .../Scripts/TargetContact.cs.meta | 11 - .../SharedAssets/Scripts/TargetController.cs | 133 -- .../Scripts/TargetController.cs.meta | 11 - 69 files changed, 1 insertion(+), 5154 deletions(-) create mode 100644 com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage rename com.unity.ml-agents/Samples/3DBall/{ML-Agents.meta => 3DBall.unitypackage.meta} (67%) delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs delete mode 100755 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs delete mode 100644 com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta diff --git a/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage b/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage new file mode 100644 index 0000000000000000000000000000000000000000..339b85f7291dbcecbb1c155d10e19c9c9f5c1891 GIT binary patch literal 173671 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 - /// Utility class to allow target placement and collision detection with an agent - /// Add this script to the target you want the agent to touch. - /// Callbacks will be triggered any time the target is touched with a collider tagged as 'tagToDetect' - /// - public class CollisionCallbacks : MonoBehaviour - { - // [System.Serializable] public class BoolEvent : UnityEvent { } - // [SerializeField] BoolEvent boolEvent = new BoolEvent(); - // public void OnBoolEvent(bool value) - // { - // Debug.Log($"OnBoolEvent {value}"); - // } - - - [Header("Collider Tag To Detect")] - public string tagToDetect = "agent"; //collider tag to detect - - // [Header("Target Placement")] - // public float spawnRadius; //The radius in which a target can be randomly spawned. - // public bool respawnIfTouched; //Should the target respawn to a different position when touched - // - // [Header("Target Fell Protection")] - // public bool respawnIfFallsOffPlatform = true; //If the target falls off the platform, reset the position. - // public float fallDistance = 5; //distance below the starting height that will trigger a respawn - // - // - // private Vector3 m_startingPos; //the starting position of the target - // private Agent m_agentTouching; //the agent currently touching the target - - [System.Serializable] - // public class TriggerEvent : UnityEvent - public class TriggerEvent : UnityEvent - { - } - - [Header("Trigger Callbacks")] - public TriggerEvent onTriggerEnterEvent = new TriggerEvent(); - public TriggerEvent onTriggerStayEvent = new TriggerEvent(); - public TriggerEvent onTriggerExitEvent = new TriggerEvent(); - - [System.Serializable] - public class CollisionEvent : UnityEvent - { - } - - [Header("Collision Callbacks")] - public CollisionEvent onCollisionEnterEvent = new CollisionEvent(); - public CollisionEvent onCollisionStayEvent = new CollisionEvent(); - public CollisionEvent onCollisionExitEvent = new CollisionEvent(); - - // // Start is called before the first frame update - // void OnEnable() - // { - // m_startingPos = transform.position; - // if (respawnIfTouched) - // { - // MoveTargetToRandomPosition(); - // } - // } - - // void Update() - // { - // if (respawnIfFallsOffPlatform) - // { - // if (transform.position.y < m_startingPos.y - fallDistance) - // { - // Debug.Log($"{transform.name} Fell Off Platform"); - // MoveTargetToRandomPosition(); - // } - // } - // } - - // /// - // /// Moves target to a random position within specified radius. - // /// - // public void MoveTargetToRandomPosition() - // { - // var newTargetPos = m_startingPos + (Random.insideUnitSphere * spawnRadius); - // newTargetPos.y = m_startingPos.y; - // transform.position = newTargetPos; - // } - - private void OnCollisionEnter(Collision col) - { - if (col.transform.CompareTag(tagToDetect)) - { - onCollisionEnterEvent.Invoke(col, transform); - // if (respawnIfTouched) - // { - // MoveTargetToRandomPosition(); - // } - } - } - - private void OnCollisionStay(Collision col) - { - if (col.transform.CompareTag(tagToDetect)) - { - onCollisionStayEvent.Invoke(col, transform); - } - } - - private void OnCollisionExit(Collision col) - { - if (col.transform.CompareTag(tagToDetect)) - { - onCollisionExitEvent.Invoke(col, transform); - } - } - - private void OnTriggerEnter(Collider col) - { - if (col.CompareTag(tagToDetect)) - { - onTriggerEnterEvent.Invoke(col); - } - } - - private void OnTriggerStay(Collider col) - { - if (col.CompareTag(tagToDetect)) - { - onTriggerStayEvent.Invoke(col); - } - } - - private void OnTriggerExit(Collider col) - { - if (col.CompareTag(tagToDetect)) - { - onTriggerExitEvent.Invoke(col); - } - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta deleted file mode 100644 index c9219d2c74..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: df05ec10e50114a9d92106879d04d89d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs deleted file mode 100644 index fe6a07f0c7..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs +++ /dev/null @@ -1,37 +0,0 @@ -using UnityEngine; - -namespace Unity.MLAgentsExamples -{ - public class DirectionIndicator : MonoBehaviour - { - - public bool updatedByAgent; //should this be updated by the agent? If not, it will use local settings - public Transform transformToFollow; //ex: hips or body - public Transform targetToLookAt; //target in the scene the indicator will point to - public float heightOffset; - private float m_StartingYPos; - - void OnEnable() - { - m_StartingYPos = transform.position.y; - } - - void Update() - { - if (updatedByAgent) - return; - transform.position = new Vector3(transformToFollow.position.x, m_StartingYPos + heightOffset, - transformToFollow.position.z); - Vector3 walkDir = targetToLookAt.position - transform.position; - walkDir.y = 0; //flatten dir on the y - transform.rotation = Quaternion.LookRotation(walkDir); - } - - //Public method to allow an agent to directly update this component - public void MatchOrientation(Transform t) - { - transform.position = new Vector3(t.position.x, m_StartingYPos + heightOffset, t.position.z); - transform.rotation = t.rotation; - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta deleted file mode 100644 index 7d3b7674ca..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/DirectionIndicator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1513f8a85fedd47efba089213b7c5bde -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs deleted file mode 100644 index 8fe3fd0cdd..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs +++ /dev/null @@ -1,116 +0,0 @@ -using UnityEngine; - -namespace Unity.MLAgentsExamples -{ - public class FlyCamera : MonoBehaviour - { - /* - wasd : basic movement - shift : Makes camera accelerate - space : Moves camera on X and Z axis only. So camera doesn't gain any height*/ - - - public float mainSpeed = 100.0f; // regular speed - public float shiftAdd = 250.0f; // multiplied by how long shift is held. Basically running - public float maxShift = 1000.0f; // Maximum speed when holdin gshift - public float camSens = 0.25f; // How sensitive it with mouse - public bool rotateOnlyIfMousedown = true; - public bool movementStaysFlat = true; - - Vector3 - m_LastMouse = - new Vector3(255, 255, - 255); // kind of in the middle of the screen, rather than at the top (play) - - float m_TotalRun = 1.0f; - - void Awake() - { - Debug.Log("FlyCamera Awake() - RESETTING CAMERA POSITION"); // nop? - // nop: - // transform.position.Set(0,8,-32); - // transform.rotation.Set(15,0,0,1); - transform.position = new Vector3(0, 8, -32); - transform.rotation = Quaternion.Euler(25, 0, 0); - } - - void Update() - { - if (Input.GetMouseButtonDown(1)) - { - m_LastMouse = Input.mousePosition; // $CTK reset when we begin - } - - if (!rotateOnlyIfMousedown || - (rotateOnlyIfMousedown && Input.GetMouseButton(1))) - { - m_LastMouse = Input.mousePosition - m_LastMouse; - m_LastMouse = new Vector3(-m_LastMouse.y * camSens, m_LastMouse.x * camSens, 0); - m_LastMouse = new Vector3(transform.eulerAngles.x + m_LastMouse.x, - transform.eulerAngles.y + m_LastMouse.y, 0); - transform.eulerAngles = m_LastMouse; - m_LastMouse = Input.mousePosition; - // Mouse camera angle done. - } - - // Keyboard commands - var p = GetBaseInput(); - if (Input.GetKey(KeyCode.LeftShift)) - { - m_TotalRun += Time.deltaTime; - p = shiftAdd * m_TotalRun * p; - p.x = Mathf.Clamp(p.x, -maxShift, maxShift); - p.y = Mathf.Clamp(p.y, -maxShift, maxShift); - p.z = Mathf.Clamp(p.z, -maxShift, maxShift); - } - else - { - m_TotalRun = Mathf.Clamp(m_TotalRun * 0.5f, 1f, 1000f); - p = p * mainSpeed; - } - - p = p * Time.deltaTime; - var newPosition = transform.position; - if (Input.GetKey(KeyCode.Space) - || (movementStaysFlat && !(rotateOnlyIfMousedown && Input.GetMouseButton(1)))) - { - // If player wants to move on X and Z axis only - transform.Translate(p); - newPosition.x = transform.position.x; - newPosition.z = transform.position.z; - transform.position = newPosition; - } - else - { - transform.Translate(p); - } - } - - Vector3 GetBaseInput() - { - // returns the basic values, if it's 0 than it's not active. - var pVelocity = new Vector3(); - if (Input.GetKey(KeyCode.W)) - { - pVelocity += new Vector3(0, 0, 1); - } - - if (Input.GetKey(KeyCode.S)) - { - pVelocity += new Vector3(0, 0, -1); - } - - if (Input.GetKey(KeyCode.A)) - { - pVelocity += new Vector3(-1, 0, 0); - } - - if (Input.GetKey(KeyCode.D)) - { - pVelocity += new Vector3(1, 0, 0); - } - - return pVelocity; - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta deleted file mode 100644 index 31dd480473..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/FlyCamera.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 83d7b886385fb48b999bc3fbc41bc181 -timeCreated: 1508627099 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs deleted file mode 100644 index 785d357981..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs +++ /dev/null @@ -1,53 +0,0 @@ -using UnityEngine; -using Unity.MLAgents; - -namespace Unity.MLAgentsExamples -{ - /// - /// This class contains logic for locomotion agents with joints which might make contact with the ground. - /// By attaching this as a component to those joints, their contact with the ground can be used as either - /// an observation for that agent, and/or a means of punishing the agent for making undesirable contact. - /// - [DisallowMultipleComponent] - public class GroundContact : MonoBehaviour - { - [HideInInspector] public Agent agent; - - [Header("Ground Check")] public bool agentDoneOnGroundContact; // Whether to reset agent on ground contact. - public bool penalizeGroundContact; // Whether to penalize on contact. - public float groundContactPenalty; // Penalty amount (ex: -1). - public bool touchingGround; - const string k_Ground = "ground"; // Tag of ground object. - - /// - /// Check for collision with ground, and optionally penalize agent. - /// - void OnCollisionEnter(Collision col) - { - if (col.transform.CompareTag(k_Ground)) - { - touchingGround = true; - if (penalizeGroundContact) - { - agent.SetReward(groundContactPenalty); - } - - if (agentDoneOnGroundContact) - { - agent.EndEpisode(); - } - } - } - - /// - /// Check for end of ground collision and reset flag appropriately. - /// - void OnCollisionExit(Collision other) - { - if (other.transform.CompareTag(k_Ground)) - { - touchingGround = false; - } - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta deleted file mode 100644 index d0857933f2..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/GroundContact.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2666e257ea992476cae0f7f163165e71 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs deleted file mode 100644 index 3a443978b5..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs +++ /dev/null @@ -1,188 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Serialization; -using Unity.MLAgents; - -namespace Unity.MLAgentsExamples -{ - /// - /// Used to store relevant information for acting and learning for each body part in agent. - /// - [System.Serializable] - public class BodyPart - { - [Header("Body Part Info")][Space(10)] public ConfigurableJoint joint; - public Rigidbody rb; - [HideInInspector] public Vector3 startingPos; - [HideInInspector] public Quaternion startingRot; - - [Header("Ground & Target Contact")] - [Space(10)] - public GroundContact groundContact; - - public TargetContact targetContact; - - [FormerlySerializedAs("thisJDController")] - [HideInInspector] public JointDriveController thisJdController; - - [Header("Current Joint Settings")] - [Space(10)] - public Vector3 currentEularJointRotation; - - [HideInInspector] public float currentStrength; - public float currentXNormalizedRot; - public float currentYNormalizedRot; - public float currentZNormalizedRot; - - [Header("Other Debug Info")] - [Space(10)] - public Vector3 currentJointForce; - - public float currentJointForceSqrMag; - public Vector3 currentJointTorque; - public float currentJointTorqueSqrMag; - public AnimationCurve jointForceCurve = new AnimationCurve(); - public AnimationCurve jointTorqueCurve = new AnimationCurve(); - - /// - /// Reset body part to initial configuration. - /// - public void Reset(BodyPart bp) - { - bp.rb.transform.position = bp.startingPos; - bp.rb.transform.rotation = bp.startingRot; - bp.rb.velocity = Vector3.zero; - bp.rb.angularVelocity = Vector3.zero; - if (bp.groundContact) - { - bp.groundContact.touchingGround = false; - } - - if (bp.targetContact) - { - bp.targetContact.touchingTarget = false; - } - } - - /// - /// Apply torque according to defined goal `x, y, z` angle and force `strength`. - /// - public void SetJointTargetRotation(float x, float y, float z) - { - x = (x + 1f) * 0.5f; - y = (y + 1f) * 0.5f; - z = (z + 1f) * 0.5f; - - var xRot = Mathf.Lerp(joint.lowAngularXLimit.limit, joint.highAngularXLimit.limit, x); - var yRot = Mathf.Lerp(-joint.angularYLimit.limit, joint.angularYLimit.limit, y); - var zRot = Mathf.Lerp(-joint.angularZLimit.limit, joint.angularZLimit.limit, z); - - currentXNormalizedRot = - Mathf.InverseLerp(joint.lowAngularXLimit.limit, joint.highAngularXLimit.limit, xRot); - currentYNormalizedRot = Mathf.InverseLerp(-joint.angularYLimit.limit, joint.angularYLimit.limit, yRot); - currentZNormalizedRot = Mathf.InverseLerp(-joint.angularZLimit.limit, joint.angularZLimit.limit, zRot); - - joint.targetRotation = Quaternion.Euler(xRot, yRot, zRot); - currentEularJointRotation = new Vector3(xRot, yRot, zRot); - } - - public void SetJointStrength(float strength) - { - var rawVal = (strength + 1f) * 0.5f * thisJdController.maxJointForceLimit; - var jd = new JointDrive - { - positionSpring = thisJdController.maxJointSpring, - positionDamper = thisJdController.jointDampen, - maximumForce = rawVal - }; - joint.slerpDrive = jd; - currentStrength = jd.maximumForce; - } - } - - public class JointDriveController : MonoBehaviour - { - [Header("Joint Drive Settings")] - [Space(10)] - public float maxJointSpring; - - public float jointDampen; - public float maxJointForceLimit; - - [HideInInspector] public Dictionary bodyPartsDict = new Dictionary(); - - [HideInInspector] public List bodyPartsList = new List(); - const float k_MaxAngularVelocity = 50.0f; - - /// - /// Create BodyPart object and add it to dictionary. - /// - public void SetupBodyPart(Transform t) - { - var bp = new BodyPart - { - rb = t.GetComponent(), - joint = t.GetComponent(), - startingPos = t.position, - startingRot = t.rotation - }; - bp.rb.maxAngularVelocity = k_MaxAngularVelocity; - - // Add & setup the ground contact script - bp.groundContact = t.GetComponent(); - if (!bp.groundContact) - { - bp.groundContact = t.gameObject.AddComponent(); - bp.groundContact.agent = gameObject.GetComponent(); - } - else - { - bp.groundContact.agent = gameObject.GetComponent(); - } - - if (bp.joint) - { - var jd = new JointDrive - { - positionSpring = maxJointSpring, - positionDamper = jointDampen, - maximumForce = maxJointForceLimit - }; - bp.joint.slerpDrive = jd; - } - - bp.thisJdController = this; - bodyPartsDict.Add(t, bp); - bodyPartsList.Add(bp); - } - - public void GetCurrentJointForces() - { - foreach (var bodyPart in bodyPartsDict.Values) - { - if (bodyPart.joint) - { - bodyPart.currentJointForce = bodyPart.joint.currentForce; - bodyPart.currentJointForceSqrMag = bodyPart.joint.currentForce.magnitude; - bodyPart.currentJointTorque = bodyPart.joint.currentTorque; - bodyPart.currentJointTorqueSqrMag = bodyPart.joint.currentTorque.magnitude; - if (Application.isEditor) - { - if (bodyPart.jointForceCurve.length > 1000) - { - bodyPart.jointForceCurve = new AnimationCurve(); - } - - if (bodyPart.jointTorqueCurve.length > 1000) - { - bodyPart.jointTorqueCurve = new AnimationCurve(); - } - - bodyPart.jointForceCurve.AddKey(Time.time, bodyPart.currentJointForceSqrMag); - bodyPart.jointTorqueCurve.AddKey(Time.time, bodyPart.currentJointTorqueSqrMag); - } - } - } - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta deleted file mode 100644 index 03c214aea1..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/JointDriveController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1b29724baddfa457da6eeab446fa49ca -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs deleted file mode 100644 index 2a69cb4fe6..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs +++ /dev/null @@ -1,426 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -using Unity.Sentis; -using System.IO; -using Unity.MLAgents; -using Unity.MLAgents.Policies; -#if UNITY_EDITOR -using UnityEditor; -#endif - -namespace Unity.MLAgentsExamples -{ - /// - /// Utility class to allow the ModelAsset file for an agent to be overriden during inference. - /// This is used internally to validate the file after training is done. - /// The behavior name to override and file path are specified on the commandline, e.g. - /// player.exe --mlagents-override-model-directory /path/to/models - /// - /// Additionally, a number of episodes to run can be specified; after this, the application will quit. - /// Note this will only work with example scenes that have 1:1 Agent:Behaviors. More complicated scenes like WallJump - /// probably won't override correctly. - /// - public class ModelOverrider : MonoBehaviour - { - HashSet k_SupportedExtensions = new HashSet { "nn", "onnx" }; - const string k_CommandLineModelOverrideDirectoryFlag = "--mlagents-override-model-directory"; - const string k_CommandLineModelOverrideExtensionFlag = "--mlagents-override-model-extension"; - const string k_CommandLineQuitAfterEpisodesFlag = "--mlagents-quit-after-episodes"; - const string k_CommandLineQuitAfterSeconds = "--mlagents-quit-after-seconds"; - const string k_CommandLineQuitOnLoadFailure = "--mlagents-quit-on-load-failure"; - - // The attached Agent - Agent m_Agent; - - // Whether or not the commandline args have already been processed. - // Used to make sure that HasOverrides doesn't spam the logs if it's called multiple times. - private bool m_HaveProcessedCommandLine; - - string m_BehaviorNameOverrideDirectory; - - private string m_OriginalBehaviorName; - - private List m_OverrideExtensions = new List(); - - // Cached loaded ModelAssets, with the behavior name as the key. - Dictionary m_CachedModels = new Dictionary(); - - // Max episodes to run. Only used if > 0 - // Will default to 1 if override models are specified, otherwise 0. - int m_MaxEpisodes; - - // Deadline - exit if the time exceeds this - DateTime m_Deadline = DateTime.MaxValue; - - int m_NumSteps; - int m_PreviousNumSteps; - int m_PreviousAgentCompletedEpisodes; - - bool m_QuitOnLoadFailure; - [Tooltip("Debug values to be used in place of the command line for overriding models.")] - public string debugCommandLineOverride; - - // Static values to keep track of completed episodes and steps across resets - // These are updated in OnDisable. - static int s_PreviousAgentCompletedEpisodes; - static int s_PreviousNumSteps; - - int TotalCompletedEpisodes - { - get { return m_PreviousAgentCompletedEpisodes + (m_Agent == null ? 0 : m_Agent.CompletedEpisodes); } - } - - int TotalNumSteps - { - get { return m_PreviousNumSteps + m_NumSteps; } - } - - public bool HasOverrides - { - get - { - GetAssetPathFromCommandLine(); - return !string.IsNullOrEmpty(m_BehaviorNameOverrideDirectory); - } - } - - /// - /// The original behavior name of the agent. The actual behavior name will change when it is overridden. - /// - public string OriginalBehaviorName - { - get - { - if (string.IsNullOrEmpty(m_OriginalBehaviorName)) - { - var bp = m_Agent.GetComponent(); - m_OriginalBehaviorName = bp.BehaviorName; - } - - return m_OriginalBehaviorName; - } - } - - public static string GetOverrideBehaviorName(string originalBehaviorName) - { - return $"Override_{originalBehaviorName}"; - } - - /// - /// Get the asset path to use from the commandline arguments. - /// Can be called multiple times - if m_HaveProcessedCommandLine is set, will have no effect. - /// - /// - void GetAssetPathFromCommandLine() - { - if (m_HaveProcessedCommandLine) - { - return; - } - - var maxEpisodes = 0; - var timeoutSeconds = 0; - - string[] commandLineArgsOverride = null; - if (!string.IsNullOrEmpty(debugCommandLineOverride) && Application.isEditor) - { - commandLineArgsOverride = debugCommandLineOverride.Split(' '); - } - - var args = commandLineArgsOverride ?? Environment.GetCommandLineArgs(); - for (var i = 0; i < args.Length; i++) - { - if (args[i] == k_CommandLineModelOverrideDirectoryFlag && i < args.Length - 1) - { - m_BehaviorNameOverrideDirectory = args[i + 1].Trim(); - } - else if (args[i] == k_CommandLineModelOverrideExtensionFlag && i < args.Length - 1) - { - var overrideExtension = args[i + 1].Trim().ToLower(); - var isKnownExtension = k_SupportedExtensions.Contains(overrideExtension); - if (!isKnownExtension) - { - Debug.LogError($"loading unsupported format: {overrideExtension}"); - Application.Quit(1); -#if UNITY_EDITOR - EditorApplication.isPlaying = false; -#endif - } - - m_OverrideExtensions.Add(overrideExtension); - } - else if (args[i] == k_CommandLineQuitAfterEpisodesFlag && i < args.Length - 1) - { - Int32.TryParse(args[i + 1], out maxEpisodes); - } - else if (args[i] == k_CommandLineQuitAfterSeconds && i < args.Length - 1) - { - Int32.TryParse(args[i + 1], out timeoutSeconds); - } - else if (args[i] == k_CommandLineQuitOnLoadFailure) - { - m_QuitOnLoadFailure = true; - } - } - - if (!string.IsNullOrEmpty(m_BehaviorNameOverrideDirectory)) - { - // If overriding models, set maxEpisodes to 1 or the command line value - m_MaxEpisodes = maxEpisodes > 0 ? maxEpisodes : 1; - Debug.Log($"setting m_MaxEpisodes to {maxEpisodes}"); - } - - if (timeoutSeconds > 0) - { - m_Deadline = DateTime.Now + TimeSpan.FromSeconds(timeoutSeconds); - Debug.Log($"setting deadline to {timeoutSeconds} from now."); - } - - m_HaveProcessedCommandLine = true; - } - - void OnEnable() - { - // Start with these initialized to previous values in the case where we're resetting scenes. - m_PreviousNumSteps = s_PreviousNumSteps; - m_PreviousAgentCompletedEpisodes = s_PreviousAgentCompletedEpisodes; - - m_Agent = GetComponent(); - - GetAssetPathFromCommandLine(); - if (HasOverrides) - { - OverrideModel(); - } - } - - void OnDisable() - { - // Update the static episode and step counts. - // For a single agent in the scene, this will be a straightforward increment. - // If there are multiple agents, we'll increment the count by the Agent that completed the most episodes. - s_PreviousAgentCompletedEpisodes = Mathf.Max(s_PreviousAgentCompletedEpisodes, TotalCompletedEpisodes); - s_PreviousNumSteps = Mathf.Max(s_PreviousNumSteps, TotalNumSteps); - } - - void FixedUpdate() - { - if (m_MaxEpisodes > 0) - { - // For Agents without maxSteps, exit as soon as we've hit the target number of episodes. - // For Agents that specify MaxStep, also make sure we've gone at least that many steps. - // Since we exit as soon as *any* Agent hits its target, the maxSteps condition keeps us running - // a bit longer in case there's an early failure. - if (TotalCompletedEpisodes >= m_MaxEpisodes && TotalNumSteps > m_MaxEpisodes * m_Agent.MaxStep) - { - Debug.Log($"ModelOverride reached {TotalCompletedEpisodes} episodes and {TotalNumSteps} steps. Exiting."); - Application.Quit(0); -#if UNITY_EDITOR - EditorApplication.isPlaying = false; -#endif - } - else if (DateTime.Now >= m_Deadline) - { - Debug.Log( - $"Deadline exceeded. " + - $"{TotalCompletedEpisodes}/{m_MaxEpisodes} episodes and " + - $"{TotalNumSteps}/{m_MaxEpisodes * m_Agent.MaxStep} steps completed. Exiting."); - Application.Quit(0); -#if UNITY_EDITOR - EditorApplication.isPlaying = false; -#endif - } - } - - m_NumSteps++; - } - - public ModelAsset GetModelForBehaviorName(string behaviorName) - { - if (m_CachedModels.ContainsKey(behaviorName)) - { - return m_CachedModels[behaviorName]; - } - - if (string.IsNullOrEmpty(m_BehaviorNameOverrideDirectory)) - { - Debug.Log($"No override directory set."); - return null; - } - - // Try the override extensions in order. If they weren't set, try .nn first, then .onnx. - var overrideExtensions = (m_OverrideExtensions.Count > 0) - ? m_OverrideExtensions.ToArray() - : new[] { "nn", "onnx" }; - - byte[] rawModel = null; - bool isOnnx = false; - string assetName = null; - foreach (var overrideExtension in overrideExtensions) - { - var assetPath = Path.Combine(m_BehaviorNameOverrideDirectory, $"{behaviorName}.{overrideExtension}"); - try - { - rawModel = File.ReadAllBytes(assetPath); - isOnnx = overrideExtension.Equals("onnx"); - assetName = "Override - " + Path.GetFileName(assetPath); - break; - } - catch (IOException) - { - // Do nothing - try the next extension, or we'll exit if nothing loaded. - } - } - - if (rawModel == null) - { - Debug.Log($"Couldn't load model file(s) for {behaviorName} in {m_BehaviorNameOverrideDirectory} (full path: {Path.GetFullPath(m_BehaviorNameOverrideDirectory)}"); - - // Cache the null so we don't repeatedly try to load a missing file - m_CachedModels[behaviorName] = null; - return null; - } - - // TODO enable this when we have a decision on supporting loading/converting an ONNX model directly into a ModelAsset - // ModelAsset asset; - // if (isOnnx) - // { - // var modelName = Path.Combine(m_BehaviorNameOverrideDirectory, $"{behaviorName}.onnx"); - // asset = LoadOnnxModel(modelName); - // } - // else - // { - // asset = LoadSentisModel(rawModel); - // } - // var asset = isOnnx ? LoadOnnxModel(rawModel) : LoadSentisModel(rawModel); - var asset = LoadSentisModel(rawModel); - asset.name = assetName; - m_CachedModels[behaviorName] = asset; - return asset; - } - - ModelAsset LoadSentisModel(byte[] rawModel) - { - var asset = ScriptableObject.CreateInstance(); - asset.modelAssetData = ScriptableObject.CreateInstance(); - asset.modelAssetData.value = rawModel; - return asset; - } - - // TODO enable this when we have a decision on supporting loading/converting an ONNX model directly into a ModelAsset - // ModelAsset LoadOnnxModel(string modelName) - // { - // Debug.Log($"Loading model for override: {modelName}"); - // var converter = new ONNXModelConverter(true); - // var directoryName = Path.GetDirectoryName(modelName); - // var model = converter.Convert(modelName, directoryName); - // var asset = ScriptableObject.CreateInstance(); - // var assetData = ScriptableObject.CreateInstance(); - // var descStream = new MemoryStream(); - // ModelWriter.SaveModelDesc(descStream, model); - // assetData.value = descStream.ToArray(); - // assetData.name = "Data"; - // assetData.hideFlags = HideFlags.HideInHierarchy; - // descStream.Close(); - // descStream.Dispose(); - // asset.modelAssetData = assetData; - // var weightStreams = new List(); - // ModelWriter.SaveModelWeights(weightStreams, model); - // - // asset.modelWeightsChunks = new ModelAssetWeightsData[weightStreams.Count]; - // for (int i = 0; i < weightStreams.Count; i++) - // { - // var stream = weightStreams[i]; - // asset.modelWeightsChunks[i] = ScriptableObject.CreateInstance(); - // asset.modelWeightsChunks[i].value = stream.ToArray(); - // asset.modelWeightsChunks[i].name = "Data"; - // asset.modelWeightsChunks[i].hideFlags = HideFlags.HideInHierarchy; - // stream.Close(); - // stream.Dispose(); - // } - // - // return asset; - // } - - // TODO this should probably be deprecated since Sentis does not support direct conversion from byte arrays - // ModelAsset LoadOnnxModel(byte[] rawModel) - // { - // var converter = new ONNXModelConverter(true); - // var onnxModel = converter.Convert(rawModel); - // - // ModelAssetData assetData = ScriptableObject.CreateInstance(); - // using (var memoryStream = new MemoryStream()) - // using (var writer = new BinaryWriter(memoryStream)) - // { - // ModelWriter.Save(writer, onnxModel); - // assetData.value = memoryStream.ToArray(); - // } - // assetData.name = "Data"; - // assetData.hideFlags = HideFlags.HideInHierarchy; - // - // var asset = ScriptableObject.CreateInstance(); - // asset.modelAssetData = assetData; - // return asset; - // } - - /// - /// Load the ModelAsset file from the specified path, and give it to the attached agent. - /// - void OverrideModel() - { - bool overrideOk = false; - string overrideError = null; - - m_Agent.LazyInitialize(); - - ModelAsset ModelAsset = null; - try - { - ModelAsset = GetModelForBehaviorName(OriginalBehaviorName); - } - catch (Exception e) - { - overrideError = $"Exception calling GetModelForBehaviorName: {e}"; - } - - if (ModelAsset == null) - { - if (string.IsNullOrEmpty(overrideError)) - { - overrideError = - $"Didn't find a model for behaviorName {OriginalBehaviorName}. Make " + - "sure the behaviorName is set correctly in the commandline " + - "and that the model file exists"; - } - } - else - { - var modelName = ModelAsset != null ? ModelAsset.name : ""; - Debug.Log($"Overriding behavior {OriginalBehaviorName} for agent with model {modelName}"); - try - { - m_Agent.SetModel(GetOverrideBehaviorName(OriginalBehaviorName), ModelAsset); - overrideOk = true; - } - catch (Exception e) - { - overrideError = $"Exception calling Agent.SetModel: {e}"; - } - } - - if (!overrideOk && m_QuitOnLoadFailure) - { - if (!string.IsNullOrEmpty(overrideError)) - { - Debug.LogWarning(overrideError); - } - - Application.Quit(1); -#if UNITY_EDITOR - EditorApplication.isPlaying = false; -#endif - } - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta deleted file mode 100644 index 91271a0617..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 3a6da8f78a394c6ab027688eab81e04d -timeCreated: 1579651041 \ No newline at end of file diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs deleted file mode 100644 index 73e7c34d23..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs +++ /dev/null @@ -1,563 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace Unity.MLAgents -{ - /// - /// Monitor is used to display information about the Agent within the Unity - /// scene. Use the log function to add information to your monitor. - /// - public class Monitor : MonoBehaviour - { - /// - /// The type of monitor the information must be displayed in. - /// corresponds to a single rectangle whose width is given - /// by a float between -1 and 1. (green is positive, red is negative) - /// - /// corresponds to n vertical sliders. - /// is a text field. - /// is a rectangle of fixed length to represent the proportions - /// of a list of floats. - /// - public enum DisplayType - { - Independent, - Proportion - } - - /// - /// Represents how high above the target the monitors will be. - /// - public static float verticalOffset = 3f; - - static bool s_IsInstantiated; - static GameObject s_Canvas; - static Dictionary> s_DisplayTransformValues; - - /// - /// Camera used to calculate GUI screen position relative to the target - /// transform. - /// - static Dictionary s_TransformCamera; - - static Color[] s_BarColors; - - struct DisplayValue - { - public float time; - public string stringValue; - public float floatValue; - public float[] floatArrayValues; - - public enum ValueType - { - Float, - FloatarrayIndependent, - FloatarrayProportion, - String - } - - public ValueType valueType; - } - - static GUIStyle s_KeyStyle; - static GUIStyle s_ValueStyle; - static GUIStyle s_GreenStyle; - static GUIStyle s_RedStyle; - static GUIStyle[] s_ColorStyle; - static bool s_Initialized; - - /// - /// Use the Monitor.Log static function to attach information to a transform. - /// - /// The log. - /// The name of the information you wish to Log. - /// The string value you want to display. - /// The transform you want to attach the information to. - /// - /// Camera used to calculate GUI position relative to - /// the target. If null, `Camera.main` will be used. - public static void Log( - string key, - string value, - Transform target = null, - Camera camera = null) - { - if (!s_IsInstantiated) - { - InstantiateCanvas(); - s_IsInstantiated = true; - } - if (s_Canvas == null) - { - return; - } - - if (target == null) - { - target = s_Canvas.transform; - } - - s_TransformCamera[target] = camera; - - if (!s_DisplayTransformValues.Keys.Contains(target)) - { - s_DisplayTransformValues[target] = - new Dictionary(); - } - - var displayValues = - s_DisplayTransformValues[target]; - - if (value == null) - { - RemoveValue(target, key); - return; - } - - if (!displayValues.ContainsKey(key)) - { - var dv = new DisplayValue(); - dv.time = Time.timeSinceLevelLoad; - dv.stringValue = value; - dv.valueType = DisplayValue.ValueType.String; - displayValues[key] = dv; - while (displayValues.Count > 20) - { - var max = ( - displayValues - .Aggregate((l, r) => l.Value.time < r.Value.time ? l : r) - .Key - ); - RemoveValue(target, max); - } - } - else - { - var dv = displayValues[key]; - dv.stringValue = value; - dv.valueType = DisplayValue.ValueType.String; - displayValues[key] = dv; - } - } - - /// - /// Use the Monitor.Log static function to attach information to a transform. - /// - /// The log. - /// The name of the information you wish to Log. - /// The float value you want to display. - /// The transform you want to attach the information to. - /// - /// Camera used to calculate GUI position relative to - /// the target. If null, `Camera.main` will be used. - public static void Log( - string key, - float value, - Transform target = null, - Camera camera = null) - { - if (!s_IsInstantiated) - { - InstantiateCanvas(); - s_IsInstantiated = true; - } - - if (target == null) - { - target = s_Canvas.transform; - } - - s_TransformCamera[target] = camera; - - if (!s_DisplayTransformValues.Keys.Contains(target)) - { - s_DisplayTransformValues[target] = new Dictionary(); - } - - var displayValues = s_DisplayTransformValues[target]; - - if (!displayValues.ContainsKey(key)) - { - var dv = new DisplayValue(); - dv.time = Time.timeSinceLevelLoad; - dv.floatValue = value; - dv.valueType = DisplayValue.ValueType.Float; - displayValues[key] = dv; - while (displayValues.Count > 20) - { - var max = ( - displayValues.Aggregate((l, r) => l.Value.time < r.Value.time ? l : r).Key); - RemoveValue(target, max); - } - } - else - { - var dv = displayValues[key]; - dv.floatValue = value; - dv.valueType = DisplayValue.ValueType.Float; - displayValues[key] = dv; - } - } - - /// - /// Use the Monitor.Log static function to attach information to a transform. - /// - /// The log. - /// The name of the information you wish to Log. - /// The array of float you want to display. - /// The type of display. - /// The transform you want to attach the information to. - /// - /// Camera used to calculate GUI position relative to - /// the target. If null, `Camera.main` will be used. - public static void Log( - string key, - float[] value, - Transform target = null, - DisplayType displayType = DisplayType.Independent, - Camera camera = null - ) - { - if (!s_IsInstantiated) - { - InstantiateCanvas(); - s_IsInstantiated = true; - } - - if (target == null) - { - target = s_Canvas.transform; - } - - s_TransformCamera[target] = camera; - - if (!s_DisplayTransformValues.Keys.Contains(target)) - { - s_DisplayTransformValues[target] = new Dictionary(); - } - - var displayValues = s_DisplayTransformValues[target]; - - if (!displayValues.ContainsKey(key)) - { - var dv = new DisplayValue(); - dv.time = Time.timeSinceLevelLoad; - dv.floatArrayValues = value; - if (displayType == DisplayType.Independent) - { - dv.valueType = DisplayValue.ValueType.FloatarrayIndependent; - } - else - { - dv.valueType = DisplayValue.ValueType.FloatarrayProportion; - } - - displayValues[key] = dv; - while (displayValues.Count > 20) - { - var max = ( - displayValues.Aggregate((l, r) => l.Value.time < r.Value.time ? l : r).Key); - RemoveValue(target, max); - } - } - else - { - var dv = displayValues[key]; - dv.floatArrayValues = value; - if (displayType == DisplayType.Independent) - { - dv.valueType = DisplayValue.ValueType.FloatarrayIndependent; - } - else - { - dv.valueType = DisplayValue.ValueType.FloatarrayProportion; - } - - displayValues[key] = dv; - } - } - - /// - /// Remove a value from a monitor. - /// - /// - /// The transform to which the information is attached. - /// - /// The key of the information you want to remove. - public static void RemoveValue(Transform target, string key) - { - if (target == null) - { - target = s_Canvas.transform; - } - - if (s_DisplayTransformValues.Keys.Contains(target)) - { - if (s_DisplayTransformValues[target].ContainsKey(key)) - { - s_DisplayTransformValues[target].Remove(key); - if (s_DisplayTransformValues[target].Keys.Count == 0) - { - s_DisplayTransformValues.Remove(target); - } - } - } - } - - /// - /// Remove all information from a monitor. - /// - /// - /// The transform to which the information is attached. - /// - public static void RemoveAllValues(Transform target) - { - if (target == null) - { - target = s_Canvas.transform; - } - - if (s_DisplayTransformValues.Keys.Contains(target)) - { - s_DisplayTransformValues.Remove(target); - } - } - - /// - /// Use SetActive to enable or disable the Monitor via script - /// - /// Value to set the Monitor's status to. - public static void SetActive(bool active) - { - if (!s_IsInstantiated) - { - InstantiateCanvas(); - s_IsInstantiated = true; - } - - if (s_Canvas != null) - { - s_Canvas.SetActive(active); - } - } - - /// Initializes the canvas. - static void InstantiateCanvas() - { - s_Canvas = GameObject.Find("AgentMonitorCanvas"); - if (s_Canvas == null) - { - s_Canvas = new GameObject(); - s_Canvas.name = "AgentMonitorCanvas"; - s_Canvas.AddComponent(); - } - - s_DisplayTransformValues = new Dictionary>(); - - s_TransformCamera = new Dictionary(); - } - - void OnGUI() - { - if (!s_Initialized) - { - Initialize(); - s_Initialized = true; - } - - var toIterate = s_DisplayTransformValues.Keys.ToList(); - foreach (var target in toIterate) - { - if (target == null) - { - s_DisplayTransformValues.Remove(target); - continue; - } - - // get camera - var cam = s_TransformCamera[target]; - if (cam == null) - { - cam = Camera.main; - } - - var widthScaler = (Screen.width / 1000f); - var keyPixelWidth = 100 * widthScaler; - var keyPixelHeight = 20 * widthScaler; - var paddingWidth = 10 * widthScaler; - - var scale = 1f; - var origin = new Vector3( - Screen.width / 2.0f - keyPixelWidth, Screen.height); - if (!(target == s_Canvas.transform)) - { - var camTransform = cam.transform; - var position = target.position; - var cam2Obj = position - camTransform.position; - scale = Mathf.Min( - 1, - 20f / (Vector3.Dot(cam2Obj, camTransform.forward))); - var worldPosition = cam.WorldToScreenPoint( - position + new Vector3(0, verticalOffset, 0)); - origin = new Vector3( - worldPosition.x - keyPixelWidth * scale, Screen.height - worldPosition.y); - } - - keyPixelWidth *= scale; - keyPixelHeight *= scale; - paddingWidth *= scale; - s_KeyStyle.fontSize = (int)(keyPixelHeight * 0.8f); - if (s_KeyStyle.fontSize < 2) - { - continue; - } - - - var displayValues = s_DisplayTransformValues[target]; - - var index = 0; - var orderedKeys = displayValues.Keys.OrderBy(x => -displayValues[x].time); - foreach (var key in orderedKeys) - { - s_KeyStyle.alignment = TextAnchor.MiddleRight; - GUI.Label( - new Rect( - origin.x, origin.y - (index + 1) * keyPixelHeight, - keyPixelWidth, keyPixelHeight), - key, - s_KeyStyle); - float[] vals; - GUIStyle s; - switch (displayValues[key].valueType) - { - case DisplayValue.ValueType.String: - s_ValueStyle.alignment = TextAnchor.MiddleLeft; - GUI.Label( - new Rect( - origin.x + paddingWidth + keyPixelWidth, - origin.y - (index + 1) * keyPixelHeight, - keyPixelWidth, keyPixelHeight), - displayValues[key].stringValue, - s_ValueStyle); - break; - case DisplayValue.ValueType.Float: - var sliderValue = displayValues[key].floatValue; - sliderValue = Mathf.Min(1f, sliderValue); - s = s_GreenStyle; - if (sliderValue < 0) - { - sliderValue = Mathf.Min(1f, -sliderValue); - s = s_RedStyle; - } - - GUI.Box( - new Rect( - origin.x + paddingWidth + keyPixelWidth, - origin.y - (index + 0.9f) * keyPixelHeight, - keyPixelWidth * sliderValue, keyPixelHeight * 0.8f), - GUIContent.none, - s); - break; - - case DisplayValue.ValueType.FloatarrayIndependent: - const float histWidth = 0.15f; - vals = displayValues[key].floatArrayValues; - for (var i = 0; i < vals.Length; i++) - { - var value = Mathf.Min(vals[i], 1); - s = s_GreenStyle; - if (value < 0) - { - value = Mathf.Min(1f, -value); - s = s_RedStyle; - } - - GUI.Box( - new Rect( - origin.x + paddingWidth + keyPixelWidth + - (keyPixelWidth * histWidth + paddingWidth / 2) * i, - origin.y - (index + 0.1f) * keyPixelHeight, - keyPixelWidth * histWidth, -keyPixelHeight * value), - GUIContent.none, - s); - } - - break; - - case DisplayValue.ValueType.FloatarrayProportion: - var valsSum = 0f; - var valsCum = 0f; - vals = displayValues[key].floatArrayValues; - foreach (var f in vals) - { - valsSum += Mathf.Max(f, 0); - } - - if (valsSum < float.Epsilon) - { - Debug.LogError( - $"The Monitor value for key {key} " + - "must be a list or array of " + - "positive values and cannot " + - "be empty."); - } - else - { - for (var i = 0; i < vals.Length; i++) - { - var value = Mathf.Max(vals[i], 0) / valsSum; - GUI.Box( - new Rect( - origin.x + paddingWidth + - keyPixelWidth + keyPixelWidth * valsCum, - origin.y - (index + 0.9f) * keyPixelHeight, - keyPixelWidth * value, keyPixelHeight * 0.8f), - GUIContent.none, - s_ColorStyle[i % s_ColorStyle.Length]); - valsCum += value; - } - } - - break; - } - - index++; - } - } - } - - /// Helper method used to initialize the GUI. Called once. - void Initialize() - { - s_KeyStyle = GUI.skin.label; - s_ValueStyle = GUI.skin.label; - s_ValueStyle.clipping = TextClipping.Overflow; - s_ValueStyle.wordWrap = false; - s_BarColors = new[] - { - Color.magenta, - Color.blue, - Color.cyan, - Color.green, - Color.yellow, - Color.red - }; - s_ColorStyle = new GUIStyle[s_BarColors.Length]; - for (var i = 0; i < s_BarColors.Length; i++) - { - var texture = new Texture2D(1, 1, TextureFormat.ARGB32, false); - texture.SetPixel(0, 0, s_BarColors[i]); - texture.Apply(); - var staticRectStyle = new GUIStyle(); - staticRectStyle.normal.background = texture; - s_ColorStyle[i] = staticRectStyle; - } - - s_GreenStyle = s_ColorStyle[3]; - s_RedStyle = s_ColorStyle[5]; - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta deleted file mode 100644 index e10bd36d98..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Monitor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eca114d0a5b45439384024291ba7d40a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs deleted file mode 100644 index b257b30215..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs +++ /dev/null @@ -1,24 +0,0 @@ -using UnityEngine; - -namespace Unity.MLAgentsExamples -{ - /// - /// Utility class to allow a stable observation platform. - /// - public class OrientationCubeController : MonoBehaviour - { - //Update position and Rotation - public void UpdateOrientation(Transform rootBP, Transform target) - { - var dirVector = target.position - transform.position; - dirVector.y = 0; //flatten dir on the y. this will only work on level, uneven surfaces - var lookRot = - dirVector == Vector3.zero - ? Quaternion.identity - : Quaternion.LookRotation(dirVector); //get our look rot to the target - - //UPDATE ORIENTATION CUBE POS & ROT - transform.SetPositionAndRotation(rootBP.position, lookRot); - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta deleted file mode 100644 index 9fb2a07fac..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/OrientationCubeController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 771e78c5e980e440e8cd19716b55075f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs deleted file mode 100644 index 9b77251e65..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs +++ /dev/null @@ -1,69 +0,0 @@ -using UnityEngine; -using Unity.MLAgents; - -namespace Unity.MLAgentsExamples -{ - /// - /// A helper class for the ML-Agents example scenes to override various - /// global settings, and restore them afterwards. - /// This can modify some Physics and time-stepping properties, so you - /// shouldn't copy it into your project unless you know what you're doing. - /// - public class ProjectSettingsOverrides : MonoBehaviour - { - // Original values - Vector3 m_OriginalGravity; - float m_OriginalFixedDeltaTime; - float m_OriginalMaximumDeltaTime; - int m_OriginalSolverIterations; - int m_OriginalSolverVelocityIterations; - bool m_OriginalReuseCollisionCallbacks; - - [Tooltip("Increase or decrease the scene gravity. Use ~3x to make things less floaty")] - public float gravityMultiplier = 1.0f; - - [Header("Advanced physics settings")] - [Tooltip("The interval in seconds at which physics and other fixed frame rate updates (like MonoBehaviour's FixedUpdate) are performed.")] - public float fixedDeltaTime = .02f; - [Tooltip("The maximum time a frame can take. Physics and other fixed frame rate updates (like MonoBehaviour's FixedUpdate) will be performed only for this duration of time per frame.")] - public float maximumDeltaTime = 1.0f / 3.0f; - [Tooltip("Determines how accurately Rigidbody joints and collision contacts are resolved. (default 6). Must be positive.")] - public int solverIterations = 6; - [Tooltip("Affects how accurately the Rigidbody joints and collision contacts are resolved. (default 1). Must be positive.")] - public int solverVelocityIterations = 1; - [Tooltip("Determines whether the garbage collector should reuse only a single instance of a Collision type for all collision callbacks. Reduces Garbage.")] - public bool reuseCollisionCallbacks = true; - - public void Awake() - { - // Save the original values - m_OriginalGravity = Physics.gravity; - m_OriginalFixedDeltaTime = Time.fixedDeltaTime; - m_OriginalMaximumDeltaTime = Time.maximumDeltaTime; - m_OriginalSolverIterations = Physics.defaultSolverIterations; - m_OriginalSolverVelocityIterations = Physics.defaultSolverVelocityIterations; - m_OriginalReuseCollisionCallbacks = Physics.reuseCollisionCallbacks; - - // Override - Physics.gravity *= gravityMultiplier; - Time.fixedDeltaTime = fixedDeltaTime; - Time.maximumDeltaTime = maximumDeltaTime; - Physics.defaultSolverIterations = solverIterations; - Physics.defaultSolverVelocityIterations = solverVelocityIterations; - Physics.reuseCollisionCallbacks = reuseCollisionCallbacks; - - // Make sure the Academy singleton is initialized first, since it will create the SideChannels. - Academy.Instance.EnvironmentParameters.RegisterCallback("gravity", f => { Physics.gravity = new Vector3(0, -f, 0); }); - } - - public void OnDestroy() - { - Physics.gravity = m_OriginalGravity; - Time.fixedDeltaTime = m_OriginalFixedDeltaTime; - Time.maximumDeltaTime = m_OriginalMaximumDeltaTime; - Physics.defaultSolverIterations = m_OriginalSolverIterations; - Physics.defaultSolverVelocityIterations = m_OriginalSolverVelocityIterations; - Physics.reuseCollisionCallbacks = m_OriginalReuseCollisionCallbacks; - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta deleted file mode 100644 index 9dbadc5b82..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/ProjectSettingsOverrides.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ec51f47c5ed0478080c449c74fd9c154 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 100 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs deleted file mode 100644 index 31bc7c8556..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Unity.MLAgents.Sensors; - -namespace Unity.MLAgentsExamples -{ - /// - /// A simple sensor that provides a number default implementations. - /// - public abstract class SensorBase : ISensor - { - /// - /// Write the observations to the output buffer. This size of the buffer will be product - /// of the Shape array values returned by . - /// - /// - public abstract void WriteObservation(float[] output); - - /// - public abstract ObservationSpec GetObservationSpec(); - - /// - public abstract string GetName(); - - /// - /// Default implementation of Write interface. This creates a temporary array, - /// calls WriteObservation, and then writes the results to the ObservationWriter. - /// - /// - /// The number of elements written. - public virtual int Write(ObservationWriter writer) - { - // TODO reuse buffer for similar agents - var numFloats = this.ObservationSize(); - float[] buffer = new float[numFloats]; - WriteObservation(buffer); - - writer.AddList(buffer); - - return numFloats; - } - - /// - public void Update() { } - - /// - public void Reset() { } - - /// - public virtual byte[] GetCompressedObservation() - { - return null; - } - - /// - public virtual CompressionSpec GetCompressionSpec() - { - return CompressionSpec.Default(); - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta deleted file mode 100644 index af6783dbf6..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/SensorBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cf19888920fa24df7ad75a52ede51cf3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs deleted file mode 100644 index fa4580f40b..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs +++ /dev/null @@ -1,38 +0,0 @@ -using UnityEngine; - -namespace Unity.MLAgentsExamples -{ - /// - /// This class contains logic for locomotion agents with joints which might make contact with a target. - /// By attaching this as a component to those joints, their contact with the ground can be used as - /// an observation for that agent. - /// - [DisallowMultipleComponent] - public class TargetContact : MonoBehaviour - { - [Header("Detect Targets")] public bool touchingTarget; - const string k_Target = "target"; // Tag on target object. - - /// - /// Check for collision with a target. - /// - void OnCollisionEnter(Collision col) - { - if (col.transform.CompareTag(k_Target)) - { - touchingTarget = true; - } - } - - /// - /// Check for end of ground collision and reset flag appropriately. - /// - void OnCollisionExit(Collision other) - { - if (other.transform.CompareTag(k_Target)) - { - touchingTarget = false; - } - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta deleted file mode 100644 index 02b1fe71b1..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetContact.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5086c435d3e8b44ffa8262a5c124661f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs deleted file mode 100644 index e2b2c62778..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs +++ /dev/null @@ -1,133 +0,0 @@ -using UnityEngine; -using Random = UnityEngine.Random; -using Unity.MLAgents; -using UnityEngine.Events; - -namespace Unity.MLAgentsExamples -{ - /// - /// Utility class to allow target placement and collision detection with an agent - /// Add this script to the target you want the agent to touch. - /// Callbacks will be triggered any time the target is touched with a collider tagged as 'tagToDetect' - /// - public class TargetController : MonoBehaviour - { - - [Header("Collider Tag To Detect")] - public string tagToDetect = "agent"; //collider tag to detect - - [Header("Target Placement")] - public float spawnRadius; //The radius in which a target can be randomly spawned. - public bool respawnIfTouched; //Should the target respawn to a different position when touched - - [Header("Target Fell Protection")] - public bool respawnIfFallsOffPlatform = true; //If the target falls off the platform, reset the position. - public float fallDistance = 5; //distance below the starting height that will trigger a respawn - - private Vector3 m_startingPos; //the starting position of the target - - [System.Serializable] - public class TriggerEvent : UnityEvent - { - } - - [Header("Trigger Callbacks")] - public TriggerEvent onTriggerEnterEvent = new TriggerEvent(); - public TriggerEvent onTriggerStayEvent = new TriggerEvent(); - public TriggerEvent onTriggerExitEvent = new TriggerEvent(); - - [System.Serializable] - public class CollisionEvent : UnityEvent - { - } - - [Header("Collision Callbacks")] - public CollisionEvent onCollisionEnterEvent = new CollisionEvent(); - public CollisionEvent onCollisionStayEvent = new CollisionEvent(); - public CollisionEvent onCollisionExitEvent = new CollisionEvent(); - - // Start is called before the first frame update - void OnEnable() - { - m_startingPos = transform.position; - if (respawnIfTouched) - { - MoveTargetToRandomPosition(); - } - } - - void Update() - { - if (respawnIfFallsOffPlatform) - { - if (transform.position.y < m_startingPos.y - fallDistance) - { - Debug.Log($"{transform.name} Fell Off Platform"); - MoveTargetToRandomPosition(); - } - } - } - - /// - /// Moves target to a random position within specified radius. - /// - public void MoveTargetToRandomPosition() - { - var newTargetPos = m_startingPos + (Random.insideUnitSphere * spawnRadius); - newTargetPos.y = m_startingPos.y; - transform.position = newTargetPos; - } - - private void OnCollisionEnter(Collision col) - { - if (col.transform.CompareTag(tagToDetect)) - { - onCollisionEnterEvent.Invoke(col); - if (respawnIfTouched) - { - MoveTargetToRandomPosition(); - } - } - } - - private void OnCollisionStay(Collision col) - { - if (col.transform.CompareTag(tagToDetect)) - { - onCollisionStayEvent.Invoke(col); - } - } - - private void OnCollisionExit(Collision col) - { - if (col.transform.CompareTag(tagToDetect)) - { - onCollisionExitEvent.Invoke(col); - } - } - - private void OnTriggerEnter(Collider col) - { - if (col.CompareTag(tagToDetect)) - { - onTriggerEnterEvent.Invoke(col); - } - } - - private void OnTriggerStay(Collider col) - { - if (col.CompareTag(tagToDetect)) - { - onTriggerStayEvent.Invoke(col); - } - } - - private void OnTriggerExit(Collider col) - { - if (col.CompareTag(tagToDetect)) - { - onTriggerExitEvent.Invoke(col); - } - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta deleted file mode 100644 index 439d4c10ea..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/TargetController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3c8f113a8b8d94967b1b1782c549be81 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 401418f86657aa8e6d36ad9620de72e71554c4a2 Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Wed, 11 Sep 2024 13:02:53 +0300 Subject: [PATCH 14/43] reformat MaxStep xml --- com.unity.ml-agents/Runtime/Agent.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index d94c2031b4..42c27d5052 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -244,6 +244,9 @@ internal struct AgentParameters /// training. If you set the max step value to a reasonable estimate of the time it should /// take to complete a task, then agents that haven’t succeeded in that time frame will /// reset and start a new training episode rather than continue to fail. + /// + /// **Note:** in general, you should limit the differences between the code you execute + /// during training and the code you run during inference. /// /// /// @@ -265,8 +268,6 @@ internal struct AgentParameters /// } /// } ///

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 N{{f?srJ(?P2ms-O|HS|R literal 0 HcmV?d00001 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents.meta b/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage.meta similarity index 67% rename from com.unity.ml-agents/Samples/3DBall/ML-Agents.meta rename to com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage.meta index 72c6cd48d9..192f96c439 100644 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents.meta +++ b/com.unity.ml-agents/Samples/3DBall/3DBall.unitypackage.meta @@ -1,6 +1,5 @@ fileFormatVersion: 2 -guid: 05ef2c5e362bc441aa586a4a29d0f3a9 -folderAsset: yes +guid: 2cbb8a3a456e1424ba7f2dccd529477a DefaultImporter: externalObjects: {} userData: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta deleted file mode 100644 index e98267bd96..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dd2eecf27a198431da97a77d847bea15 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta deleted file mode 100644 index b812a4d67e..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3c9e3c82c7c614209aef50a223212c8b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta deleted file mode 100644 index 0bb88ba983..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0c7ab37f49daa4a88a71f9cf14ad8236 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab deleted file mode 100644 index 63f15a3853..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab +++ /dev/null @@ -1,770 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1036225416237908 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4259352808153402} - - component: {fileID: 33399516572863624} - - component: {fileID: 135693586603893602} - - component: {fileID: 23610325484096200} - - component: {fileID: 54597526346971362} - m_Layer: 0 - m_Name: Ball - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4259352808153402 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1036225416237908} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 4.31, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4679453577574622} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &33399516572863624 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1036225416237908} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!135 &135693586603893602 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1036225416237908} - m_Material: {fileID: 13400000, guid: 56162663048874fd4b10e065f9cf78b7, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &23610325484096200 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1036225416237908} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: cf2a3769e6d5446698f2e3f5aab68915, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!54 &54597526346971362 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1036225416237908} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.01 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &1218265376493012 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4082575947564308} - - component: {fileID: 33986757750372936} - - component: {fileID: 23248495933290848} - m_Layer: 0 - m_Name: eye - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4082575947564308 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1218265376493012} - m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} - m_LocalPosition: {x: 0.29999995, y: 0.07399994, z: 0.50040054} - m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4294419716796784} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} ---- !u!33 &33986757750372936 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1218265376493012} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &23248495933290848 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1218265376493012} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: f731be6866ce749fd8349e67ae81f76a, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &1321468028730240 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4679453577574622} - m_Layer: 0 - m_Name: 3DBall - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4679453577574622 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1321468028730240} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 5} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4259352808153402} - - {fileID: 4780098186595842} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1424713891854676 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4780098186595842} - - component: {fileID: 65010516625723872} - - component: {fileID: 114368073295828880} - - component: {fileID: 114715123104194396} - - component: {fileID: 1306725529891448089} - - component: {fileID: 1758424554059689351} - m_Layer: 0 - m_Name: Agent - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4780098186595842 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424713891854676} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 5, y: 5, z: 5} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4294419716796784} - m_Father: {fileID: 4679453577574622} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!65 &65010516625723872 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424713891854676} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &114368073295828880 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424713891854676} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5d1c4e0b1822b495aa52bc52839ecb30, type: 3} - m_Name: - m_EditorClassIdentifier: - m_BrainParameters: - VectorObservationSize: 8 - NumStackedVectorObservations: 1 - m_ActionSpec: - m_NumContinuousActions: 2 - BranchSizes: - VectorActionSize: 02000000 - VectorActionDescriptions: [] - VectorActionSpaceType: 1 - hasUpgradedBrainParametersWithActionSpec: 1 - m_Model: {fileID: 5022602860645237092, guid: f86b312d0d1de43a1a403c15978cc438, type: 3} - m_InferenceDevice: 2 - m_BehaviorType: 0 - m_BehaviorName: 3DBall - TeamId: 0 - m_UseChildSensors: 1 - m_UseChildActuators: 1 - m_DeterministicInference: 0 - m_ObservableAttributeHandling: 0 ---- !u!114 &114715123104194396 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424713891854676} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: aaba48bf82bee4751aa7b89569e57f73, type: 3} - m_Name: - m_EditorClassIdentifier: - agentParameters: - maxStep: 0 - hasUpgradedFromAgentParameters: 1 - MaxStep: 5000 - ball: {fileID: 1036225416237908} - useVecObs: 1 ---- !u!114 &1306725529891448089 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424713891854676} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3a5c9d521e5ef4759a8246a07d52221e, type: 3} - m_Name: - m_EditorClassIdentifier: - DecisionPeriod: 5 - TakeActionsBetweenDecisions: 1 ---- !u!114 &1758424554059689351 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424713891854676} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3a6da8f78a394c6ab027688eab81e04d, type: 3} - m_Name: - m_EditorClassIdentifier: - debugCommandLineOverride: ---- !u!1 &1533320402322554 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4667923401885968} - - component: {fileID: 20793118999710892} - m_Layer: 0 - m_Name: AgentCamera - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &4667923401885968 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1533320402322554} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0.15} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4294419716796784} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!20 &20793118999710892 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1533320402322554} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.46666667, g: 0.5647059, b: 0.60784316, a: 1} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294950911 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!1 &1619100162539582 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4425897039098228} - - component: {fileID: 33259119028337980} - - component: {fileID: 23108868206887546} - m_Layer: 0 - m_Name: mouth - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4425897039098228 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1619100162539582} - m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} - m_LocalPosition: {x: 0, y: -0.18299997, z: 0.50040054} - m_LocalScale: {x: 0.27602, y: 0.042489994, z: 0.13891} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4294419716796784} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} ---- !u!33 &33259119028337980 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1619100162539582} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &23108868206887546 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1619100162539582} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: f731be6866ce749fd8349e67ae81f76a, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &1854695166504686 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4300192163442926} - - component: {fileID: 33165976320323760} - - component: {fileID: 23468552506669568} - m_Layer: 0 - m_Name: Headband - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4300192163442926 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1854695166504686} - m_LocalRotation: {x: -0, y: -0, z: 0.016506119, w: 0.9998638} - m_LocalPosition: {x: 0, y: 0.341, z: 0} - m_LocalScale: {x: 1.0441425, y: 0.19278127, z: 1.0441422} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4294419716796784} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: -179.99998, z: 1.8920001} ---- !u!33 &33165976320323760 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1854695166504686} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &23468552506669568 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1854695166504686} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 04be259c590de46f69db4cbd1da877d5, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &1859240399150782 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4294419716796784} - - component: {fileID: 33973749152356522} - - component: {fileID: 23340305563606254} - m_Layer: 0 - m_Name: AgentCube_Blue - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4294419716796784 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1859240399150782} - m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4667923401885968} - - {fileID: 4082575947564308} - - {fileID: 4144856465265480} - - {fileID: 4425897039098228} - - {fileID: 4300192163442926} - m_Father: {fileID: 4780098186595842} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} ---- !u!33 &33973749152356522 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1859240399150782} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &23340305563606254 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1859240399150782} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: c9fa44c2c3f8ce74ca39a3355ea42631, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &1999020414315134 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4144856465265480} - - component: {fileID: 33069174244444078} - - component: {fileID: 23048386147321498} - m_Layer: 0 - m_Name: eye - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4144856465265480 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1999020414315134} - m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} - m_LocalPosition: {x: -0.29999995, y: 0.07399994, z: 0.50040054} - m_LocalScale: {x: 0.29457998, y: 0.29457998, z: 0.29457998} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 4294419716796784} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} ---- !u!33 &33069174244444078 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1999020414315134} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &23048386147321498 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1999020414315134} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: f731be6866ce749fd8349e67ae81f76a, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta deleted file mode 100644 index 72aeab1bd8..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Prefabs/3DBall.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cfa81c019162c4e3caf6e2999c6fdf48 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 100100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta deleted file mode 100644 index b2d86629d1..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 46e0b55583dcc4c05bc93d785cccbba5 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity deleted file mode 100644 index 698e2134bd..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity +++ /dev/null @@ -1,1135 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44971168, g: 0.4997775, b: 0.57563686, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 1354181355} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1001 &126840690 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (7) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 12 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 18 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: -9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &255414642 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1537641056927260, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_Pivot.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3} ---- !u!1001 &502565578 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (5) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: -9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: -9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &544070511 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (6) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 11 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: -9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &667695845 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (3) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 8 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: -9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &717322969 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1 &807556622 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 807556627} - - component: {fileID: 807556626} - - component: {fileID: 807556624} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!124 &807556624 -Behaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 807556622} - m_Enabled: 1 ---- !u!20 &807556626 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 807556622} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.46666667, g: 0.5647059, b: 0.60784316, a: 1} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 35 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &807556627 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 807556622} - m_LocalRotation: {x: 0.13052616, y: 0, z: 0, w: 0.9914449} - m_LocalPosition: {x: 4.5, y: 15, z: -43.83} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 15, y: 0, z: 0} ---- !u!1001 &949996849 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (8) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 13 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &1223600457 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (9) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 14 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: -9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &1334647069 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (10) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 15 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &1345277686 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (1) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 6 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!850595691 &1354181355 -LightingSettings: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Settings.lighting - serializedVersion: 4 - m_GIWorkflowMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_RealtimeEnvironmentLighting: 1 - m_BounceScale: 1 - m_AlbedoBoost: 1 - m_IndirectOutputScale: 1 - m_UsingShadowmask: 1 - m_BakeBackend: 0 - m_LightmapMaxSize: 1024 - m_BakeResolution: 40 - m_Padding: 2 - m_LightmapCompression: 3 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAO: 0 - m_MixedBakeMode: 2 - m_LightmapsBakeMode: 1 - m_FilterMode: 1 - m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_RealtimeResolution: 2 - m_ForceWhiteAlbedo: 0 - m_ForceUpdates: 0 - m_FinalGather: 0 - m_FinalGatherRayCount: 256 - m_FinalGatherFiltering: 1 - m_PVRCulling: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_LightProbeSampleCountMultiplier: 4 - m_PVRBounces: 2 - m_PVRMinBounces: 2 - m_PVREnvironmentMIS: 0 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_PVRTiledBaking: 0 ---- !u!1001 &1442662986 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (11) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 16 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 18 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &1531193856 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (4) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: -9 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1 &1583402087 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 1408885610532680, guid: 00a1ebe742cf2394d8c21484e3a02412, - type: 2} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1583402088} - - component: {fileID: 1583402090} - m_Layer: 0 - m_Name: Ball3DSettings - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1583402088 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 4673284961943764, guid: 00a1ebe742cf2394d8c21484e3a02412, - type: 2} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1583402087} - m_LocalRotation: {x: -0.069583125, y: 0.0049145464, z: 0.0702813, w: 0.99508524} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 5, y: 0.19999993, z: 5} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1583402090 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1583402087} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ec51f47c5ed0478080c449c74fd9c154, type: 3} - m_Name: - m_EditorClassIdentifier: - gravityMultiplier: 1 - fixedDeltaTime: 0.02 - maximumDeltaTime: 0.33333334 - solverIterations: 6 - solverVelocityIterations: 1 - reuseCollisionCallbacks: 1 ---- !u!1 &1746325439 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1746325442} - - component: {fileID: 1746325441} - - component: {fileID: 1746325440} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1746325440 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1746325439} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &1746325441 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1746325439} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 5 ---- !u!4 &1746325442 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1746325439} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1773419472 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_Name - value: 3DBall (2) - objectReference: {fileID: 0} - - target: {fileID: 1321468028730240, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_RootOrder - value: 7 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.x - value: 18 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalPosition.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4679453577574622, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cfa81c019162c4e3caf6e2999c6fdf48, type: 3} ---- !u!1001 &1916479629 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalRotation.w - value: 0.8681629 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalRotation.x - value: 0.31598538 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalRotation.y - value: -0.3596048 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalRotation.z - value: 0.13088542 - objectReference: {fileID: 0} - - target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: -45 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta deleted file mode 100644 index 5a1b20b5d7..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scenes/3DBall.unity.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: b9ac0cbf961bf4dacbfa0aa9c0d60aaa -timeCreated: 1513216032 -licenseType: Pro -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta deleted file mode 100644 index 3c2c83f642..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 281ad9894bad943deaf7ec62f03bedec -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs deleted file mode 100644 index 8b16087f22..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs +++ /dev/null @@ -1,95 +0,0 @@ -using UnityEngine; -using Unity.MLAgents; -using Unity.MLAgents.Actuators; -using Unity.MLAgents.Sensors; -using Random = UnityEngine.Random; - -public class Ball3DAgent : Agent -{ - [Header("Specific to Ball3D")] - public GameObject ball; - [Tooltip("Whether to use vector observation. This option should be checked " + - "in 3DBall scene, and unchecked in Visual3DBall scene. ")] - public bool useVecObs; - Rigidbody m_BallRb; - EnvironmentParameters m_ResetParams; - - public override void Initialize() - { - m_BallRb = ball.GetComponent(); - m_ResetParams = Academy.Instance.EnvironmentParameters; - SetResetParameters(); - } - - public override void CollectObservations(VectorSensor sensor) - { - if (useVecObs) - { - sensor.AddObservation(gameObject.transform.rotation.z); - sensor.AddObservation(gameObject.transform.rotation.x); - sensor.AddObservation(ball.transform.position - gameObject.transform.position); - sensor.AddObservation(m_BallRb.velocity); - } - } - - public override void OnActionReceived(ActionBuffers actionBuffers) - { - var actionZ = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[0], -1f, 1f); - var actionX = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[1], -1f, 1f); - - if ((gameObject.transform.rotation.z < 0.25f && actionZ > 0f) || - (gameObject.transform.rotation.z > -0.25f && actionZ < 0f)) - { - gameObject.transform.Rotate(new Vector3(0, 0, 1), actionZ); - } - - if ((gameObject.transform.rotation.x < 0.25f && actionX > 0f) || - (gameObject.transform.rotation.x > -0.25f && actionX < 0f)) - { - gameObject.transform.Rotate(new Vector3(1, 0, 0), actionX); - } - if ((ball.transform.position.y - gameObject.transform.position.y) < -2f || - Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f || - Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f) - { - SetReward(-1f); - EndEpisode(); - } - else - { - SetReward(0.1f); - } - } - - public override void OnEpisodeBegin() - { - gameObject.transform.rotation = new Quaternion(0f, 0f, 0f, 0f); - gameObject.transform.Rotate(new Vector3(1, 0, 0), Random.Range(-10f, 10f)); - gameObject.transform.Rotate(new Vector3(0, 0, 1), Random.Range(-10f, 10f)); - m_BallRb.velocity = new Vector3(0f, 0f, 0f); - ball.transform.position = new Vector3(Random.Range(-1.5f, 1.5f), 4f, Random.Range(-1.5f, 1.5f)) - + gameObject.transform.position; - //Reset the parameters when the Agent is reset. - SetResetParameters(); - } - - public override void Heuristic(in ActionBuffers actionsOut) - { - var continuousActionsOut = actionsOut.ContinuousActions; - continuousActionsOut[0] = -Input.GetAxis("Horizontal"); - continuousActionsOut[1] = Input.GetAxis("Vertical"); - } - - public void SetBall() - { - //Set the attributes of the ball by fetching the information from the academy - m_BallRb.mass = m_ResetParams.GetWithDefault("mass", 1.0f); - var scale = m_ResetParams.GetWithDefault("scale", 1.0f); - ball.transform.localScale = new Vector3(scale, scale, scale); - } - - public void SetResetParameters() - { - SetBall(); - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta deleted file mode 100755 index da785c5063..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DAgent.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: aaba48bf82bee4751aa7b89569e57f73 -timeCreated: 1502223572 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs deleted file mode 100644 index ddc335316c..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs +++ /dev/null @@ -1,91 +0,0 @@ -using UnityEngine; -using Unity.MLAgents; -using Unity.MLAgents.Actuators; -using Unity.MLAgents.Sensors.Reflection; - -public class Ball3DHardAgent : Agent -{ - [Header("Specific to Ball3DHard")] - public GameObject ball; - Rigidbody m_BallRb; - EnvironmentParameters m_ResetParams; - - public override void Initialize() - { - m_BallRb = ball.GetComponent(); - m_ResetParams = Academy.Instance.EnvironmentParameters; - SetResetParameters(); - } - - [Observable(numStackedObservations: 9)] - Vector2 Rotation - { - get - { - return new Vector2(gameObject.transform.rotation.z, gameObject.transform.rotation.x); - } - } - - [Observable(numStackedObservations: 9)] - Vector3 PositionDelta - { - get - { - return ball.transform.position - gameObject.transform.position; - } - } - - public override void OnActionReceived(ActionBuffers actionBuffers) - - { - var continuousActions = actionBuffers.ContinuousActions; - var actionZ = 2f * Mathf.Clamp(continuousActions[0], -1f, 1f); - var actionX = 2f * Mathf.Clamp(continuousActions[1], -1f, 1f); - - if ((gameObject.transform.rotation.z < 0.25f && actionZ > 0f) || - (gameObject.transform.rotation.z > -0.25f && actionZ < 0f)) - { - gameObject.transform.Rotate(new Vector3(0, 0, 1), actionZ); - } - - if ((gameObject.transform.rotation.x < 0.25f && actionX > 0f) || - (gameObject.transform.rotation.x > -0.25f && actionX < 0f)) - { - gameObject.transform.Rotate(new Vector3(1, 0, 0), actionX); - } - if ((ball.transform.position.y - gameObject.transform.position.y) < -2f || - Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f || - Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f) - { - SetReward(-1f); - EndEpisode(); - } - else - { - SetReward(0.1f); - } - } - - public override void OnEpisodeBegin() - { - gameObject.transform.rotation = new Quaternion(0f, 0f, 0f, 0f); - gameObject.transform.Rotate(new Vector3(1, 0, 0), Random.Range(-10f, 10f)); - gameObject.transform.Rotate(new Vector3(0, 0, 1), Random.Range(-10f, 10f)); - m_BallRb.velocity = new Vector3(0f, 0f, 0f); - ball.transform.position = new Vector3(Random.Range(-1.5f, 1.5f), 4f, Random.Range(-1.5f, 1.5f)) - + gameObject.transform.position; - } - - public void SetBall() - { - //Set the attributes of the ball by fetching the information from the academy - m_BallRb.mass = m_ResetParams.GetWithDefault("mass", 1.0f); - var scale = m_ResetParams.GetWithDefault("scale", 1.0f); - ball.transform.localScale = new Vector3(scale, scale, scale); - } - - public void SetResetParameters() - { - SetBall(); - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta deleted file mode 100644 index 48fa44afe9..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/Scripts/Ball3DHardAgent.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: edf26e11cf4ed42eaa3ffb7b91bb4676 -timeCreated: 1517967179 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta deleted file mode 100644 index fd7da10292..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1157e6fb1823148f28a4e26a98bbbcc1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx deleted file mode 100644 index 469ca0ad20619d1c5dc3be2a2d21b2add8785cc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74869 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 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta deleted file mode 100644 index a0e2fa478c..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/3DBall/TFModels/3DBall.onnx.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f86b312d0d1de43a1a403c15978cc438 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3} - optimizeModel: 1 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta deleted file mode 100644 index e6320f726b..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8b27a66299cd240ceab55d2f44596ccc -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta deleted file mode 100644 index 8b6d9ce494..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 97ae7b93d7f6441039a84896f8d5cee1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat deleted file mode 100644 index 98afe276c8..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat +++ /dev/null @@ -1,80 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: AgentBlue - m_Shader: {fileID: 47, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0.12941177, g: 0.5882353, b: 0.9529412, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta deleted file mode 100644 index af271123ae..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/AgentBlue.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c9fa44c2c3f8ce74ca39a3355ea42631 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat deleted file mode 100644 index 2be8f242e3..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat +++ /dev/null @@ -1,80 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Checkers_Ball - m_Shader: {fileID: 47, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 2, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 2800000, guid: c922805328ab07d4396783401534201b, type: 3} - m_Scale: {x: 2, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta deleted file mode 100644 index 3111a08278..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Checkers_Ball.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cf2a3769e6d5446698f2e3f5aab68915 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat deleted file mode 100644 index 703bddeb2b..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat +++ /dev/null @@ -1,77 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Eye - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _ALPHATEST_ON _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: 2450 - stringTagMap: - RenderType: TransparentCutout - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 1 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 0 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0.058823526, g: 0.058823526, b: 0.058823526, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta deleted file mode 100644 index 9e5b564d11..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Eye.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f731be6866ce749fd8349e67ae81f76a -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat deleted file mode 100644 index 13b5854401..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat +++ /dev/null @@ -1,76 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Headband - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 1 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0.98039216, g: 0.6509804, b: 0.16078432, a: 1} - - _EmissionColor: {r: 0.98039216, g: 0.6509804, b: 0.16078432, a: 1} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta deleted file mode 100644 index 2d90b1a9f6..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Headband.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 04be259c590de46f69db4cbd1da877d5 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta deleted file mode 100644 index 4a8fca975f..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bc99450cc5b9d4f3d8d579ba6e655e2e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/CheckersGray_BC.png deleted file mode 100644 index 084b1d5806ec5b4d8f96123c16a5fd518b008552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160263 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ς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 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta deleted file mode 100644 index c339b6cd70..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Materials/Textures/U_Logo_White_RGB.png.meta +++ /dev/null @@ -1,108 +0,0 @@ -fileFormatVersion: 2 -guid: ff9a4fb150ec44c1dae2f2c249a05286 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 1 - wrapV: 1 - wrapW: 0 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 8 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 3 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta deleted file mode 100644 index d848c3a433..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f26a3490d9f744d84aae5899f2f377da -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab deleted file mode 100644 index 078274d921..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab +++ /dev/null @@ -1,177 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1508578353888260 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 224796324260922368} - - component: {fileID: 222875034646499690} - - component: {fileID: 114223610671736162} - m_Layer: 5 - m_Name: Logo - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &224796324260922368 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508578353888260} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.3300893, y: 0.3300892, z: 0.3300892} - m_Children: [] - m_Father: {fileID: 224194346362733190} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -209, y: -116} - m_SizeDelta: {x: 715.7, y: 715.69995} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &222875034646499690 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508578353888260} - m_CullTransparentMesh: 1 ---- !u!114 &114223610671736162 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508578353888260} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: ff9a4fb150ec44c1dae2f2c249a05286, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!1 &1537641056927260 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 224194346362733190} - - component: {fileID: 223703725700644330} - - component: {fileID: 114816648722094340} - - component: {fileID: 114595077744033850} - m_Layer: 5 - m_Name: Canvas_Watermark - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &224194346362733190 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1537641056927260} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 224796324260922368} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!223 &223703725700644330 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1537641056927260} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!114 &114816648722094340 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1537641056927260} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 1920, y: 1200} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0.5 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!114 &114595077744033850 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1537641056927260} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta deleted file mode 100644 index 22504d9589..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Canvas_Watermark.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3ce107b4a79bc4eef83afde434932a68 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 100100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab deleted file mode 100644 index f6cbffb608..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab +++ /dev/null @@ -1,96 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1537121661968964 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4943719350691982} - - component: {fileID: 108227806558212132} - m_Layer: 0 - m_Name: Directional_Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 4294967295 - m_IsActive: 1 ---- !u!4 &4943719350691982 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1537121661968964} - m_LocalRotation: {x: 0.31598538, y: -0.3596048, z: 0.13088542, w: 0.8681629} - m_LocalPosition: {x: 106.38621, y: 38.840767, z: 34.72934} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 40, y: -45, z: 0} ---- !u!108 &108227806558212132 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1537121661968964} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 0.99570733, b: 0.984, a: 1} - m_Intensity: 0.7 - m_Range: 27.9 - m_SpotAngle: 74.8 - m_InnerSpotAngle: 57.579865 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 0.8 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta deleted file mode 100644 index 7e04d96f74..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Prefabs/Directional_Light.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5889392e3f05b448a8a06c5def6c2dec -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 100100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta deleted file mode 100644 index 31d0dff382..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0a5d6e96a2ced43ec8739744ade8d3e8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs deleted file mode 100644 index e111353c99..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs +++ /dev/null @@ -1,54 +0,0 @@ -//This script lets you change time scale during training. It is not a required script for this demo to function - -using UnityEngine; - -namespace MLAgentsExamples -{ - public class AdjustTrainingTimescale : MonoBehaviour - { - // Update is called once per frame - void Update() - { - if (Input.GetKeyDown(KeyCode.Alpha1)) - { - Time.timeScale = 1f; - } - if (Input.GetKeyDown(KeyCode.Alpha2)) - { - Time.timeScale = 2f; - } - if (Input.GetKeyDown(KeyCode.Alpha3)) - { - Time.timeScale = 3f; - } - if (Input.GetKeyDown(KeyCode.Alpha4)) - { - Time.timeScale = 4f; - } - if (Input.GetKeyDown(KeyCode.Alpha5)) - { - Time.timeScale = 5f; - } - if (Input.GetKeyDown(KeyCode.Alpha6)) - { - Time.timeScale = 6f; - } - if (Input.GetKeyDown(KeyCode.Alpha7)) - { - Time.timeScale = 7f; - } - if (Input.GetKeyDown(KeyCode.Alpha8)) - { - Time.timeScale = 8f; - } - if (Input.GetKeyDown(KeyCode.Alpha9)) - { - Time.timeScale = 9f; - } - if (Input.GetKeyDown(KeyCode.Alpha0)) - { - Time.timeScale *= 2f; - } - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta deleted file mode 100644 index ed6469dcb4..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/AdjustTrainingTimescale.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3d6f3eab3776b4fb79724ac4216dfd7b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs deleted file mode 100644 index 65bc08acda..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs +++ /dev/null @@ -1,11 +0,0 @@ -using UnityEngine; - -namespace Unity.MLAgentsExamples -{ - public class Area : MonoBehaviour - { - public virtual void ResetArea() - { - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta deleted file mode 100644 index b08c7db438..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/Area.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: b46b66a9b32b24fab9d7ffcca24f1f43 -timeCreated: 1506809357 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs deleted file mode 100644 index d387223c67..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs +++ /dev/null @@ -1,31 +0,0 @@ -using UnityEngine; - -namespace Unity.MLAgentsExamples -{ - public class CameraFollow : MonoBehaviour - { - [Tooltip("The target to follow")] public Transform target; - - [Tooltip("The time it takes to move to the new position")] - public float smoothingTime; //The time it takes to move to the new position - - private Vector3 m_Offset; - private Vector3 m_CamVelocity; //Camera's velocity (used by SmoothDamp) - - // Use this for initialization - void Start() - { - m_Offset = gameObject.transform.position - target.position; - } - - void FixedUpdate() - { - var newPosition = new Vector3(target.position.x + m_Offset.x, transform.position.y, - target.position.z + m_Offset.z); - - gameObject.transform.position = - Vector3.SmoothDamp(transform.position, newPosition, ref m_CamVelocity, smoothingTime, Mathf.Infinity, - Time.fixedDeltaTime); - } - } -} diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta deleted file mode 100644 index cd6bf5139e..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CameraFollow.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ec40c70d5160b47cd8deaab79e24892c -timeCreated: 1508523647 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs b/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs deleted file mode 100644 index c9a26bfc8c..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs +++ /dev/null @@ -1,141 +0,0 @@ -using UnityEngine; -using UnityEngine.Events; - -namespace Unity.MLAgentsExamples -{ - ///

- /// **Note:** in general, you should limit the differences between the code you execute - /// during training and the code you run during inference. ///
[FormerlySerializedAs("maxStep")] [HideInInspector] public int MaxStep; From a1e3bc989834c1b0343fce5a3e38a0fee69d9a2a Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Wed, 11 Sep 2024 13:55:01 +0300 Subject: [PATCH 15/43] more xml doc fixes --- com.unity.ml-agents.extensions/CHANGELOG.md | 4 --- com.unity.ml-agents/Runtime/Agent.cs | 25 ++++++++++--------- .../Runtime/Communicator/ICommunicator.cs | 3 +-- .../Runtime/Sensors/RenderTextureSensor.cs | 2 +- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/com.unity.ml-agents.extensions/CHANGELOG.md b/com.unity.ml-agents.extensions/CHANGELOG.md index cdff153bbe..8c0414606f 100644 --- a/com.unity.ml-agents.extensions/CHANGELOG.md +++ b/com.unity.ml-agents.extensions/CHANGELOG.md @@ -1,6 +1,2 @@ # Changelog This changelog isn't used; please add to the `com.unity.ml-agents` changelog instead. - -## [Unreleased] -## [0.6.1-preview] - 2022-11-21 - * Initial version diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index 42c27d5052..9f27af6333 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -135,15 +135,15 @@ public override BuiltInActuatorType GetBuiltInActuatorType() /// component attached to the agent's [GameObject]. The setting /// determines how decisions are made: /// - /// * : decisions are made by the external process, - /// when connected. Otherwise, decisions are made using inference. If no inference model - /// is specified in the BehaviorParameters component, then heuristic decision - /// making is used. - /// * : decisions are always made using the trained - /// model specified in the component. - /// * : when a decision is needed, the agent's - /// function is called. Your implementation is responsible for - /// providing the appropriate action. + /// : decisions are made by the external process, + /// when connected. Otherwise, decisions are made using inference. If no inference model + /// is specified in the BehaviorParameters component, then heuristic decision + /// making is used. + /// : decisions are always made using the trained + /// model specified in the component. + /// : when a decision is needed, the agent's + /// function is called. Your implementation is responsible for + /// providing the appropriate action. /// /// To trigger an agent decision automatically, you can attach a /// component to the Agent game object. You can also call the agent's @@ -956,6 +956,8 @@ public virtual void Initialize() { } /// [Input Manager] for more information about the built-in Unity input functions. /// You can also use the [Input System package], which provides a more flexible and /// configurable input system. + /// [Input Manager]: https://docs.unity3d.com/Manual/class-InputManager.html + /// [Input System package]: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/index.html /// /// /// public override void Heuristic(in ActionBuffers actionsOut) @@ -966,8 +968,6 @@ public virtual void Initialize() { } /// continuousActionsOut[2] = Input.GetAxis("Vertical"); /// } /// - /// [Input Manager]: https://docs.unity3d.com/Manual/class-InputManager.html - /// [Input System package]: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/index.html /// /// The which contain the continuous and /// discrete action buffers to write to. @@ -1289,7 +1289,7 @@ public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// 3 = Move one space up /// 4 = Move one space down ///
- /// + /// /// When making a decision, the agent picks one of the five actions and puts the /// corresponding integer value in the ActionBuffers.DiscreteActions array. For example, if the agent /// decided to move left, the ActionBuffers.DiscreteActions parameter would be an array with @@ -1313,6 +1313,7 @@ public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// For more information about implementing agent actions see [Agents - Actions]. /// /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions + /// /// /// /// Struct containing the buffers of actions to be executed at this step. diff --git a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs index c47de92fa9..30bc323350 100644 --- a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs +++ b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs @@ -90,6 +90,7 @@ internal struct UnityRLInputParameters /// internal delegate void RLInputReceivedHandler(UnityRLInputParameters inputParams); + /// /** This is the interface of the Communicators. This does not need to be modified nor implemented to create a Unity environment. @@ -126,8 +127,6 @@ Since the messages are sent back and forth with exchange and simultaneously when UnityOutput and UnityInput can be extended to provide functionalities beyond RL UnityRLOutput and UnityRLInput can be extended to provide new RL functionalities */ - /// - /// Interface of the Communicators /// public interface ICommunicator : IDisposable { diff --git a/com.unity.ml-agents/Runtime/Sensors/RenderTextureSensor.cs b/com.unity.ml-agents/Runtime/Sensors/RenderTextureSensor.cs index 2d54d179e3..0980179aa2 100644 --- a/com.unity.ml-agents/Runtime/Sensors/RenderTextureSensor.cs +++ b/com.unity.ml-agents/Runtime/Sensors/RenderTextureSensor.cs @@ -33,7 +33,7 @@ public SensorCompressionType CompressionType /// Whether to convert it to grayscale or not. /// Name of the sensor. /// Compression method for the render texture. - /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html + // [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html public RenderTextureSensor( RenderTexture renderTexture, bool grayscale, string name, SensorCompressionType compressionType) { From 5a7535e81ad11f076a4cbd0765346039e2345aa0 Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Wed, 11 Sep 2024 14:40:34 +0300 Subject: [PATCH 16/43] fix more xml doc issues --- com.unity.ml-agents.extensions/CHANGELOG.md | 4 ++++ com.unity.ml-agents/CHANGELOG.md | 2 +- com.unity.ml-agents/Runtime/Agent.cs | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/com.unity.ml-agents.extensions/CHANGELOG.md b/com.unity.ml-agents.extensions/CHANGELOG.md index 8c0414606f..cdff153bbe 100644 --- a/com.unity.ml-agents.extensions/CHANGELOG.md +++ b/com.unity.ml-agents.extensions/CHANGELOG.md @@ -1,2 +1,6 @@ # Changelog This changelog isn't used; please add to the `com.unity.ml-agents` changelog instead. + +## [Unreleased] +## [0.6.1-preview] - 2022-11-21 + * Initial version diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index 9bc677baeb..c1c9c1342c 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -953,4 +953,4 @@ vector observations to be used simultaneously. (#3981) Thank you @shakenes ! ### This is the first release of _Unity Package ML-Agents_. -_Short description of this release_ + - Initial release. diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index 9f27af6333..06daad4805 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -253,7 +253,7 @@ internal struct AgentParameters /// To use a step limit when training while allowing agents to run without resetting /// outside of training, you can set the max step to 0 in /// if the is not connected to an external process. - /// + /// /// /// using Unity.MLAgents; /// From 430a1b278e8d7f0d66dba4326b7e15240a90abe1 Mon Sep 17 00:00:00 2001 From: Aurimas Petrovas <> Date: Wed, 11 Sep 2024 15:15:33 +0300 Subject: [PATCH 17/43] fix summary tag --- .../Runtime/Communicator/ICommunicator.cs | 71 +++++++++---------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs index 30bc323350..c39281990d 100644 --- a/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs +++ b/com.unity.ml-agents/Runtime/Communicator/ICommunicator.cs @@ -91,42 +91,41 @@ internal struct UnityRLInputParameters internal delegate void RLInputReceivedHandler(UnityRLInputParameters inputParams); /// - /** - This is the interface of the Communicators. - This does not need to be modified nor implemented to create a Unity environment. - - When the Unity Communicator is initialized, it will wait for the External Communicator - to be initialized as well. The two communicators will then exchange their first messages - that will usually contain information for initialization (information that does not need - to be resent at each new exchange). - - By convention a Unity input is from External to Unity and a Unity output is from Unity to - External. Inputs and outputs are relative to Unity. - - By convention, when the Unity Communicator and External Communicator call exchange, the - exchange is NOT simultaneous but sequential. This means that when a side of the - communication calls exchange, the other will receive the result of its previous - exchange call. - This is what happens when A calls exchange a single time: - A sends data_1 to B -> B receives data_1 -> B generates and sends data_2 -> A receives data_2 - When A calls exchange, it sends data_1 and receives data_2 - - Since the messages are sent back and forth with exchange and simultaneously when calling - initialize, External sends two messages at initialization. - - The structure of the messages is as follows: - UnityMessage - ...Header - ...UnityOutput - ......UnityRLOutput - ......UnityRLInitializationOutput - ...UnityInput - ......UnityRLInput - ......UnityRLInitializationInput - - UnityOutput and UnityInput can be extended to provide functionalities beyond RL - UnityRLOutput and UnityRLInput can be extended to provide new RL functionalities - */ + /// This is the interface of the Communicators. + /// This does not need to be modified nor implemented to create a Unity environment. + /// + /// When the Unity Communicator is initialized, it will wait for the External Communicator + /// to be initialized as well. The two communicators will then exchange their first messages + /// that will usually contain information for initialization (information that does not need + /// to be resent at each new exchange). + /// + /// By convention a Unity input is from External to Unity and a Unity output is from Unity to + /// External. Inputs and outputs are relative to Unity. + /// + /// By convention, when the Unity Communicator and External Communicator call exchange, the + /// exchange is NOT simultaneous but sequential. This means that when a side of the + /// communication calls exchange, the other will receive the result of its previous + /// xchange call. + /// This is what happens when A calls exchange a single time: + /// A sends data_1 to B -> B receives data_1 -> B generates and sends data_2 -> A receives data_2 + /// When A calls exchange, it sends data_1 and receives data_2 + /// + /// Since the messages are sent back and forth with exchange and simultaneously when calling + /// initialize, External sends two messages at initialization. + /// + /// The structure of the messages is as follows: + /// UnityMessage + /// ...Header + /// ...UnityOutput + /// ......UnityRLOutput + /// ......UnityRLInitializationOutput + /// ...UnityInput + /// ......UnityRLInput + /// ......UnityRLInitializationInput + /// + /// UnityOutput and UnityInput can be extended to provide functionalities beyond RL + /// UnityRLOutput and UnityRLInput can be extended to provide new RL functionalities + /// /// public interface ICommunicator : IDisposable { From 8fd8460f835a0753ef38a1c56b967dad6b1d98c8 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 11:29:15 -0400 Subject: [PATCH 18/43] Updated changelog for missing PRs. --- com.unity.ml-agents/CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index c1c9c1342c..1317705cc5 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to ### Major Changes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) +- Upgraded to Sentis 2.0.0 (#6137) - Upgraded to Sentis 1.3.0-pre.3 (#6070) - Upgraded to Sentis 1.3.0-exp.2 (#6013) - The minimum supported Unity version was updated to 2023.2. (#6071) @@ -22,13 +23,20 @@ and this project adheres to - Added no-graphics-monitor. (#6014) #### ml-agents / ml-agents-envs +- Update Installation.md (#6004) +- Updated Using-Virtual-Environment.md (#6033) ### Bug Fixes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) +- Fix failing ci post upgrade (#6141) +- Fixed missing assembly reference for google protobuf. (#6099) - Fixed missing tensor Dispose in ModelRunner. (#6028) - Fixed 3DBall sample package to remove Barracuda dependency. (#6030) #### ml-agents / ml-agents-envs +- Fix sample code indentation in migrating.md (#5840) +- Fixed continuous integration tests (#6079) +- Fixed bad like format (#6078) - Bumped numpy version to >=1.23.5,<1.24.0 (#6082) - Bumped onnx version to 1.15.0 (#6062) - Bumped protobuf version to >=3.6,<21 (#6062) From 799f8f0edce2b90c6b843cd9ff417139ac231a5a Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 11:34:09 -0400 Subject: [PATCH 19/43] Removed tabs from .tests.json. --- com.unity.ml-agents/Tests/.tests.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.ml-agents/Tests/.tests.json b/com.unity.ml-agents/Tests/.tests.json index 327abb29e5..3139c12353 100755 --- a/com.unity.ml-agents/Tests/.tests.json +++ b/com.unity.ml-agents/Tests/.tests.json @@ -1,3 +1,3 @@ { - "createSeparatePackage": false + "createSeparatePackage": false } From 47da469643f02d104a10a59f3a4cec8c0b6eb5bb Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 11:54:48 -0400 Subject: [PATCH 20/43] Updated changelog. --- com.unity.ml-agents/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index 1317705cc5..df5c17d064 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -7,7 +7,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [3.0.0] - 2024-09-02 - ### Major Changes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) - Upgraded to Sentis 2.0.0 (#6137) From b658a48c93bca39634c45bbd7d44d82fbc1417cc Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 12:02:36 -0400 Subject: [PATCH 21/43] Removed tabs from CHANGELOG. --- com.unity.ml-agents/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index df5c17d064..4bedc93981 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -86,7 +86,7 @@ versioned under `ml-agents-envs` package in the future (#) ### Minor Changes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) - Added switch to RayPerceptionSensor to allow rays to be ordered left to right. (#26) - - Current alternating order is still the default but will be deprecated. + - Current alternating order is still the default but will be deprecated. - Added support for enabling/disabling camera object attached to camera sensor in order to improve performance. (#31) #### ml-agents / ml-agents-envs From 038e99bad60ded0df3feb8419743a7f3b5f37c3c Mon Sep 17 00:00:00 2001 From: "Miguel Alonso Jr." <76960110+miguelalonsojr@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:06:55 -0400 Subject: [PATCH 22/43] Fix failing ci post upgrade (#6141) (#6145) * Update PerformancProject and DevProject. * Removed mac perf tests. --- .yamato/com.unity.ml-agents-performance.yml | 59 ++++----- DevProject/Packages/packages-lock.json | 20 ++- .../ProjectSettings/EditorBuildSettings.asset | 3 +- .../ProjectSettings/MemorySettings.asset | 35 +++++ .../ProjectSettings/MultiplayerManager.asset | 7 + .../PackageManagerSettings.asset | 37 ++++++ .../SceneTemplateSettings.json | 121 ++++++++++++++++++ DevProject/ProjectSettings/TimeManager.asset | 6 +- .../VersionControlSettings.asset | 9 ++ PerformanceProject/Packages/manifest.json | 11 +- .../Packages/packages-lock.json | 106 +++++++++++---- .../ProjectSettings/MultiplayerManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 46 ++++--- .../ProjectSettings/ProjectVersion.txt | 4 +- 14 files changed, 389 insertions(+), 82 deletions(-) create mode 100644 DevProject/ProjectSettings/MemorySettings.asset create mode 100644 DevProject/ProjectSettings/MultiplayerManager.asset create mode 100644 DevProject/ProjectSettings/PackageManagerSettings.asset create mode 100644 DevProject/ProjectSettings/SceneTemplateSettings.json create mode 100644 DevProject/ProjectSettings/VersionControlSettings.asset create mode 100644 PerformanceProject/ProjectSettings/MultiplayerManager.asset diff --git a/.yamato/com.unity.ml-agents-performance.yml b/.yamato/com.unity.ml-agents-performance.yml index f1a2f6c231..ea88b2713a 100644 --- a/.yamato/com.unity.ml-agents-performance.yml +++ b/.yamato/com.unity.ml-agents-performance.yml @@ -1,29 +1,30 @@ -test_editors: - - version: 2023.2 ---- -{% for editor in test_editors %} -Run_Mac_Perfomance_Tests{{ editor.version }}: - name: Run Mac Performance Tests {{ editor.version }} - agent: - type: Unity::VM::osx - image: package-ci/macos-13:v4 - flavor: b1.large - variables: - UNITY_VERSION: {{ editor.version }} - commands: - - python3 -m pip install unity-downloader-cli --index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple --upgrade - - unity-downloader-cli -u {{ editor.version }} -c editor --wait --fast - - curl -s https://artifactory.prd.it.unity3d.com/artifactory/unity-tools-local/utr-standalone/utr --output utr - - chmod +x ./utr - - ./utr --suite=editor --platform=StandaloneOSX --editor-location=.Editor --testproject=PerformanceProject --artifacts_path=build/test-results --report-performance-data --performance-project-id=com.unity.ml-agents --zero-tests-are-ok=1 - triggers: - cancel_old_ci: true - recurring: - - branch: develop - frequency: daily - artifacts: - logs: - paths: - - "build/test-results/**" - - "*.log" -{% endfor %} +#disabling mac perf tests until utr issue is resolved. +#test_editors: +# - version: 2023.2 +#--- +#{% for editor in test_editors %} +#Run_Mac_Perfomance_Tests{{ editor.version }}: +# name: Run Mac Performance Tests {{ editor.version }} +# agent: +# type: Unity::VM::osx +# image: package-ci/macos-13:v4 +# flavor: b1.large +# variables: +# UNITY_VERSION: {{ editor.version }} +# commands: +# - python3 -m pip install unity-downloader-cli --index-url https://artifactory.prd.it.unity3d.com/artifactory/api/pypi/pypi/simple --upgrade +# - unity-downloader-cli -u {{ editor.version }} -c editor --wait --fast +# - curl -s https://artifactory.prd.it.unity3d.com/artifactory/unity-tools-local/utr-standalone/utr --output utr +# - chmod +x ./utr +# - ./utr --suite=editor --platform=StandaloneOSX --editor-location=.Editor --testproject=PerformanceProject --artifacts_path=build/test-results --report-performance-data --performance-project-id=com.unity.ml-agents --zero-tests-are-ok=1 +# triggers: +# cancel_old_ci: true +# recurring: +# - branch: develop +# frequency: daily +# artifacts: +# logs: +# paths: +# - "build/test-results/**" +# - "*.log" +#{% endfor %} diff --git a/DevProject/Packages/packages-lock.json b/DevProject/Packages/packages-lock.json index b727fc78e6..65747ed276 100644 --- a/DevProject/Packages/packages-lock.json +++ b/DevProject/Packages/packages-lock.json @@ -28,6 +28,18 @@ }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, + "com.unity.collections": { + "version": "2.2.1", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.8.8", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.nuget.mono-cecil": "1.11.4", + "com.unity.test-framework.performance": "3.0.2" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, "com.unity.ext.nunit": { "version": "2.0.5", "depth": 1, @@ -56,7 +68,7 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.sentis": "1.3.0-pre.3", + "com.unity.sentis": "2.0.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" @@ -106,12 +118,12 @@ "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.sentis": { - "version": "1.3.0-pre.3", + "version": "2.0.0", "depth": 1, "source": "registry", "dependencies": { - "com.unity.burst": "1.8.10", - "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.burst": "1.8.12", + "com.unity.collections": "2.2.1", "com.unity.modules.imageconversion": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" diff --git a/DevProject/ProjectSettings/EditorBuildSettings.asset b/DevProject/ProjectSettings/EditorBuildSettings.asset index 3a360cd788..630ce117a9 100644 --- a/DevProject/ProjectSettings/EditorBuildSettings.asset +++ b/DevProject/ProjectSettings/EditorBuildSettings.asset @@ -9,5 +9,6 @@ EditorBuildSettings: path: Assets/ML-Agents/Scripts/Tests/Runtime/AcademyTest/AcademyStepperTestScene.unity guid: 9bafc50b1e55b43b2b1ae9620f1f8311 m_configObjects: - com.unity.ml-agents.settings: {fileID: 11400000, guid: 87b8aebb5aefd4643821361876570855, + com.unity.ml-agents.settings: {fileID: 11400000, guid: 8c1549da419d94fa285f5b29eab859e9, type: 2} + m_UseUCBPForAssetBundles: 0 diff --git a/DevProject/ProjectSettings/MemorySettings.asset b/DevProject/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000000..5b5facecac --- /dev/null +++ b/DevProject/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/DevProject/ProjectSettings/MultiplayerManager.asset b/DevProject/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 0000000000..8073753a09 --- /dev/null +++ b/DevProject/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_ActiveMultiplayerRole: 0 diff --git a/DevProject/ProjectSettings/PackageManagerSettings.asset b/DevProject/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000000..d7ed48926f --- /dev/null +++ b/DevProject/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + oneTimeDeprecatedPopUpShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 0 + m_ConfigSource: 0 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -874 + m_OriginalInstanceId: -876 + m_LoadAssets: 0 diff --git a/DevProject/ProjectSettings/SceneTemplateSettings.json b/DevProject/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000000..5e97f8393e --- /dev/null +++ b/DevProject/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,121 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "defaultInstantiationMode": 0 + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/DevProject/ProjectSettings/TimeManager.asset b/DevProject/ProjectSettings/TimeManager.asset index 558a017e1f..8f68da289f 100644 --- a/DevProject/ProjectSettings/TimeManager.asset +++ b/DevProject/ProjectSettings/TimeManager.asset @@ -3,7 +3,11 @@ --- !u!5 &1 TimeManager: m_ObjectHideFlags: 0 - Fixed Timestep: 0.02 + Fixed Timestep: + m_Count: 2822399 + m_Rate: + m_Denominator: 1 + m_Numerator: 141120000 Maximum Allowed Timestep: 0.33333334 m_TimeScale: 1 Maximum Particle Timestep: 0.03 diff --git a/DevProject/ProjectSettings/VersionControlSettings.asset b/DevProject/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000000..246bcd47a2 --- /dev/null +++ b/DevProject/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 + m_TrackPackagesOutsideProject: 0 diff --git a/PerformanceProject/Packages/manifest.json b/PerformanceProject/Packages/manifest.json index e6ab26f26d..024a5393e7 100644 --- a/PerformanceProject/Packages/manifest.json +++ b/PerformanceProject/Packages/manifest.json @@ -1,11 +1,14 @@ { + "registry": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", "dependencies": { - "com.unity.collab-proxy": "2.2.0", - "com.unity.feature.development": "1.0.1", + "com.unity.collab-proxy": "2.3.1", + "com.unity.feature.development": "1.0.2", "com.unity.ml-agents": "file:../../com.unity.ml-agents", + "com.unity.test-framework.build": "0.0.1-preview.15", "com.unity.test-framework.performance": "3.0.3", - "com.unity.timeline": "1.7.6", - "com.unity.ugui": "1.0.0", + "com.unity.test-framework.utp-reporter": "1.1.0-preview", + "com.unity.timeline": "1.8.6", + "com.unity.ugui": "2.0.0", "com.unity.visualscripting": "1.9.1", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/PerformanceProject/Packages/packages-lock.json b/PerformanceProject/Packages/packages-lock.json index 4706ddf27b..ec54f0ec49 100644 --- a/PerformanceProject/Packages/packages-lock.json +++ b/PerformanceProject/Packages/packages-lock.json @@ -1,43 +1,64 @@ { "dependencies": { "com.unity.burst": { - "version": "1.8.12", + "version": "1.8.13", "depth": 2, "source": "registry", "dependencies": { "com.unity.mathematics": "1.2.1", "com.unity.modules.jsonserialize": "1.0.0" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.collab-proxy": { - "version": "2.2.0", + "version": "2.3.1", "depth": 0, "source": "registry", "dependencies": {}, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.collections": { + "version": "2.2.1", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.8.8", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.nuget.mono-cecil": "1.11.4", + "com.unity.test-framework.performance": "3.0.2" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.editorcoroutines": { "version": "1.0.0", "depth": 1, "source": "registry", "dependencies": {}, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.ext.nunit": { "version": "2.0.5", "depth": 2, "source": "registry", "dependencies": {}, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.external.test-protocol": { + "version": "1.0.1-preview", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "2.0.0-preview" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.feature.development": { - "version": "1.0.1", + "version": "1.0.2", "depth": 0, "source": "builtin", "dependencies": { "com.unity.ide.visualstudio": "2.0.22", - "com.unity.ide.rider": "3.0.27", + "com.unity.ide.rider": "3.0.28", "com.unity.editorcoroutines": "1.0.0", "com.unity.performance.profile-analyzer": "1.2.2", "com.unity.test-framework": "1.3.9", @@ -45,13 +66,13 @@ } }, "com.unity.ide.rider": { - "version": "3.0.27", + "version": "3.0.28", "depth": 1, "source": "registry", "dependencies": { "com.unity.ext.nunit": "1.0.6" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.ide.visualstudio": { "version": "2.0.22", @@ -60,50 +81,64 @@ "dependencies": { "com.unity.test-framework": "1.1.9" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.mathematics": { "version": "1.2.6", "depth": 3, "source": "registry", "dependencies": {}, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.ml-agents": { "version": "file:../../com.unity.ml-agents", "depth": 0, "source": "local", "dependencies": { - "com.unity.sentis": "1.3.0-pre.3", + "com.unity.sentis": "2.0.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" } }, + "com.unity.nuget.mono-cecil": { + "version": "1.11.4", + "depth": 3, + "source": "registry", + "dependencies": {}, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.nuget.newtonsoft-json": { + "version": "3.2.1", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, "com.unity.performance.profile-analyzer": { "version": "1.2.2", "depth": 1, "source": "registry", "dependencies": {}, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.sentis": { - "version": "1.3.0-pre.3", + "version": "2.0.0", "depth": 1, "source": "registry", "dependencies": { - "com.unity.burst": "1.8.10", - "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.burst": "1.8.12", + "com.unity.collections": "2.2.1", "com.unity.modules.imageconversion": "1.0.0" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.settings-manager": { "version": "2.0.1", "depth": 2, "source": "registry", "dependencies": {}, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.test-framework": { "version": "1.3.9", @@ -114,7 +149,16 @@ "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.test-framework.build": { + "version": "0.0.1-preview.15", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.0.17" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.test-framework.performance": { "version": "3.0.3", @@ -124,7 +168,17 @@ "com.unity.test-framework": "1.1.31", "com.unity.modules.jsonserialize": "1.0.0" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.test-framework.utp-reporter": { + "version": "1.1.0-preview", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.1", + "com.unity.external.test-protocol": "1.0.1-preview" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.testtools.codecoverage": { "version": "1.2.5", @@ -134,10 +188,10 @@ "com.unity.test-framework": "1.0.16", "com.unity.settings-manager": "1.0.1" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.timeline": { - "version": "1.7.6", + "version": "1.8.6", "depth": 0, "source": "registry", "dependencies": { @@ -146,10 +200,10 @@ "com.unity.modules.audio": "1.0.0", "com.unity.modules.particlesystem": "1.0.0" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.ugui": { - "version": "1.0.0", + "version": "2.0.0", "depth": 0, "source": "builtin", "dependencies": { @@ -165,7 +219,7 @@ "com.unity.ugui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.modules.ai": { "version": "1.0.0", diff --git a/PerformanceProject/ProjectSettings/MultiplayerManager.asset b/PerformanceProject/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 0000000000..8073753a09 --- /dev/null +++ b/PerformanceProject/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_ActiveMultiplayerRole: 0 diff --git a/PerformanceProject/ProjectSettings/ProjectSettings.asset b/PerformanceProject/ProjectSettings/ProjectSettings.asset index dd9e484300..8778f5d7df 100644 --- a/PerformanceProject/ProjectSettings/ProjectSettings.asset +++ b/PerformanceProject/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 26 + serializedVersion: 27 productGUID: bf6e31550f6b04b9b8b1948cae2e1acc AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -76,6 +76,8 @@ PlayerSettings: androidMinimumWindowWidth: 400 androidMinimumWindowHeight: 300 androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 + androidApplicationEntry: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 1 @@ -95,6 +97,7 @@ PlayerSettings: useMacAppStoreValidation: 0 macAppStoreCategory: public.app-category.games gpuSkinning: 1 + meshDeformation: 2 xboxPIXTextureCapture: 0 xboxEnableAvatar: 0 xboxEnableKinect: 0 @@ -126,10 +129,8 @@ PlayerSettings: switchAllowGpuScratchShrinking: 0 switchNVNMaxPublicTextureIDCount: 0 switchNVNMaxPublicSamplerIDCount: 0 - switchNVNGraphicsFirmwareMemory: 32 switchMaxWorkerMultiple: 8 - stadiaPresentMode: 0 - stadiaTargetFramerate: 0 + switchNVNGraphicsFirmwareMemory: 32 vulkanNumSwapchainBuffers: 3 vulkanEnableSetSRGBWrite: 0 vulkanEnablePreTransform: 1 @@ -157,15 +158,17 @@ PlayerSettings: resetResolutionOnWindowResize: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 + androidMinAspectRatio: 1 applicationIdentifier: {} buildNumber: + Bratwurst: 0 Standalone: 0 VisionOS: 0 iPhone: 0 tvOS: 0 overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 22 + AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 aotOptions: @@ -175,18 +178,18 @@ PlayerSettings: ForceInternetPermission: 0 ForceSDCardPermission: 0 CreateWallpaper: 0 - APKExpansionFiles: 0 + androidSplitApplicationBinary: 0 keepLoadedShadersAlive: 0 StripUnusedMeshComponents: 1 strictShaderVariantMatching: 0 VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: 12.0 + iOSTargetOSVersionString: 13.0 tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 12.0 - VisionOSSdkVersion: 0 - VisionOSTargetOSVersionString: 1.0 + tvOSTargetOSVersionString: 13.0 + bratwurstSdkVersion: 0 + bratwurstTargetOSVersionString: 13.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -234,10 +237,10 @@ PlayerSettings: appleDeveloperTeamID: iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + bratwurstManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 - VisionOSManualSigningProvisioningProfileType: 0 + bratwurstManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 @@ -261,6 +264,7 @@ PlayerSettings: AndroidKeystoreName: AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 + AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 @@ -278,6 +282,7 @@ PlayerSettings: AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 AndroidAppBundleSizeToValidate: 150 + AndroidReportGooglePlayAppDependencies: 1 m_BuildTargetIcons: [] m_BuildTargetPlatformIcons: [] m_BuildTargetBatching: @@ -382,8 +387,9 @@ PlayerSettings: - m_BuildTarget: tvOS m_Encoding: 1 m_BuildTargetDefaultTextureCompressionFormat: - - m_BuildTarget: Android - m_Format: 3 + - serializedVersion: 2 + m_BuildTarget: Android + m_Formats: 03000000 playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 @@ -532,6 +538,7 @@ PlayerSettings: switchSocketBufferEfficiency: 4 switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 + switchDisableHTCSPlayerConnection: 0 switchUseNewStyleFilepaths: 1 switchUseLegacyFmodPriorities: 0 switchUseMicroSleepForYield: 1 @@ -640,13 +647,18 @@ PlayerSettings: webGLMemoryLinearGrowthStep: 16 webGLMemoryGeometricGrowthStep: 0.2 webGLMemoryGeometricGrowthCap: 96 + webGLEnableWebGPU: 0 webGLPowerPreference: 2 + webGLWebAssemblyTable: 0 + webGLWebAssemblyBigInt: 0 + webGLCloseOnQuit: 0 scriptingDefineSymbols: {} additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} il2cppCompilerConfiguration: {} il2cppCodeGeneration: {} + il2cppStacktraceInformation: {} managedStrippingLevel: EmbeddedLinux: 1 GameCoreScarlett: 1 @@ -671,6 +683,7 @@ PlayerSettings: gcIncremental: 1 gcWBarrierValidation: 0 apiCompatibilityLevelPerPlatform: {} + editorAssembliesCompatibilityLevel: 1 m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: PerformanceProject @@ -694,6 +707,7 @@ PlayerSettings: metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} metroSplashScreenUseBackgroundColor: 0 + syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} metroFTAName: @@ -744,9 +758,11 @@ PlayerSettings: hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiLogStartupTiming: 0 hmiCpuConfiguration: + hmiLogStartupTiming: 0 + qnxGraphicConfPath: apiCompatibilityLevel: 6 + captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 cloudProjectId: diff --git a/PerformanceProject/ProjectSettings/ProjectVersion.txt b/PerformanceProject/ProjectSettings/ProjectVersion.txt index 2d4bcb4f1c..2ffa4518e7 100644 --- a/PerformanceProject/ProjectSettings/ProjectVersion.txt +++ b/PerformanceProject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2023.2.12f1 -m_EditorVersionWithRevision: 2023.2.12f1 (19eeb3b320af) +m_EditorVersion: 2023.2.20f1 +m_EditorVersionWithRevision: 2023.2.20f1 (0e25a174756c) From f74208d66ef343107b1b5721852105b3ff06d4e2 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 12:17:47 -0400 Subject: [PATCH 23/43] Removing standalone tests dep from wrench packaging. --- .yamato/wrench/package-pack-jobs.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.yamato/wrench/package-pack-jobs.yml b/.yamato/wrench/package-pack-jobs.yml index 414aa8412f..04dc787e2a 100644 --- a/.yamato/wrench/package-pack-jobs.yml +++ b/.yamato/wrench/package-pack-jobs.yml @@ -21,8 +21,6 @@ package_pack_-_ml-agents: packages: paths: - upm-ci~/packages/**/* - dependencies: - - path: .yamato/standalone-build-test.yml#test_linux_standalone_2023.2_gym variables: UPMCI_ACK_LARGE_PACKAGE: 1 From 2fa290c1b9fe5efb38b58290eb2e4c7713a1a516 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 13:48:24 -0400 Subject: [PATCH 24/43] Fixed package works issues. Updated com.unity.ml-agents.md. --- com.unity.ml-agents/CODEOWNERS => CODEOWNERS | 0 .../catalog-info.yaml => catalog-info.yaml | 0 com.unity.ml-agents/CODEOWNERS.meta | 7 - .../Documentation~/com.unity.ml-agents.md | 162 +++++------------- com.unity.ml-agents/Documentation~/filter.yml | 6 +- .../Samples/3DBall/.sample.json | 1 - com.unity.ml-agents/Tests/.tests.json | 3 - com.unity.ml-agents/catalog-info.yaml.meta | 7 - com.unity.ml-agents/package.json | 9 +- 9 files changed, 52 insertions(+), 143 deletions(-) rename com.unity.ml-agents/CODEOWNERS => CODEOWNERS (100%) rename com.unity.ml-agents/catalog-info.yaml => catalog-info.yaml (100%) delete mode 100644 com.unity.ml-agents/CODEOWNERS.meta delete mode 100644 com.unity.ml-agents/Samples/3DBall/.sample.json delete mode 100755 com.unity.ml-agents/Tests/.tests.json delete mode 100644 com.unity.ml-agents/catalog-info.yaml.meta diff --git a/com.unity.ml-agents/CODEOWNERS b/CODEOWNERS similarity index 100% rename from com.unity.ml-agents/CODEOWNERS rename to CODEOWNERS diff --git a/com.unity.ml-agents/catalog-info.yaml b/catalog-info.yaml similarity index 100% rename from com.unity.ml-agents/catalog-info.yaml rename to catalog-info.yaml diff --git a/com.unity.ml-agents/CODEOWNERS.meta b/com.unity.ml-agents/CODEOWNERS.meta deleted file mode 100644 index f288a23537..0000000000 --- a/com.unity.ml-agents/CODEOWNERS.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5de323c2110f44676ba99dc49409363c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md b/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md index bfb9ec4b1b..fe0910cbe7 100644 --- a/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md +++ b/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md @@ -1,35 +1,20 @@ -# About ML-Agents package (`com.unity.ml-agents`) - -The _ML-Agents_ package contains the primary C# SDK for the [Unity ML-Agents -Toolkit]. - -The package allows you to convert any Unity scene into a learning environment -and train character behaviors using a variety of machine learning algorithms. -Additionally, it allows you to embed these trained behaviors back into Unity -scenes to control your characters. More specifically, the package provides the -following core functionalities: - -- Define Agents: entities, or characters, whose behavior will be learned. Agents - are entities that generate observations (through sensors), take actions, and - receive rewards from the environment. -- Define Behaviors: entities that specify how an agent should act. Multiple - agents can share the same Behavior and a scene may have multiple Behaviors. -- Record demonstrations of an agent within the Editor. You can use - demonstrations to help train a behavior for that agent. -- Embedding a trained behavior into the scene via the [Unity Inference Engine]. - Embedded behaviors allow you to switch an Agent between learning and - inference. - -Note that the _ML-Agents_ package does not contain the machine learning -algorithms for training behaviors. The _ML-Agents_ package only supports -instrumenting a Unity scene, setting it up for training, and then embedding the -trained model back into your Unity scene. The machine learning algorithms that -orchestrate training are part of the companion [Python package]. - -Note that we also provide an _ML-Agents Extensions_ package -(`com.unity.ml-agents.extensions`) that contains early/experimental features -that you may find useful. This package is only available from the [ML-Agents -GitHub repo]. +# ML-Agents Overview +ML-agents enable games and simulations to serve as environments for training intelligent agents in Unity. Training can be done with reinforcement learning, imitation learning, neuroevolution, or any other methods. Trained agents can be used for many use cases, including controlling NPC behavior (in a variety of settings such as multi-agent and adversarial), automated testing of game builds and evaluating different game design decisions pre-release. + +The _ML-Agents_ package has a C# SDK for the [Unity ML-Agents Toolkit], which can be used outside of Unity. The scope of these docs is just to get started in the context of Unity, but further details and samples are located on the [github docs]. + +## Capabilities +The package allows you to convert any Unity scene into a learning environment and train character behaviors using a variety of machine-learning algorithms. Additionally, it allows you to embed these trained behaviors back into Unity scenes to control your characters. More specifically, the package provides the following core functionalities: + +* Define Agents: entities, or characters, whose behavior will be learned. Agents are entities that generate observations (through sensors), take actions, and receive rewards from the environment. +* Define Behaviors: entities that specify how an agent should act. Multiple agents can share the same Behavior and a scene may have multiple Behaviors. +* Record demonstrations: To show the behaviors of an agent within the Editor. You can use demonstrations to help train a behavior for that agent. +* Embed a trained behavior (aka: run your ML model) in the scene via the [Unity Sentis] inference engine. Embedded behaviors allow you to switch an Agent between learning and inference. + +## Special Notes +Note that the ML-Agents package does not contain the machine learning algorithms for training behaviors. The ML-Agents package only supports instrumenting a Unity scene, setting it up for training, and then embedding the trained model back into your Unity scene. The machine learning algorithms that orchestrate training are part of the companion [python package]. +Note that we also provide an ML-Agents Extensions package (`com.unity.ml-agents.extensions`) that contains early/experimental features that you may find useful. This package is only available from the [ML-Agents GitHub repo]. + ## Package contents @@ -47,49 +32,14 @@ The following table describes the package folder structure: ## Installation +To add the ML-Agents package to a Unity project: -To install this _ML-Agents_ package, follow the instructions in the [Package -Manager documentation]. - -To install the companion Python package to enable training behaviors, follow the -[installation instructions] on our [GitHub repository]. - -### Advanced Installation -With the changes to Unity Package Manager in 2021, experimental packages will not show up in the package list and have to be installed manually. There are two recommended ways to install the package manually: - -#### Github via Package Manager - -In Unity 2019.4 or later, open the Package Manager, hit the "+" button, and select "Add package from git URL". - -![Package Manager git URL](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/images/unity_package_manager_git_url.png) - -In the dialog that appears, enter - -``` -git+https://github.com/Unity-Technologies/ml-agents.git?path=com.unity.ml-agents#release_21 -``` - -You can also edit your project's `manifest.json` directly and add the following line to the `dependencies` -section: - -``` -"com.unity.ml-agents": "git+https://github.com/Unity-Technologies/ml-agents.git?path=com.unity.ml-agents#release_21", -``` - -See [Git dependencies](https://docs.unity3d.com/Manual/upm-git.html#subfolder) for more information. Note that this -may take several minutes to resolve the packages the first time that you add it. - -#### Local Installation for Development - -[Clone the repository](https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/docs/Installation.md#clone-the-ml-agents-toolkit-repository-optional) and follow the -[Local Installation for Development](https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/docs/Installation.md#advanced-local-installation-for-development-1) directions. - -## Requirements - -This version of the Unity ML-Agents package is compatible with the following -versions of the Unity Editor: - -- 2019.4 and later +* Create a new Unity project with Unity 2023.2 (or later) or open an existing one. +* To open the Package Manager, navigate to Window > Package Manager. +* Click + and select Add package by name... +* Enter com.unity.ml-agents +*Click Add to add the package to your project. +To install the companion Python package to enable training behaviors, follow the [installation instructions] on our [GitHub repository]. ## Known Limitations @@ -102,62 +52,32 @@ mode if training is not supported or is not currently running. ### Inference -Inference is executed via the -[Unity Inference Engine](https://docs.unity3d.com/Packages/com.unity.sentis@latest/index.html). - -**CPU** - -All platforms supported. - -**GPU** - -All platforms supported except: - -- WebGL and GLES 3/2 on Android / iPhone - -**NOTE:** Mobile platform support includes: - -- Vulkan for Android -- Metal for iOS. +Inference is executed via [Unity Sentis](https://docs.unity3d.com/Packages/com.unity.sentis@latest/index.html) on the end-user device. Therefore, it is subject to the performance limitations of the end-user CPU or GPU. Also, only models created with our trainers are supported for running ML-Agents with a neural network behavior. ### Headless Mode -If you enable Headless mode, you will not be able to collect visual observations -from your agents. +If you enable Headless mode, you will not be able to collect visual observations from your agents. ### Rendering Speed and Synchronization -Currently the speed of the game physics can only be increased to 100x real-time. -The Academy also moves in time with FixedUpdate() rather than Update(), so game -behavior implemented in Update() may be out of sync with the agent decision -making. See [Execution Order of Event Functions] for more information. - -You can control the frequency of Academy stepping by calling -`Academy.Instance.DisableAutomaticStepping()`, and then calling -`Academy.Instance.EnvironmentStep()` +Currently the speed of the game physics can only be increased to 100x real-time. The Academy (the sentinel that controls the stepping of the game to make sure everything is synchronized, from collection of observations to applying actions generated from policy inference to the agent) also moves in time with `FixedUpdate()` rather than `Update()`, so game behavior implemented in Update() may be out of sync with the agent decision-making. See [Execution Order of Event Functions] for more information. -### Unity Inference Engine Models +You can control the frequency of Academy stepping by calling `Academy.Instance.DisableAutomaticStepping()`, and then calling `Academy.Instance.EnvironmentStep()`. -Currently, only models created with our trainers are supported for running -ML-Agents with a neural network behavior. +## Additional Resources -## Helpful links +* [GitHub repository] +* [Unity Discussions] +* [Discord] +* [Website] -If you are new to the Unity ML-Agents package, or have a question after reading -the documentation, you can checkout our [GitHub Repository], which also includes -a number of ways to [connect with us] including our [ML-Agents Forum]. - -In order to improve the developer experience for Unity ML-Agents Toolkit, we have added in-editor analytics. -Please refer to "Information that is passively collected by Unity" in the -[Unity Privacy Policy](https://unity3d.com/legal/privacy-policy). - -[unity ML-Agents Toolkit]: https://github.com/Unity-Technologies/ml-agents -[unity inference engine]: https://docs.unity3d.com/Packages/com.unity.sentis@latest/index.html -[package manager documentation]: https://docs.unity3d.com/Manual/upm-ui-install.html -[installation instructions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Installation.md -[github repository]: https://github.com/Unity-Technologies/ml-agents +[github docs]: https://unity-technologies.github.io/ml-agents/ +[Unity Sentis]: https://docs.unity3d.com/Packages/com.unity.sentis@2.1/manual/index.html [python package]: https://github.com/Unity-Technologies/ml-agents -[execution order of event functions]: https://docs.unity3d.com/Manual/ExecutionOrder.html -[connect with us]: https://github.com/Unity-Technologies/ml-agents#community-and-feedback -[ml-agents forum]: https://forum.unity.com/forums/ml-agents.453/ [ML-Agents GitHub repo]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/com.unity.ml-agents.extensions +[GitHub repository]: https://github.com/Unity-Technologies/ml-agents +[Execution Order of Event Functions]: https://docs.unity3d.com/Manual/ExecutionOrder.html +[Unity Discussions]: https://discussions.unity.com/tag/ml-agents +[Discord]: https://discord.com/channels/489222168727519232/1202574086115557446 +[Website]: https://unity-technologies.github.io/ml-agents/ + diff --git a/com.unity.ml-agents/Documentation~/filter.yml b/com.unity.ml-agents/Documentation~/filter.yml index ce144daf61..cf9dd6c148 100755 --- a/com.unity.ml-agents/Documentation~/filter.yml +++ b/com.unity.ml-agents/Documentation~/filter.yml @@ -3,12 +3,12 @@ apiRules: uidRegex: .*Test.* type: Namespace - exclude: - uidRegex: ^Unity.MLAgents\.CommunicatorObjects$ + uidRegex: ^Unity\.MLAgents\.CommunicatorObjects$ type: Namespace - exclude: - uidRegex: ^Unity.MLAgents\.Editor$ + uidRegex: ^Unity\.MLAgents\.Editor$ type: Namespace - exclude: - uidRegex: ^Unity.MLAgentsExamples$ + uidRegex: ^Unity\.MLAgentsExamples$ type: Namespace diff --git a/com.unity.ml-agents/Samples/3DBall/.sample.json b/com.unity.ml-agents/Samples/3DBall/.sample.json deleted file mode 100644 index 7055a5b220..0000000000 --- a/com.unity.ml-agents/Samples/3DBall/.sample.json +++ /dev/null @@ -1 +0,0 @@ -{"displayName":"3D Ball","description":"The 3D Ball sample is a simple environment that is a great for jumping into ML-Agents to see how things work."} diff --git a/com.unity.ml-agents/Tests/.tests.json b/com.unity.ml-agents/Tests/.tests.json deleted file mode 100755 index 3139c12353..0000000000 --- a/com.unity.ml-agents/Tests/.tests.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "createSeparatePackage": false -} diff --git a/com.unity.ml-agents/catalog-info.yaml.meta b/com.unity.ml-agents/catalog-info.yaml.meta deleted file mode 100644 index 15b7d888e5..0000000000 --- a/com.unity.ml-agents/catalog-info.yaml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7d543dec1acb6455fb97a799ca89315c -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index f658dffdc4..30f74d987c 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -9,5 +9,12 @@ "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" - } + }, + "samples": [ + { + "displayName":"3D Ball", + "description":"The 3D Ball sample is a simple environment that is a great for jumping into ML-Agents to see how things work.", + "path": "Samples~/3DBall" + } + ] } From 2ab6c2488c8ff52e12e76baf7591f258b02ac507 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 13:52:45 -0400 Subject: [PATCH 25/43] Updated com.unity.ml-agents.md. --- com.unity.ml-agents/Documentation~/com.unity.ml-agents.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md b/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md index fe0910cbe7..f1cf051892 100644 --- a/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md +++ b/com.unity.ml-agents/Documentation~/com.unity.ml-agents.md @@ -39,6 +39,7 @@ To add the ML-Agents package to a Unity project: * Click + and select Add package by name... * Enter com.unity.ml-agents *Click Add to add the package to your project. + To install the companion Python package to enable training behaviors, follow the [installation instructions] on our [GitHub repository]. ## Known Limitations @@ -72,9 +73,10 @@ You can control the frequency of Academy stepping by calling `Academy.Instance.D * [Website] [github docs]: https://unity-technologies.github.io/ml-agents/ +[installation instructions]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Installation.md [Unity Sentis]: https://docs.unity3d.com/Packages/com.unity.sentis@2.1/manual/index.html [python package]: https://github.com/Unity-Technologies/ml-agents -[ML-Agents GitHub repo]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/com.unity.ml-agents.extensions +[ML-Agents GitHub repo]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/com.unity.ml-agents.extensions [GitHub repository]: https://github.com/Unity-Technologies/ml-agents [Execution Order of Event Functions]: https://docs.unity3d.com/Manual/ExecutionOrder.html [Unity Discussions]: https://discussions.unity.com/tag/ml-agents From 1612e558a54b1916443e7dbbca95ecf0fc66ca74 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 15:29:22 -0400 Subject: [PATCH 26/43] Updated package version in Academy.cs --- com.unity.ml-agents/Runtime/Academy.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.ml-agents/Runtime/Academy.cs b/com.unity.ml-agents/Runtime/Academy.cs index dc602bd42e..a3fe3ad5ef 100644 --- a/com.unity.ml-agents/Runtime/Academy.cs +++ b/com.unity.ml-agents/Runtime/Academy.cs @@ -107,7 +107,7 @@ public class Academy : IDisposable /// Unity package version of com.unity.ml-agents. /// This must match the version string in package.json and is checked in a unit test. /// - internal const string k_PackageVersion = "3.0.0-exp.1"; + internal const string k_PackageVersion = "3.0.0"; const int k_EditorTrainingPort = 5004; From 0d3c10d7ddaf289340c52dcfa8dd6e7b610d7dd2 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 12 Sep 2024 16:22:46 -0400 Subject: [PATCH 27/43] Adding back in package pack deps. --- .yamato/wrench/package-pack-jobs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.yamato/wrench/package-pack-jobs.yml b/.yamato/wrench/package-pack-jobs.yml index 04dc787e2a..70ae4c8fd8 100644 --- a/.yamato/wrench/package-pack-jobs.yml +++ b/.yamato/wrench/package-pack-jobs.yml @@ -21,6 +21,8 @@ package_pack_-_ml-agents: packages: paths: - upm-ci~/packages/**/* + dependencies: + - path: .yamato/standalone-build-test.yml#test_linux_standalone_2023.2_gym variables: UPMCI_ACK_LARGE_PACKAGE: 1 From d374fa1821dbcd51e094f2bcb63c263bc2efc198 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Sat, 14 Sep 2024 10:38:48 -0400 Subject: [PATCH 28/43] Updated package pack testing deps.. --- .yamato/wrench/package-pack-jobs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.yamato/wrench/package-pack-jobs.yml b/.yamato/wrench/package-pack-jobs.yml index 70ae4c8fd8..4641ad25d9 100644 --- a/.yamato/wrench/package-pack-jobs.yml +++ b/.yamato/wrench/package-pack-jobs.yml @@ -22,7 +22,7 @@ package_pack_-_ml-agents: paths: - upm-ci~/packages/**/* dependencies: - - path: .yamato/standalone-build-test.yml#test_linux_standalone_2023.2_gym + - path: .yamato/com.unity.ml-agents-test.yml#test_com.unity.ml-agents_mac_2023.2_Project variables: UPMCI_ACK_LARGE_PACKAGE: 1 From 1a0e0318d41bcf02b81467395af6299d7b319758 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Sat, 14 Sep 2024 13:00:24 -0400 Subject: [PATCH 29/43] Regenerated wrench ymls. --- .yamato/wrench/api-validation-jobs.yml | 4 +- .yamato/wrench/package-pack-jobs.yml | 11 +- .yamato/wrench/preview-a-p-v.yml | 14 +- .yamato/wrench/promotion-jobs.yml | 56 +++++++- .yamato/wrench/validation-jobs.yml | 187 ++++++++++++++++++++++++- .yamato/wrench/wrench_config.json | 8 +- 6 files changed, 251 insertions(+), 29 deletions(-) diff --git a/.yamato/wrench/api-validation-jobs.yml b/.yamato/wrench/api-validation-jobs.yml index 9b2ecb55f3..0151a4827a 100644 --- a/.yamato/wrench/api-validation-jobs.yml +++ b/.yamato/wrench/api-validation-jobs.yml @@ -37,11 +37,11 @@ api_validation_-_ml-agents_-_2023_2_-_windows: dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 triggers: expression: push.branch match "^release/.*" cancel_old_ci: true metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 diff --git a/.yamato/wrench/package-pack-jobs.yml b/.yamato/wrench/package-pack-jobs.yml index 4641ad25d9..aad709d94a 100644 --- a/.yamato/wrench/package-pack-jobs.yml +++ b/.yamato/wrench/package-pack-jobs.yml @@ -1,7 +1,7 @@ # Auto-generated by Recipe Engine, do not modify manually. # This job is generated by the wrench recipe engine module, see find the docs here: . -# Pack and Sign ml-agents +# Pack and Sign ML Agents package_pack_-_ml-agents: name: Package Pack - ml-agents agent: @@ -21,13 +21,12 @@ package_pack_-_ml-agents: packages: paths: - upm-ci~/packages/**/* - dependencies: - - path: .yamato/com.unity.ml-agents-test.yml#test_com.unity.ml-agents_mac_2023.2_Project - variables: UPMCI_ACK_LARGE_PACKAGE: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 + + diff --git a/.yamato/wrench/preview-a-p-v.yml b/.yamato/wrench/preview-a-p-v.yml index d3f0bb2bc0..b94446d55b 100644 --- a/.yamato/wrench/preview-a-p-v.yml +++ b/.yamato/wrench/preview-a-p-v.yml @@ -13,7 +13,7 @@ all_preview_apv_jobs: cancel_old_ci: true metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 # Functional tests for dependents found in the latest 6000.0 manifest (MacOS). preview_apv_-_6000_0_-_macos: @@ -59,10 +59,10 @@ preview_apv_-_6000_0_-_macos: dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 # Functional tests for dependents found in the latest 6000.0 manifest (Ubuntu). preview_apv_-_6000_0_-_ubuntu: @@ -108,10 +108,10 @@ preview_apv_-_6000_0_-_ubuntu: dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 # Functional tests for dependents found in the latest 6000.0 manifest (Windows). preview_apv_-_6000_0_-_windows: @@ -157,8 +157,8 @@ preview_apv_-_6000_0_-_windows: dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents variables: - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 diff --git a/.yamato/wrench/promotion-jobs.yml b/.yamato/wrench/promotion-jobs.yml index e37a84e1fe..6a19462cfd 100644 --- a/.yamato/wrench/promotion-jobs.yml +++ b/.yamato/wrench/promotion-jobs.yml @@ -19,6 +19,30 @@ publish_dry_run_ml-agents: - upm-ci~/pvp/**/* dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2023_2_-_macos + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2023.2-macos + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2023.2-macos + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2023_2_-_ubuntu + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2023.2-ubuntu + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2023.2-ubuntu + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2023_2_-_windows + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2023.2-windows + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2023.2-windows + unzip: true - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_macos specific_options: UTR: @@ -45,13 +69,13 @@ publish_dry_run_ml-agents: unzip: true variables: UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 triggers: expression: push.branch match "^release/.*" cancel_old_ci: true metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 # Publish for ml-agents to https://artifactory-slo.bf.unity3d.com/artifactory/api/npm/upm-npm publish_ml-agents: @@ -71,6 +95,30 @@ publish_ml-agents: - upm-ci~/pvp/**/* dependencies: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2023_2_-_macos + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2023.2-macos + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2023.2-macos + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2023_2_-_ubuntu + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2023.2-ubuntu + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2023.2-ubuntu + unzip: true + - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_2023_2_-_windows + specific_options: + UTR: + location: results/UTR/validate-ml-agents-2023.2-windows + unzip: true + pvp-results: + location: results/pvp/validate-ml-agents-2023.2-windows + unzip: true - path: .yamato/wrench/validation-jobs.yml#validate_-_ml-agents_-_6000_0_-_macos specific_options: UTR: @@ -97,8 +145,8 @@ publish_ml-agents: unzip: true variables: UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 diff --git a/.yamato/wrench/validation-jobs.yml b/.yamato/wrench/validation-jobs.yml index a2dda0f825..908e1a98f4 100644 --- a/.yamato/wrench/validation-jobs.yml +++ b/.yamato/wrench/validation-jobs.yml @@ -1,6 +1,181 @@ # Auto-generated by Recipe Engine, do not modify manually. # This job is generated by the wrench recipe engine module, see find the docs here: . +# PVP Editor and Playmode tests for Validate - ml-agents - 2023.2 - macos (2023.2 - MacOS). +validate_-_ml-agents_-_2023_2_-_macos: + name: Validate - ml-agents - 2023.2 - macos + agent: + image: package-ci/macos-13:default + type: Unity::VM::osx + flavor: b1.xlarge + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 2023.2 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json + timeout: 5 + retries: 0 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.5.0 + labels: + - Packages:ml-agents + +# PVP Editor and Playmode tests for Validate - ml-agents - 2023.2 - ubuntu (2023.2 - Ubuntu). +validate_-_ml-agents_-_2023_2_-_ubuntu: + name: Validate - ml-agents - 2023.2 - ubuntu + agent: + image: package-ci/ubuntu-20.04:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl $WRENCH_LOCAL_APV_DOWNLOAD_URL -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 2023.2 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: upm-pvp require "PVP-160-1" --results upm-ci~/pvp --exemptions upm-ci~/pvp/failures.json + timeout: 5 + retries: 0 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.5.0 + labels: + - Packages:ml-agents + +# PVP Editor and Playmode tests for Validate - ml-agents - 2023.2 - windows (2023.2 - Windows). +validate_-_ml-agents_-_2023_2_-_windows: + name: Validate - ml-agents - 2023.2 - windows + agent: + image: package-ci/win10:default + type: Unity::VM + flavor: b1.large + commands: + - command: curl %WRENCH_LOCAL_APV_DOWNLOAD_URL% -o wrench-localapv.zip + - command: 7z x wrench-localapv.zip + - command: python PythonScripts/print_machine_info.py + - command: unity-downloader-cli -u 2023.2 -c Editor --fast + timeout: 10 + retries: 3 + - command: upm-pvp create-test-project test-ml-agents --packages "upm-ci~/packages/*.tgz" --unity .Editor + timeout: 10 + retries: 1 + - command: echo No internal packages to add. + - command: upm-pvp test --unity .Editor --packages "upm-ci~/packages/*.tgz" --results upm-ci~/pvp + timeout: 20 + retries: 0 + - command: echo Skipping check for PVP-160-1 as there is a bug on Windows. https://jira.unity3d.com/browse/PETS-1462 + - command: echo No additional PVP profiles to declared to check. + - command: UnifiedTestRunner.exe --testproject=test-ml-agents --editor-location=.Editor --reruncount=1 --clean-library-on-rerun --artifacts_path=artifacts --suite=Editor --suite=Playmode "--ff={ops.upmpvpevidence.enable=true}" + timeout: 30 + retries: 1 + artifacts: + Crash Dumps: + paths: + - CrashDumps/** + packages: + paths: + - upm-ci~/packages/**/* + pvp-results: + paths: + - upm-ci~/pvp/**/* + UTR: + paths: + - '*.log' + - '*.xml' + - artifacts/**/* + - test-ml-agents/Logs/** + - test-ml-agents/Library/*.log + - test-ml-agents/*.log + - test-ml-agents/Builds/*.log + - build/test-results/** + dependencies: + - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents + variables: + UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 + metadata: + Job Maintainers: '#rm-packageworks' + Wrench: 0.10.5.0 + labels: + - Packages:ml-agents + # PVP Editor and Playmode tests for Validate - ml-agents - 6000.0 - macos (6000.0 - MacOS). validate_-_ml-agents_-_6000_0_-_macos: name: Validate - ml-agents - 6000.0 - macos @@ -53,10 +228,10 @@ validate_-_ml-agents_-_6000_0_-_macos: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents variables: UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 labels: - Packages:ml-agents @@ -112,10 +287,10 @@ validate_-_ml-agents_-_6000_0_-_ubuntu: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents variables: UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 labels: - Packages:ml-agents @@ -169,10 +344,10 @@ validate_-_ml-agents_-_6000_0_-_windows: - path: .yamato/wrench/package-pack-jobs.yml#package_pack_-_ml-agents variables: UPMPVP_ACK_UPMPVP_DOES_NO_API_VALIDATION: 1 - UPMPVP_CONTEXT_WRENCH: 0.10.4.0 + UPMPVP_CONTEXT_WRENCH: 0.10.5.0 metadata: Job Maintainers: '#rm-packageworks' - Wrench: 0.10.4.0 + Wrench: 0.10.5.0 labels: - Packages:ml-agents diff --git a/.yamato/wrench/wrench_config.json b/.yamato/wrench/wrench_config.json index 2012645ab6..7347f99bf5 100644 --- a/.yamato/wrench/wrench_config.json +++ b/.yamato/wrench/wrench_config.json @@ -1,5 +1,5 @@ { - "project_path": "Tools\\CI", + "project_path": "Tools/CI", "schema_version": 0.5, "packages": { "com.unity.ml-agents": { @@ -15,13 +15,13 @@ ], "jobs_to_monitor": { "com.unity.ml-agents": [ - ".yamato/wrench/preview-a-p-v.yml#all_preview_apv_jobs", ".yamato/wrench/api-validation-jobs.yml#api_validation_-_ml-agents_-_2023_2_-_windows", + ".yamato/wrench/preview-a-p-v.yml#all_preview_apv_jobs", ".yamato/wrench/promotion-jobs.yml#publish_dry_run_ml-agents" ] }, "publishing_job": ".yamato/wrench/promotion-jobs.yml#publish_ml-agents", "branch_pattern": "ReleaseSlash", - "wrench_version": "0.10.4.0", + "wrench_version": "0.10.5.0", "pvp_exemption_path": ".yamato/wrench/pvp-exemptions.json" -} \ No newline at end of file +} From 9ecb3bd961998c59788a2bb4f46e55056dcacfd8 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Tue, 24 Sep 2024 08:32:13 -0400 Subject: [PATCH 30/43] License update. --- LICENSE.md | 2 +- ...Party Notices.md => Third Party Notices.md | 27 +++++++++++++++++++ com.unity.ml-agents/LICENSE.md | 2 +- .../Third Party Notices.md.meta | 7 ----- 4 files changed, 29 insertions(+), 9 deletions(-) rename com.unity.ml-agents/Third Party Notices.md => Third Party Notices.md (95%) delete mode 100644 com.unity.ml-agents/Third Party Notices.md.meta diff --git a/LICENSE.md b/LICENSE.md index 06fa0d94e5..00559059c0 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2017-2021 Unity Technologies +Copyright 2017-2024 Unity Technologies Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/com.unity.ml-agents/Third Party Notices.md b/Third Party Notices.md similarity index 95% rename from com.unity.ml-agents/Third Party Notices.md rename to Third Party Notices.md index fc124fc468..6fc589b1ba 100644 --- a/com.unity.ml-agents/Third Party Notices.md +++ b/Third Party Notices.md @@ -5,6 +5,8 @@ This package contains third-party software components governed by the license(s) License Type: MIT +https://www.nuget.org/packages/System.Buffers/ + The MIT License (MIT) Copyright (c) .NET Foundation and Contributors @@ -36,6 +38,8 @@ Component Name: System.Numerics.Vectors.dll License Type: MIT +https://www.nuget.org/packages/System.Numerics.Vectors/ + The MIT License (MIT) Copyright (c) .NET Foundation and Contributors @@ -66,6 +70,8 @@ Component Name: System.Runtime.CompilerServices.Unsafe License Type: MIT +https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe + The MIT License (MIT) Copyright (c) .NET Foundation and Contributors @@ -96,6 +102,8 @@ Component Name: System.Memory.dll License Type: MIT +https://www.nuget.org/packages/System.Memory/ + The MIT License (MIT) Copyright (c) .NET Foundation and Contributors @@ -126,6 +134,8 @@ Component Name: System.IO.Abstractions License Type: MIT +https://github.com/TestableIO/System.IO.Abstractions + The MIT License (MIT) Copyright (c) Tatham Oddie and Contributors @@ -156,6 +166,8 @@ Component Name: System.Interactive.Async.dll License Type: Apache-2.0 +https://www.nuget.org/packages/System.Interactive.Async/ + Copyright (c) .NET Foundation and Contributors All Rights Reserved @@ -177,6 +189,21 @@ Component Name: Grpc License Type: Apache-2.0 +https://github.com/grpc/grpc + +Copyright 2015-2024 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. Apache License Version 2.0, January 2004 diff --git a/com.unity.ml-agents/LICENSE.md b/com.unity.ml-agents/LICENSE.md index 42863a2c98..00559059c0 100644 --- a/com.unity.ml-agents/LICENSE.md +++ b/com.unity.ml-agents/LICENSE.md @@ -1,4 +1,4 @@ -com.unity.ml-agents copyright © 2017 Unity Technologies +Copyright 2017-2024 Unity Technologies Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/com.unity.ml-agents/Third Party Notices.md.meta b/com.unity.ml-agents/Third Party Notices.md.meta deleted file mode 100644 index 00901a0666..0000000000 --- a/com.unity.ml-agents/Third Party Notices.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 3fb7f1407083340b8921a0520b2d8870 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From 67c7a2737700a5525d4650c371a029a0f2ac71b7 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Tue, 24 Sep 2024 08:34:55 -0400 Subject: [PATCH 31/43] Extensions License update. --- com.unity.ml-agents.extensions/LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.ml-agents.extensions/LICENSE.md b/com.unity.ml-agents.extensions/LICENSE.md index 5653ad84f2..00559059c0 100644 --- a/com.unity.ml-agents.extensions/LICENSE.md +++ b/com.unity.ml-agents.extensions/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020-2021 Unity Technologies +Copyright 2017-2024 Unity Technologies Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 900555d60c88aa72797c0972c9fb5678bee82989 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Tue, 24 Sep 2024 12:03:41 -0400 Subject: [PATCH 32/43] Another license tweak. --- LICENSE.md | 189 ------------------------------ Third Party Notices.md | 202 --------------------------------- com.unity.ml-agents/LICENSE.md | 189 ------------------------------ 3 files changed, 580 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 00559059c0..445b990860 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -11,192 +11,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. diff --git a/Third Party Notices.md b/Third Party Notices.md index 6fc589b1ba..76fbc64ee1 100644 --- a/Third Party Notices.md +++ b/Third Party Notices.md @@ -204,205 +204,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/com.unity.ml-agents/LICENSE.md b/com.unity.ml-agents/LICENSE.md index 00559059c0..445b990860 100644 --- a/com.unity.ml-agents/LICENSE.md +++ b/com.unity.ml-agents/LICENSE.md @@ -11,192 +11,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. From d9ea8f2fe8fbf7806f987353b4993c4bb7996fdb Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Wed, 25 Sep 2024 05:45:38 -0400 Subject: [PATCH 33/43] Another license tweak. --- LICENSE.md | 2 +- com.unity.ml-agents/LICENSE.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 445b990860..4ddbb5310f 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2017-2024 Unity Technologies +ML Agents copyright © 2017 Unity Technologies Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/com.unity.ml-agents/LICENSE.md b/com.unity.ml-agents/LICENSE.md index 445b990860..4ddbb5310f 100644 --- a/com.unity.ml-agents/LICENSE.md +++ b/com.unity.ml-agents/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2017-2024 Unity Technologies +ML Agents copyright © 2017 Unity Technologies Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 0874236d078ba917873f2982298ca76bc989b3fe Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 27 Sep 2024 11:27:15 -0400 Subject: [PATCH 34/43] Upgraded to sentis 2.1.0. --- DevProject/Packages/packages-lock.json | 22 +++++++------- .../ProjectSettings/EditorBuildSettings.asset | 2 +- Project/Packages/packages-lock.json | 30 +++++++++---------- com.unity.ml-agents/package.json | 2 +- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/DevProject/Packages/packages-lock.json b/DevProject/Packages/packages-lock.json index 65747ed276..8eb2847fa1 100644 --- a/DevProject/Packages/packages-lock.json +++ b/DevProject/Packages/packages-lock.json @@ -10,7 +10,7 @@ "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.burst": { - "version": "1.8.12", + "version": "1.8.17", "depth": 2, "source": "registry", "dependencies": { @@ -29,14 +29,14 @@ "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.collections": { - "version": "2.2.1", + "version": "2.4.3", "depth": 2, "source": "registry", "dependencies": { - "com.unity.burst": "1.8.8", - "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.burst": "1.8.13", "com.unity.nuget.mono-cecil": "1.11.4", - "com.unity.test-framework.performance": "3.0.2" + "com.unity.test-framework": "1.4.3", + "com.unity.test-framework.performance": "3.0.3" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, @@ -68,7 +68,7 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.sentis": "2.0.0", + "com.unity.sentis": "2.1.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" @@ -118,12 +118,12 @@ "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.sentis": { - "version": "2.0.0", + "version": "2.1.0", "depth": 1, "source": "registry", "dependencies": { - "com.unity.burst": "1.8.12", - "com.unity.collections": "2.2.1", + "com.unity.burst": "1.8.17", + "com.unity.collections": "2.4.3", "com.unity.modules.imageconversion": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" @@ -143,8 +143,8 @@ "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.test-framework": { - "version": "1.3.9", - "depth": 0, + "version": "1.4.3", + "depth": 3, "source": "registry", "dependencies": { "com.unity.ext.nunit": "2.0.3", diff --git a/DevProject/ProjectSettings/EditorBuildSettings.asset b/DevProject/ProjectSettings/EditorBuildSettings.asset index 630ce117a9..7a81c6578a 100644 --- a/DevProject/ProjectSettings/EditorBuildSettings.asset +++ b/DevProject/ProjectSettings/EditorBuildSettings.asset @@ -9,6 +9,6 @@ EditorBuildSettings: path: Assets/ML-Agents/Scripts/Tests/Runtime/AcademyTest/AcademyStepperTestScene.unity guid: 9bafc50b1e55b43b2b1ae9620f1f8311 m_configObjects: - com.unity.ml-agents.settings: {fileID: 11400000, guid: 8c1549da419d94fa285f5b29eab859e9, + com.unity.ml-agents.settings: {fileID: 11400000, guid: b176c44294f5e434bb5109ddfc43274e, type: 2} m_UseUCBPForAssetBundles: 0 diff --git a/Project/Packages/packages-lock.json b/Project/Packages/packages-lock.json index 0b3f6a0b62..274982a762 100644 --- a/Project/Packages/packages-lock.json +++ b/Project/Packages/packages-lock.json @@ -17,7 +17,7 @@ "url": "https://packages.unity.com" }, "com.unity.burst": { - "version": "1.8.12", + "version": "1.8.17", "depth": 2, "source": "registry", "dependencies": { @@ -27,14 +27,14 @@ "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "2.2.1", + "version": "2.4.3", "depth": 2, "source": "registry", "dependencies": { - "com.unity.burst": "1.8.8", - "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.burst": "1.8.13", + "com.unity.test-framework": "1.4.3", "com.unity.nuget.mono-cecil": "1.11.4", - "com.unity.test-framework.performance": "3.0.2" + "com.unity.test-framework.performance": "3.0.3" }, "url": "https://packages.unity.com" }, @@ -50,8 +50,8 @@ "depth": 0, "source": "registry", "dependencies": { - "com.unity.timeline": "1.7.1", - "com.autodesk.fbx": "5.1.0" + "com.autodesk.fbx": "5.1.0", + "com.unity.timeline": "1.7.1" }, "url": "https://packages.unity.com" }, @@ -85,7 +85,7 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.sentis": "2.0.0", + "com.unity.sentis": "2.1.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" @@ -124,12 +124,12 @@ "url": "https://packages.unity.com" }, "com.unity.sentis": { - "version": "2.0.0", + "version": "2.1.0", "depth": 1, "source": "registry", "dependencies": { - "com.unity.burst": "1.8.12", - "com.unity.collections": "2.2.1", + "com.unity.burst": "1.8.17", + "com.unity.collections": "2.4.3", "com.unity.modules.imageconversion": "1.0.0" }, "url": "https://packages.unity.com" @@ -151,8 +151,8 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework": { - "version": "1.3.9", - "depth": 0, + "version": "1.4.3", + "depth": 3, "source": "registry", "dependencies": { "com.unity.ext.nunit": "2.0.3", @@ -162,7 +162,7 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework.performance": { - "version": "3.0.2", + "version": "3.0.3", "depth": 3, "source": "registry", "dependencies": { @@ -176,9 +176,9 @@ "depth": 1, "source": "registry", "dependencies": { + "com.unity.modules.audio": "1.0.0", "com.unity.modules.director": "1.0.0", "com.unity.modules.animation": "1.0.0", - "com.unity.modules.audio": "1.0.0", "com.unity.modules.particlesystem": "1.0.0" }, "url": "https://packages.unity.com" diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index 30f74d987c..e9f63002ef 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -5,7 +5,7 @@ "unity": "2023.2", "description": "Use state-of-the-art machine learning to create intelligent character behaviors in any Unity environment (games, robotics, film, etc.).", "dependencies": { - "com.unity.sentis": "2.0.0", + "com.unity.sentis": "2.1.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.physics": "1.0.0" From 86814f44ad0528b6dabecd523ca21b7f050919aa Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Thu, 3 Oct 2024 14:16:58 -0400 Subject: [PATCH 35/43] Updated standalone yamato build test to using new ml-agents ubuntu ci bokken image. --- .yamato/standalone-build-test.yml | 2 +- com.unity.ml-agents/CHANGELOG.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.yamato/standalone-build-test.yml b/.yamato/standalone-build-test.yml index 733c9ea5c9..e56ab1d3f3 100644 --- a/.yamato/standalone-build-test.yml +++ b/.yamato/standalone-build-test.yml @@ -5,7 +5,7 @@ test_linux_standalone_{{ editor.version }}_{{ editor.extra_test }}: name: Test Linux Standalone {{ editor.version }} {{ editor.extra_test }} agent: type: Unity::VM - image: ml-agents/ml-agents-ubuntu-18.04:latest + image: ml-agents/ubuntu-ci:v1.0.0 flavor: b1.large variables: UNITY_VERSION: {{ editor.version }} diff --git a/com.unity.ml-agents/CHANGELOG.md b/com.unity.ml-agents/CHANGELOG.md index 4bedc93981..827dd787ec 100755 --- a/com.unity.ml-agents/CHANGELOG.md +++ b/com.unity.ml-agents/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to ## [3.0.0] - 2024-09-02 ### Major Changes #### com.unity.ml-agents / com.unity.ml-agents.extensions (C#) +- Upgraded to Sentis 2.1.0 () - Upgraded to Sentis 2.0.0 (#6137) - Upgraded to Sentis 1.3.0-pre.3 (#6070) - Upgraded to Sentis 1.3.0-exp.2 (#6013) From e9e36013d433f0053697b72bbfb347e0fee437ec Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 4 Oct 2024 09:30:04 -0400 Subject: [PATCH 36/43] Bumped python and extensions package versions. --- colab/Colab_UnityEnvironment_1_Run.ipynb | 4 +-- colab/Colab_UnityEnvironment_2_Train.ipynb | 6 ++--- ...Colab_UnityEnvironment_3_SideChannel.ipynb | 12 ++++----- ...olab_UnityEnvironment_4_SB3VectorEnv.ipynb | 4 +-- .../com.unity.ml-agents.extensions.md | 12 ++++----- com.unity.ml-agents.extensions/package.json | 4 +-- com.unity.ml-agents/Runtime/Academy.cs | 4 +-- .../Runtime/Actuators/IActionReceiver.cs | 2 +- .../Runtime/Actuators/IDiscreteActionMask.cs | 2 +- com.unity.ml-agents/Runtime/Agent.cs | 26 +++++++++---------- .../Demonstrations/DemonstrationRecorder.cs | 2 +- com.unity.ml-agents/package.json | 4 +-- docs/Installation-Anaconda-Windows.md | 8 +++--- docs/Installation.md | 8 +++--- docs/Learning-Environment-Design-Agents.md | 2 +- docs/ML-Agents-Toolkit-Documentation.md | 6 ++--- docs/Migrating.md | 2 +- docs/Readme.md | 4 +-- docs/Sentis.md | 4 +-- docs/Training-on-Amazon-Web-Service.md | 2 +- docs/Training-on-Microsoft-Azure.md | 2 +- ml-agents-envs/README.md | 2 +- ml-agents-envs/mlagents_envs/__init__.py | 4 +-- ml-agents/README.md | 2 +- ml-agents/mlagents/trainers/__init__.py | 4 +-- utils/validate_versions.py | 6 +++-- 26 files changed, 70 insertions(+), 68 deletions(-) diff --git a/colab/Colab_UnityEnvironment_1_Run.ipynb b/colab/Colab_UnityEnvironment_1_Run.ipynb index 8d9dc53638..b221ac8421 100644 --- a/colab/Colab_UnityEnvironment_1_Run.ipynb +++ b/colab/Colab_UnityEnvironment_1_Run.ipynb @@ -32,7 +32,7 @@ }, "source": [ "# ML-Agents Open a UnityEnvironment\n", - "" + "" ] }, { @@ -149,7 +149,7 @@ " import mlagents\n", " print(\"ml-agents already installed\")\n", "except ImportError:\n", - " !python -m pip install -q mlagents==1.0.0\n", + " !python -m pip install -q mlagents==1.1.0\n", " print(\"Installed ml-agents\")" ], "execution_count": 1, diff --git a/colab/Colab_UnityEnvironment_2_Train.ipynb b/colab/Colab_UnityEnvironment_2_Train.ipynb index 08014a790e..80b82b428e 100644 --- a/colab/Colab_UnityEnvironment_2_Train.ipynb +++ b/colab/Colab_UnityEnvironment_2_Train.ipynb @@ -22,7 +22,7 @@ }, "source": [ "# ML-Agents Q-Learning with GridWorld\n", - "" + "" ] }, { @@ -152,7 +152,7 @@ " import mlagents\n", " print(\"ml-agents already installed\")\n", "except ImportError:\n", - " !python -m pip install -q mlagents==1.0.0\n", + " !python -m pip install -q mlagents==1.1.0\n", " print(\"Installed ml-agents\")" ], "execution_count": 2, @@ -190,7 +190,7 @@ "id": "pZhVRfdoyPmv" }, "source": [ - "The [GridWorld](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Examples.md#gridworld) Environment is a simple Unity visual environment. The Agent is a blue square in a 3x3 grid that is trying to reach a green __`+`__ while avoiding a red __`x`__.\n", + "The [GridWorld](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Examples.md#gridworld) Environment is a simple Unity visual environment. The Agent is a blue square in a 3x3 grid that is trying to reach a green __`+`__ while avoiding a red __`x`__.\n", "\n", "The observation is an image obtained by a camera on top of the grid.\n", "\n", diff --git a/colab/Colab_UnityEnvironment_3_SideChannel.ipynb b/colab/Colab_UnityEnvironment_3_SideChannel.ipynb index 06ea8c493c..646a01defe 100644 --- a/colab/Colab_UnityEnvironment_3_SideChannel.ipynb +++ b/colab/Colab_UnityEnvironment_3_SideChannel.ipynb @@ -23,7 +23,7 @@ }, "source": [ "# ML-Agents Use SideChannels\n", - "" + "" ] }, { @@ -153,7 +153,7 @@ " import mlagents\n", " print(\"ml-agents already installed\")\n", "except ImportError:\n", - " !python -m pip install -q mlagents==1.0.0\n", + " !python -m pip install -q mlagents==1.1.0\n", " print(\"Installed ml-agents\")" ], "execution_count": 2, @@ -176,7 +176,7 @@ "## Side Channel\n", "\n", "SideChannels are objects that can be passed to the constructor of a UnityEnvironment or the `make()` method of a registry entry to send non Reinforcement Learning related data.\n", - "More information available [here](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Python-API.md#communicating-additional-information-with-the-environment)\n", + "More information available [here](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Python-API.md#communicating-additional-information-with-the-environment)\n", "\n", "\n", "\n" @@ -189,7 +189,7 @@ }, "source": [ "### Engine Configuration SideChannel\n", - "The [Engine Configuration Side Channel](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Python-API.md#engineconfigurationchannel) is used to configure how the Unity Engine should run.\n", + "The [Engine Configuration Side Channel](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Python-API.md#engineconfigurationchannel) is used to configure how the Unity Engine should run.\n", "We will use the GridWorld environment to demonstrate how to use the EngineConfigurationChannel." ] }, @@ -282,7 +282,7 @@ }, "source": [ "### Environment Parameters Channel\n", - "The [Environment Parameters Side Channel](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Python-API.md#environmentparameters) is used to modify environment parameters during the simulation.\n", + "The [Environment Parameters Side Channel](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Python-API.md#environmentparameters) is used to modify environment parameters during the simulation.\n", "We will use the GridWorld environment to demonstrate how to use the EngineConfigurationChannel." ] }, @@ -419,7 +419,7 @@ }, "source": [ "### Creating your own Side Channels\n", - "You can send various kinds of data between a Unity Environment and Python but you will need to [create your own implementation of a Side Channel](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Custom-SideChannels.md#custom-side-channels) for advanced use cases.\n" + "You can send various kinds of data between a Unity Environment and Python but you will need to [create your own implementation of a Side Channel](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Custom-SideChannels.md#custom-side-channels) for advanced use cases.\n" ] }, { diff --git a/colab/Colab_UnityEnvironment_4_SB3VectorEnv.ipynb b/colab/Colab_UnityEnvironment_4_SB3VectorEnv.ipynb index 59fa645884..e5d3d45c8b 100644 --- a/colab/Colab_UnityEnvironment_4_SB3VectorEnv.ipynb +++ b/colab/Colab_UnityEnvironment_4_SB3VectorEnv.ipynb @@ -7,7 +7,7 @@ }, "source": [ "# ML-Agents run with Stable Baselines 3\n", - "" + "" ] }, { @@ -127,7 +127,7 @@ " import mlagents\n", " print(\"ml-agents already installed\")\n", "except ImportError:\n", - " !python -m pip install -q mlagents==1.0.0\n", + " !python -m pip install -q mlagents==1.1.0\n", " print(\"Installed ml-agents\")" ] }, diff --git a/com.unity.ml-agents.extensions/Documentation~/com.unity.ml-agents.extensions.md b/com.unity.ml-agents.extensions/Documentation~/com.unity.ml-agents.extensions.md index 73ecb70fec..9421ae1484 100644 --- a/com.unity.ml-agents.extensions/Documentation~/com.unity.ml-agents.extensions.md +++ b/com.unity.ml-agents.extensions/Documentation~/com.unity.ml-agents.extensions.md @@ -28,24 +28,24 @@ The ML-Agents Extensions package is not currently available in the Package Manag recommended ways to install the package: ### Local Installation -[Clone the repository](https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/docs/Installation.md#clone-the-ml-agents-toolkit-repository-optional) and follow the -[Local Installation for Development](https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/docs/Installation.md#advanced-local-installation-for-development-1) +[Clone the repository](https://github.com/Unity-Technologies/ml-agents/tree/release_22_docs/docs/Installation.md#clone-the-ml-agents-toolkit-repository-optional) and follow the +[Local Installation for Development](https://github.com/Unity-Technologies/ml-agents/tree/release_22_docs/docs/Installation.md#advanced-local-installation-for-development-1) directions (substituting `com.unity.ml-agents.extensions` for the package name). ### Github via Package Manager In Unity 2019.4 or later, open the Package Manager, hit the "+" button, and select "Add package from git URL". -![Package Manager git URL](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/images/unity_package_manager_git_url.png) +![Package Manager git URL](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/images/unity_package_manager_git_url.png) In the dialog that appears, enter ``` -git+https://github.com/Unity-Technologies/ml-agents.git?path=com.unity.ml-agents.extensions#release_21 +git+https://github.com/Unity-Technologies/ml-agents.git?path=com.unity.ml-agents.extensions#release_22 ``` You can also edit your project's `manifest.json` directly and add the following line to the `dependencies` section: ``` -"com.unity.ml-agents.extensions": "git+https://github.com/Unity-Technologies/ml-agents.git?path=com.unity.ml-agents.extensions#release_21", +"com.unity.ml-agents.extensions": "git+https://github.com/Unity-Technologies/ml-agents.git?path=com.unity.ml-agents.extensions#release_22", ``` See [Git dependencies](https://docs.unity3d.com/Manual/upm-git.html#subfolder) for more information. Note that this may take several minutes to resolve the packages the first time that you add it. @@ -67,4 +67,4 @@ If using the `InputActuatorComponent` - No way to customize the action space of the `InputActuatorComponent` ## Need Help? -The main [README](https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/README.md) contains links for contacting the team or getting support. +The main [README](https://github.com/Unity-Technologies/ml-agents/tree/release_22_docs/README.md) contains links for contacting the team or getting support. diff --git a/com.unity.ml-agents.extensions/package.json b/com.unity.ml-agents.extensions/package.json index 71d3035c37..d506b8bcf6 100644 --- a/com.unity.ml-agents.extensions/package.json +++ b/com.unity.ml-agents.extensions/package.json @@ -1,11 +1,11 @@ { "name": "com.unity.ml-agents.extensions", "displayName": "ML Agents Extensions", - "version": "0.6.1-preview", + "version": "0.6.1-exp.1", "unity": "2023.2", "description": "A source-only package for new features based on ML-Agents", "dependencies": { - "com.unity.ml-agents": "3.0.0-exp.1", + "com.unity.ml-agents": "3.0.0", "com.unity.modules.physics": "1.0.0" } } diff --git a/com.unity.ml-agents/Runtime/Academy.cs b/com.unity.ml-agents/Runtime/Academy.cs index a3fe3ad5ef..7916a001b9 100644 --- a/com.unity.ml-agents/Runtime/Academy.cs +++ b/com.unity.ml-agents/Runtime/Academy.cs @@ -20,7 +20,7 @@ * API. For more information on each of these entities, in addition to how to * set-up a learning environment and train the behavior of characters in a * Unity scene, please browse our documentation pages on GitHub: - * https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/docs/ + * https://github.com/Unity-Technologies/ml-agents/tree/release_22_docs/docs/ */ namespace Unity.MLAgents @@ -61,7 +61,7 @@ void FixedUpdate() /// fall back to inference or heuristic decisions. (You can also set agents to always use /// inference or heuristics.) /// - [HelpURL("https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/" + + [HelpURL("https://github.com/Unity-Technologies/ml-agents/tree/release_22_docs/" + "docs/Learning-Environment-Design.md")] public class Academy : IDisposable { diff --git a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs index af201cacf1..3dbb89d816 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs @@ -184,7 +184,7 @@ public interface IActionReceiver /// /// See [Agents - Actions] for more information on masking actions. /// - /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions + /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#actions /// /// void WriteDiscreteActionMask(IDiscreteActionMask actionMask); diff --git a/com.unity.ml-agents/Runtime/Actuators/IDiscreteActionMask.cs b/com.unity.ml-agents/Runtime/Actuators/IDiscreteActionMask.cs index 5845200cc5..dfb33901ff 100644 --- a/com.unity.ml-agents/Runtime/Actuators/IDiscreteActionMask.cs +++ b/com.unity.ml-agents/Runtime/Actuators/IDiscreteActionMask.cs @@ -16,7 +16,7 @@ public interface IDiscreteActionMask /// /// See [Agents - Actions] for more information on masking actions. /// - /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#masking-discrete-actions + /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#masking-discrete-actions /// /// The branch for which the actions will be masked. /// Index of the action. diff --git a/com.unity.ml-agents/Runtime/Agent.cs b/com.unity.ml-agents/Runtime/Agent.cs index 06daad4805..66f4c3821e 100644 --- a/com.unity.ml-agents/Runtime/Agent.cs +++ b/com.unity.ml-agents/Runtime/Agent.cs @@ -192,13 +192,13 @@ public override BuiltInActuatorType GetBuiltInActuatorType() /// [OnDisable()]: https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnDisable.html] /// [OnBeforeSerialize()]: https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnBeforeSerialize.html /// [OnAfterSerialize()]: https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnAfterSerialize.html - /// [Agents]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md - /// [Reinforcement Learning in Unity]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design.md + /// [Agents]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md + /// [Reinforcement Learning in Unity]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design.md /// [Unity ML-Agents Toolkit]: https://github.com/Unity-Technologies/ml-agents - /// [Unity ML-Agents Toolkit manual]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Readme.md + /// [Unity ML-Agents Toolkit manual]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Readme.md /// /// - [HelpURL("https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/" + + [HelpURL("https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/" + "docs/Learning-Environment-Design-Agents.md")] [Serializable] [RequireComponent(typeof(BehaviorParameters))] @@ -728,8 +728,8 @@ public int CompletedEpisodes /// for information about mixing reward signals from curiosity and Generative Adversarial /// Imitation Learning (GAIL) with rewards supplied through this method. /// - /// [Agents - Rewards]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#rewards - /// [Reward Signals]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/ML-Agents-Overview.md#a-quick-note-on-reward-signals + /// [Agents - Rewards]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#rewards + /// [Reward Signals]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/ML-Agents-Overview.md#a-quick-note-on-reward-signals /// /// The new value of the reward. public void SetReward(float reward) @@ -756,8 +756,8 @@ public void SetReward(float reward) /// for information about mixing reward signals from curiosity and Generative Adversarial /// Imitation Learning (GAIL) with rewards supplied through this method. /// - /// [Agents - Rewards]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#rewards - /// [Reward Signals]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/ML-Agents-Overview.md#a-quick-note-on-reward-signals + /// [Agents - Rewards]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#rewards + /// [Reward Signals]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/ML-Agents-Overview.md#a-quick-note-on-reward-signals /// /// Incremental reward value. public void AddReward(float increment) @@ -945,8 +945,8 @@ public virtual void Initialize() { } /// implementing a simple heuristic function can aid in debugging agent actions and interactions /// with its environment. /// - /// [Demonstration Recorder]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#recording-demonstrations - /// [Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions + /// [Demonstration Recorder]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#recording-demonstrations + /// [Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#actions /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html /// /// @@ -1203,7 +1203,7 @@ void ResetSensors() /// For more information about observations, see [Observations and Sensors]. /// /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html - /// [Observations and Sensors]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#observations-and-sensors + /// [Observations and Sensors]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#observations-and-sensors /// public virtual void CollectObservations(VectorSensor sensor) { @@ -1245,7 +1245,7 @@ public ReadOnlyCollection GetStackedObservations() /// /// See [Agents - Actions] for more information on masking actions. /// - /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions + /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#actions /// /// public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } @@ -1312,7 +1312,7 @@ public virtual void WriteDiscreteActionMask(IDiscreteActionMask actionMask) { } /// /// For more information about implementing agent actions see [Agents - Actions]. /// - /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Learning-Environment-Design-Agents.md#actions + /// [Agents - Actions]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Learning-Environment-Design-Agents.md#actions /// /// /// diff --git a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs index 61b97eed73..a4101f8976 100644 --- a/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs +++ b/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs @@ -19,7 +19,7 @@ namespace Unity.MLAgents.Demonstrations /// See [Imitation Learning - Recording Demonstrations] for more information. /// /// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html - /// [Imitation Learning - Recording Demonstrations]: https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs//Learning-Environment-Design-Agents.md#recording-demonstrations + /// [Imitation Learning - Recording Demonstrations]: https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs//Learning-Environment-Design-Agents.md#recording-demonstrations /// [RequireComponent(typeof(Agent))] [AddComponentMenu("ML Agents/Demonstration Recorder", (int)MenuGroup.Default)] diff --git a/com.unity.ml-agents/package.json b/com.unity.ml-agents/package.json index e9f63002ef..b8987dd3d3 100755 --- a/com.unity.ml-agents/package.json +++ b/com.unity.ml-agents/package.json @@ -12,8 +12,8 @@ }, "samples": [ { - "displayName":"3D Ball", - "description":"The 3D Ball sample is a simple environment that is a great for jumping into ML-Agents to see how things work.", + "displayName": "3D Ball", + "description": "The 3D Ball sample is a simple environment that is a great for jumping into ML-Agents to see how things work.", "path": "Samples~/3DBall" } ] diff --git a/docs/Installation-Anaconda-Windows.md b/docs/Installation-Anaconda-Windows.md index ef5053f6e3..3b80adbdf0 100644 --- a/docs/Installation-Anaconda-Windows.md +++ b/docs/Installation-Anaconda-Windows.md @@ -123,10 +123,10 @@ commands in an Anaconda Prompt _(if you open a new prompt, be sure to activate the ml-agents Conda environment by typing `activate ml-agents`)_: ```sh -git clone --branch release_21 https://github.com/Unity-Technologies/ml-agents.git +git clone --branch release_22 https://github.com/Unity-Technologies/ml-agents.git ``` -The `--branch release_21` option will switch to the tag of the latest stable +The `--branch release_22` option will switch to the tag of the latest stable release. Omitting that will get the `main` branch which is potentially unstable. @@ -151,7 +151,7 @@ config files in this directory when running `mlagents-learn`. Make sure you are connected to the Internet and then type in the Anaconda Prompt: ```console -python -m pip install mlagents==1.0.0 +python -m pip install mlagents==1.1.0 ``` This will complete the installation of all the required Python packages to run @@ -162,7 +162,7 @@ pip will get stuck when trying to read the cache of the package. If you see this, you can try: ```console -python -m pip install mlagents==1.0.0 --no-cache-dir +python -m pip install mlagents==1.1.0 --no-cache-dir ``` This `--no-cache-dir` tells the pip to disable the cache. diff --git a/docs/Installation.md b/docs/Installation.md index b88d8610bd..a3c381c415 100644 --- a/docs/Installation.md +++ b/docs/Installation.md @@ -72,10 +72,10 @@ of our tutorials / guides assume you have access to our example environments). the repository if you would like to explore more examples. ```sh -git clone --branch release_21 https://github.com/Unity-Technologies/ml-agents.git +git clone --branch release_22 https://github.com/Unity-Technologies/ml-agents.git ``` -The `--branch release_21` option will switch to the tag of the latest stable +The `--branch release_22` option will switch to the tag of the latest stable release. Omitting that will get the `develop` branch which is potentially unstable. However, if you find that a release branch does not work, the recommendation is to use the `develop` branch as it may have potential fixes for bugs and dependency issues. @@ -90,7 +90,7 @@ git clone --branch https://github.com/Unity-Technologies/ml-agents.git You will need to clone the repository if you plan to modify or extend the ML-Agents Toolkit for your purposes. If you plan to contribute those changes -back, make sure to clone the `develop` branch (by omitting `--branch release_21` +back, make sure to clone the `develop` branch (by omitting `--branch release_22` from the command above). See our [Contributions Guidelines](../com.unity.ml-agents/CONTRIBUTING.md) for more information on contributing to the ML-Agents Toolkit. @@ -195,7 +195,7 @@ line parameters you can use with `mlagents-learn`. the following command: ```shell -python -m pip install mlagents==1.0.0 +python -m pip install mlagents==1.1.0 ``` which will install the latest version of ML-Agents and associated dependencies available on PyPi. Note, you need to have the matching version of diff --git a/docs/Learning-Environment-Design-Agents.md b/docs/Learning-Environment-Design-Agents.md index f47440c7d8..255dd44b17 100644 --- a/docs/Learning-Environment-Design-Agents.md +++ b/docs/Learning-Environment-Design-Agents.md @@ -579,7 +579,7 @@ To allow more variety of observations that grid sensor can capture, the `GridSensorComponent` and the underlying `GridSensorBase` also provides interfaces that can be overridden to collect customized observation from detected objects. See the doc on -[extending grid Sensors](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/com.unity.ml-agents.extensions/Documentation~/CustomGridSensors.md) +[extending grid Sensors](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/com.unity.ml-agents.extensions/Documentation~/CustomGridSensors.md) for more details on custom grid sensors. __Note__: The `GridSensor` only works in 3D environments and will not behave diff --git a/docs/ML-Agents-Toolkit-Documentation.md b/docs/ML-Agents-Toolkit-Documentation.md index 08aae1daab..5cd6548c74 100644 --- a/docs/ML-Agents-Toolkit-Documentation.md +++ b/docs/ML-Agents-Toolkit-Documentation.md @@ -41,9 +41,9 @@ ## Python Tutorial with Google Colab -- [Using a UnityEnvironment](https://colab.research.google.com/github/Unity-Technologies/ml-agents/blob/release_21_docs/colab/Colab_UnityEnvironment_1_Run.ipynb) -- [Q-Learning with a UnityEnvironment](https://colab.research.google.com/github/Unity-Technologies/ml-agents/blob/release_21_docs/colab/Colab_UnityEnvironment_2_Train.ipynb) -- [Using Side Channels on a UnityEnvironment](https://colab.research.google.com/github/Unity-Technologies/ml-agents/blob/release_21_docs/colab/Colab_UnityEnvironment_3_SideChannel.ipynb) +- [Using a UnityEnvironment](https://colab.research.google.com/github/Unity-Technologies/ml-agents/blob/release_22_docs/colab/Colab_UnityEnvironment_1_Run.ipynb) +- [Q-Learning with a UnityEnvironment](https://colab.research.google.com/github/Unity-Technologies/ml-agents/blob/release_22_docs/colab/Colab_UnityEnvironment_2_Train.ipynb) +- [Using Side Channels on a UnityEnvironment](https://colab.research.google.com/github/Unity-Technologies/ml-agents/blob/release_22_docs/colab/Colab_UnityEnvironment_3_SideChannel.ipynb) ## Help diff --git a/docs/Migrating.md b/docs/Migrating.md index 4cf9ae7db1..3559ab369a 100644 --- a/docs/Migrating.md +++ b/docs/Migrating.md @@ -223,7 +223,7 @@ folder - The Parameter Randomization feature has been merged with the Curriculum feature. It is now possible to specify a sampler in the lesson of a Curriculum. Curriculum has been refactored and is now specified at the level of the parameter, not the behavior. More information -[here](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/docs/Training-ML-Agents.md).(#4160) +[here](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/docs/Training-ML-Agents.md).(#4160) ### Steps to Migrate - The configuration format for curriculum and parameter randomization has changed. To upgrade your configuration files, diff --git a/docs/Readme.md b/docs/Readme.md index c5a8e06ac4..4b77ef9db8 100644 --- a/docs/Readme.md +++ b/docs/Readme.md @@ -1,6 +1,6 @@ # Unity ML-Agents Toolkit -[![docs badge](https://img.shields.io/badge/docs-reference-blue.svg)](https://github.com/Unity-Technologies/ml-agents/tree/release_21_docs/docs/) +[![docs badge](https://img.shields.io/badge/docs-reference-blue.svg)](https://github.com/Unity-Technologies/ml-agents/tree/release_22_docs/docs/) [![license badge](https://img.shields.io/badge/license-Apache--2.0-green.svg)](../LICENSE.md) @@ -68,7 +68,7 @@ under active development and may be unstable. A few helpful guidelines: | **Version** | **Release Date** | **Source** | **Documentation** | **Download** | **Python Package** | **Unity Package** | |:--------------------------:|:------:|:-------------:|:-------:|:------------:|:------------:|:------------:| | **develop (unstable)** | -- | [source](https://github.com/Unity-Technologies/ml-agents/tree/develop) | [docs](https://unity-technologies.github.io/ml-agents/) | [download](https://github.com/Unity-Technologies/ml-agents/archive/develop.zip) | -- | -- | -| **Release 21** | **October 9, 2023** | **[source](https://github.com/Unity-Technologies/ml-agents/tree/release_21)** | **[docs](https://unity-technologies.github.io/ml-agents/)** | **[download](https://github.com/Unity-Technologies/ml-agents/archive/release_21.zip)** | **[1.0.0](https://pypi.org/project/mlagents/1.0.0/)** | **[3.0.0](https://docs.unity3d.com/Packages/com.unity.ml-agents@3.0/manual/index.html)** | +| **Release 21** | **October 9, 2023** | **[source](https://github.com/Unity-Technologies/ml-agents/tree/release_22)** | **[docs](https://unity-technologies.github.io/ml-agents/)** | **[download](https://github.com/Unity-Technologies/ml-agents/archive/release_22.zip)** | **[1.0.0](https://pypi.org/project/mlagents/1.0.0/)** | **[3.0.0](https://docs.unity3d.com/Packages/com.unity.ml-agents@3.0/manual/index.html)** | If you are a researcher interested in a discussion of Unity as an AI platform, diff --git a/docs/Sentis.md b/docs/Sentis.md index f3861ee400..55566f3a53 100644 --- a/docs/Sentis.md +++ b/docs/Sentis.md @@ -35,9 +35,9 @@ The ML-Agents Toolkit only supports the models created with our trainers. Model loading expects certain conventions for constants and tensor names. While it is possible to construct a model that follows these conventions, we don't provide any additional help for this. More details can be found in -[TensorNames.cs](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/com.unity.ml-agents/Runtime/Inference/TensorNames.cs) +[TensorNames.cs](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/com.unity.ml-agents/Runtime/Inference/TensorNames.cs) and -[SentisModelParamLoader.cs](https://github.com/Unity-Technologies/ml-agents/blob/release_21_docs/com.unity.ml-agents/Runtime/Inference/SentisModelParamLoader.cs). +[SentisModelParamLoader.cs](https://github.com/Unity-Technologies/ml-agents/blob/release_22_docs/com.unity.ml-agents/Runtime/Inference/SentisModelParamLoader.cs). If you wish to run inference on an externally trained model, you should use Sentis directly, instead of trying to run it through ML-Agents. diff --git a/docs/Training-on-Amazon-Web-Service.md b/docs/Training-on-Amazon-Web-Service.md index a92f04fb89..d6549044d2 100644 --- a/docs/Training-on-Amazon-Web-Service.md +++ b/docs/Training-on-Amazon-Web-Service.md @@ -69,7 +69,7 @@ After launching your EC2 instance using the ami and ssh into it: 2. Clone the ML-Agents repo and install the required Python packages ```sh - git clone --branch release_21 https://github.com/Unity-Technologies/ml-agents.git + git clone --branch release_22 https://github.com/Unity-Technologies/ml-agents.git cd ml-agents/ml-agents/ pip3 install -e . ``` diff --git a/docs/Training-on-Microsoft-Azure.md b/docs/Training-on-Microsoft-Azure.md index 5c7062551b..759cc145c9 100644 --- a/docs/Training-on-Microsoft-Azure.md +++ b/docs/Training-on-Microsoft-Azure.md @@ -33,7 +33,7 @@ view the documentation for doing so [here](#custom-instances). instance, and set it as the working directory. 2. Install the required packages: Torch: `pip3 install torch==1.7.0 -f https://download.pytorch.org/whl/torch_stable.html` and - MLAgents: `python -m pip install mlagents==1.0.0` + MLAgents: `python -m pip install mlagents==1.1.0` ## Testing diff --git a/ml-agents-envs/README.md b/ml-agents-envs/README.md index 6935735ce5..4db68723d2 100644 --- a/ml-agents-envs/README.md +++ b/ml-agents-envs/README.md @@ -17,7 +17,7 @@ communication. Install the `mlagents_envs` package with: ```sh -python -m pip install mlagents_envs==1.0.0 +python -m pip install mlagents_envs==1.1.0 ``` ## Usage & More Information diff --git a/ml-agents-envs/mlagents_envs/__init__.py b/ml-agents-envs/mlagents_envs/__init__.py index c376dbb366..adda2e26ea 100644 --- a/ml-agents-envs/mlagents_envs/__init__.py +++ b/ml-agents-envs/mlagents_envs/__init__.py @@ -1,5 +1,5 @@ # Version of the library that will be used to upload to pypi -__version__ = "1.1.0.dev0" +__version__ = "1.1.0" # Git tag that will be checked to determine whether to trigger upload to pypi -__release_tag__ = None +__release_tag__ = "release_22" diff --git a/ml-agents/README.md b/ml-agents/README.md index 45432ec547..16b3bada70 100644 --- a/ml-agents/README.md +++ b/ml-agents/README.md @@ -16,7 +16,7 @@ package. Install the `mlagents` package with: ```sh -python -m pip install mlagents==1.0.0 +python -m pip install mlagents==1.1.0 ``` ## Usage & More Information diff --git a/ml-agents/mlagents/trainers/__init__.py b/ml-agents/mlagents/trainers/__init__.py index c376dbb366..adda2e26ea 100644 --- a/ml-agents/mlagents/trainers/__init__.py +++ b/ml-agents/mlagents/trainers/__init__.py @@ -1,5 +1,5 @@ # Version of the library that will be used to upload to pypi -__version__ = "1.1.0.dev0" +__version__ = "1.1.0" # Git tag that will be checked to determine whether to trigger upload to pypi -__release_tag__ = None +__release_tag__ = "release_22" diff --git a/utils/validate_versions.py b/utils/validate_versions.py index 65044ed5a8..a454343607 100755 --- a/utils/validate_versions.py +++ b/utils/validate_versions.py @@ -81,7 +81,9 @@ def set_version( f.write(new_contents) if csharp_version is not None: - package_version = f"{csharp_version}-exp.1" + # removed exp.1 tag from version strings since MLA package is a supported package again + # package_version = f"{csharp_version}-exp.1" + package_version = f"{csharp_version}" if csharp_extensions_version is not None: # since this has never been promoted we need to keep # it in preview forever or CI will fail @@ -178,7 +180,7 @@ def print_release_tag_commands( print(f"Updating C# package to version {args.csharp_version}") if args.csharp_extensions_version: print( - f"Updating C# extensions package to version {args.csharp_extensions_version}" + f"Updating C# extensions package to version {args.csharp_extensions_version}-exp.1" ) set_version( args.python_version, From c683e7728558000bf80d9afb89e2f6b202a7f9e5 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 4 Oct 2024 09:57:14 -0400 Subject: [PATCH 37/43] Changed ci image for pytest gpu yamato test. --- .yamato/pytest-gpu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.yamato/pytest-gpu.yml b/.yamato/pytest-gpu.yml index 291cbf8207..c6cb72c509 100644 --- a/.yamato/pytest-gpu.yml +++ b/.yamato/pytest-gpu.yml @@ -2,7 +2,7 @@ pytest_gpu: name: Pytest GPU agent: type: Unity::VM::GPU - image: ml-agents/ml-agents-ubuntu-18.04:latest + image: ml-agents/ubuntu-ci:v1.0.0 flavor: b1.large commands: - | From 54664fca336da58b8a06c2ecdb173ca2c2610160 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 4 Oct 2024 11:32:25 -0400 Subject: [PATCH 38/43] Changed default cuda dtype to torch.float32. --- ml-agents/mlagents/torch_utils/torch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ml-agents/mlagents/torch_utils/torch.py b/ml-agents/mlagents/torch_utils/torch.py index ce1fec7a57..311304ef54 100644 --- a/ml-agents/mlagents/torch_utils/torch.py +++ b/ml-agents/mlagents/torch_utils/torch.py @@ -53,7 +53,7 @@ def set_torch_config(torch_settings: TorchSettings) -> None: if _device.type == "cuda": torch.set_default_device(_device.type) - torch.set_default_dtype(torch.cuda.FloatTensor) + torch.set_default_dtype(torch.float32) else: torch.set_default_dtype(torch.float32) logger.debug(f"default Torch device: {_device}") From e70d0239ebaed25713138d77317d0019887b5f1b Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 4 Oct 2024 15:35:46 -0400 Subject: [PATCH 39/43] Updated version validation and extensions version. --- DevProject/Packages/packages-lock.json | 2 +- Project/Packages/packages-lock.json | 2 +- com.unity.ml-agents.extensions/package.json | 2 +- utils/validate_versions.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DevProject/Packages/packages-lock.json b/DevProject/Packages/packages-lock.json index 8eb2847fa1..fcb1b62a69 100644 --- a/DevProject/Packages/packages-lock.json +++ b/DevProject/Packages/packages-lock.json @@ -79,7 +79,7 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.ml-agents": "3.0.0-exp.1", + "com.unity.ml-agents": "3.0.0", "com.unity.modules.physics": "1.0.0" } }, diff --git a/Project/Packages/packages-lock.json b/Project/Packages/packages-lock.json index 274982a762..1fcbf50632 100644 --- a/Project/Packages/packages-lock.json +++ b/Project/Packages/packages-lock.json @@ -96,7 +96,7 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.ml-agents": "3.0.0-exp.1", + "com.unity.ml-agents": "3.0.0", "com.unity.modules.physics": "1.0.0" } }, diff --git a/com.unity.ml-agents.extensions/package.json b/com.unity.ml-agents.extensions/package.json index d506b8bcf6..4f44bcd6c0 100644 --- a/com.unity.ml-agents.extensions/package.json +++ b/com.unity.ml-agents.extensions/package.json @@ -1,7 +1,7 @@ { "name": "com.unity.ml-agents.extensions", "displayName": "ML Agents Extensions", - "version": "0.6.1-exp.1", + "version": "0.6.1-preview", "unity": "2023.2", "description": "A source-only package for new features based on ML-Agents", "dependencies": { diff --git a/utils/validate_versions.py b/utils/validate_versions.py index a454343607..c8d0168cdf 100755 --- a/utils/validate_versions.py +++ b/utils/validate_versions.py @@ -87,7 +87,7 @@ def set_version( if csharp_extensions_version is not None: # since this has never been promoted we need to keep # it in preview forever or CI will fail - extension_version = f"{csharp_extensions_version}-exp.1" + extension_version = f"{csharp_extensions_version}-preview" print( f"Setting package version to {package_version} in {MLAGENTS_PACKAGE_JSON_PATH}" f" and {MLAGENTS_EXTENSIONS_PACKAGE_JSON_PATH}" From 9d34978a4396bf09c5c4c81007fa57ee391f5b38 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 4 Oct 2024 15:58:03 -0400 Subject: [PATCH 40/43] Fixed failing GPU test. --- ml-agents/mlagents/trainers/tests/test_torch_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ml-agents/mlagents/trainers/tests/test_torch_utils.py b/ml-agents/mlagents/trainers/tests/test_torch_utils.py index f0d69e3564..a8e15a4a26 100644 --- a/ml-agents/mlagents/trainers/tests/test_torch_utils.py +++ b/ml-agents/mlagents/trainers/tests/test_torch_utils.py @@ -11,8 +11,8 @@ "device_str, expected_type, expected_index, expected_tensor_type", [ ("cpu", "cpu", None, torch.float32), - ("cuda", "cuda", None, torch.cuda.FloatTensor), - ("cuda:42", "cuda", 42, torch.cuda.FloatTensor), + ("cuda", "cuda", None, torch.float32), + ("cuda:42", "cuda", 42, torch.float32), ("opengl", "opengl", None, torch.float32), ], ) From 24485edd08014c0dd7b3e1966eb7e971e4cdf663 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 4 Oct 2024 19:06:55 -0400 Subject: [PATCH 41/43] Fixed failing GPU test. --- .../mlagents/trainers/tests/torch_entities/test_attention.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ml-agents/mlagents/trainers/tests/torch_entities/test_attention.py b/ml-agents/mlagents/trainers/tests/torch_entities/test_attention.py index f7344a647b..1a210987bc 100644 --- a/ml-agents/mlagents/trainers/tests/torch_entities/test_attention.py +++ b/ml-agents/mlagents/trainers/tests/torch_entities/test_attention.py @@ -1,5 +1,5 @@ import pytest -from mlagents.torch_utils import torch +from mlagents.torch_utils import torch, default_device import numpy as np from mlagents.trainers.torch_entities.utils import ModelUtils @@ -217,7 +217,7 @@ def test_predict_minimum_training(): argmin = argmin.squeeze() argmin = argmin.detach() sliced_oh = onehots[:, : num + 1] - inp = torch.cat([inp, sliced_oh], dim=2) + inp = torch.cat([inp, sliced_oh.to(default_device())], dim=2) embeddings = entity_embedding(inp, inp) masks = get_zero_entities_mask([inp]) From 501ba880cc047f3efe0b140b6908ce26fa12b382 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Fri, 4 Oct 2024 22:24:03 -0400 Subject: [PATCH 42/43] Updated readme table and make_readme_table.py --- docs/Readme.md | 5 +++-- utils/make_readme_table.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/Readme.md b/docs/Readme.md index 4b77ef9db8..0c5c6fa53b 100644 --- a/docs/Readme.md +++ b/docs/Readme.md @@ -44,7 +44,7 @@ See our [ML-Agents Overview](ML-Agents-Overview.md) page for detailed descriptions of all these features. Or go straight to our [web docs](https://unity-technologies.github.io/ml-agents/). ## Releases & Documentation -**Our latest, stable release is `Release 21`. Click +**Our latest, stable release is `Release 22`. Click [here](Getting-Started.md) to get started with the latest release of ML-Agents.** @@ -67,8 +67,9 @@ under active development and may be unstable. A few helpful guidelines: | **Version** | **Release Date** | **Source** | **Documentation** | **Download** | **Python Package** | **Unity Package** | |:--------------------------:|:------:|:-------------:|:-------:|:------------:|:------------:|:------------:| +| **Release 22** | **October 5, 2024** | **[source](https://github.com/Unity-Technologies/ml-agents/tree/release_22)** | **[docs](https://unity-technologies.github.io/ml-agents/)** | **[download](https://github.com/Unity-Technologies/ml-agents/archive/release_22.zip)** | **[1.1.0](https://pypi.org/project/mlagents/1.1.0/)** | **[3.0.0](https://docs.unity3d.com/Packages/com.unity.ml-agents@3.0/manual/index.html)** | | **develop (unstable)** | -- | [source](https://github.com/Unity-Technologies/ml-agents/tree/develop) | [docs](https://unity-technologies.github.io/ml-agents/) | [download](https://github.com/Unity-Technologies/ml-agents/archive/develop.zip) | -- | -- | -| **Release 21** | **October 9, 2023** | **[source](https://github.com/Unity-Technologies/ml-agents/tree/release_22)** | **[docs](https://unity-technologies.github.io/ml-agents/)** | **[download](https://github.com/Unity-Technologies/ml-agents/archive/release_22.zip)** | **[1.0.0](https://pypi.org/project/mlagents/1.0.0/)** | **[3.0.0](https://docs.unity3d.com/Packages/com.unity.ml-agents@3.0/manual/index.html)** | + If you are a researcher interested in a discussion of Unity as an AI platform, diff --git a/utils/make_readme_table.py b/utils/make_readme_table.py index 12056f31c2..bf467fd731 100644 --- a/utils/make_readme_table.py +++ b/utils/make_readme_table.py @@ -140,7 +140,8 @@ def pypi_link(self): ReleaseInfo("release_18", "2.1.0", "0.27.0", "June 9, 2021"), ReleaseInfo("release_19", "2.2.1", "0.28.0", "January 14, 2022"), ReleaseInfo("release_20", "2.3.0", "0.30.0", "November 21, 2022"), - ReleaseInfo("release_21", "3.0.0", "1.0.0", "October 9, 2023"), + ReleaseInfo("release_21", "3.0.0-exp.1", "1.0.0", "October 9, 2023"), + ReleaseInfo("release_22", "3.0.0", "1.1.0", "October 5, 2024"), # Verified releases # ReleaseInfo("", "1.0.8", "0.16.1", "May 26, 2021", is_verified=True), # ReleaseInfo("", "1.0.7", "0.16.1", "March 8, 2021", is_verified=True), From 200fe54e14b649d6eac66a7f0779c1086c506919 Mon Sep 17 00:00:00 2001 From: Miguel Alonso Jr Date: Sat, 5 Oct 2024 09:49:26 -0400 Subject: [PATCH 43/43] Updated publish to pypi gha. --- .github/workflows/publish_pypi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_pypi.yaml b/.github/workflows/publish_pypi.yaml index a6f5f06455..2a00b82a89 100644 --- a/.github/workflows/publish_pypi.yaml +++ b/.github/workflows/publish_pypi.yaml @@ -35,7 +35,7 @@ jobs: python setup.py bdist_wheel - name: Publish distribution 📦 to Test PyPI if: startsWith(github.ref, 'refs/tags') && contains(github.ref, 'test') - uses: pypa/gh-action-pypi-publish@master + uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.TEST_PYPI_PASSWORD }} repository_url: https://test.pypi.org/legacy/