├── CHANGELOG.md ├── .gitattributes ├── ProjectSettings ├── ProjectVersion.txt ├── ClusterInputManager.asset ├── NetworkManager.asset ├── EditorBuildSettings.asset ├── XRSettings.asset ├── TimeManager.asset ├── VFXManager.asset ├── AudioManager.asset ├── TagManager.asset ├── EditorSettings.asset ├── PresetManager.asset ├── UnityConnectSettings.asset ├── PackageManagerSettings.asset ├── DynamicsManager.asset ├── Physics2DSettings.asset ├── NavMeshAreas.asset ├── GraphicsSettings.asset ├── QualitySettings.asset └── InputManager.asset ├── .vsconfig ├── Assets ├── VRCAvatars3Validator │ ├── Editor │ │ ├── Mocks │ │ │ ├── VRCSDKRequestedBuildTypeMock.cs │ │ │ ├── VRCSdkControlPanelAvatarBuilderMock.cs │ │ │ ├── VRCAvatarDescriptorMock.cs.meta │ │ │ ├── VRCExpressionsMenuMock.cs.meta │ │ │ ├── VRCExpressionParametersMock.cs.meta │ │ │ ├── VRCSDKRequestedBuildTypeMock.cs.meta │ │ │ ├── VRCSdkControlPanelAvatarBuilderMock.cs.meta │ │ │ ├── IVRCSDKBuildRequestedCallbackMockIVRCSDKBuildRequestedCallbackMock.cs.meta │ │ │ ├── IVRCSDKBuildRequestedCallbackMockIVRCSDKBuildRequestedCallbackMock.cs │ │ │ ├── VRCExpressionParametersMock.cs │ │ │ ├── VRCExpressionsMenuMock.cs │ │ │ └── VRCAvatarDescriptorMock.cs │ │ ├── Langs.meta │ │ ├── Mocks.meta │ │ ├── Models.meta │ │ ├── Rules.meta │ │ ├── UseCases.meta │ │ ├── Utilities.meta │ │ ├── Views.meta │ │ ├── Interfaces.meta │ │ ├── ViewModels.meta │ │ ├── Langs │ │ │ ├── EN.asset.meta │ │ │ ├── JA.asset.meta │ │ │ ├── EN.asset │ │ │ └── JA.asset │ │ ├── Models │ │ │ ├── LanguageType.cs │ │ │ ├── RuleItem.cs │ │ │ ├── RuleItem.cs.meta │ │ │ ├── JsonDictionary.cs.meta │ │ │ ├── LanguagePack.cs.meta │ │ │ ├── LanguageType.cs.meta │ │ │ ├── ValidateResult.cs.meta │ │ │ ├── RuleItemOptions.cs.meta │ │ │ ├── ValidatorSettings.cs.meta │ │ │ ├── ValidatorSettings.cs │ │ │ ├── JsonDictionary.cs │ │ │ ├── ValidateResult.cs │ │ │ ├── RuleItemOptions.cs │ │ │ └── LanguagePack.cs │ │ ├── Interfaces │ │ │ ├── Settingable.cs │ │ │ ├── IRule.cs.meta │ │ │ ├── Settingable.cs.meta │ │ │ └── IRule.cs │ │ ├── AvatarUploadWatcher.cs.meta │ │ ├── Rules │ │ │ ├── TemplateRule.cs.meta │ │ │ ├── HaveEmptyStateRule.cs.meta │ │ │ ├── ControllerLayerWeightRule.cs.meta │ │ │ ├── ExpressionsSubMenuRule.cs.meta │ │ │ ├── HaveExParamsInControllersRule.cs.meta │ │ │ ├── HaveNoMissingAnimationPathRule.cs.meta │ │ │ ├── HaveTransformAnimationRule.cs.meta │ │ │ ├── TemplateRule.cs │ │ │ ├── ControllerLayerWeightRule.cs │ │ │ ├── HaveEmptyStateRule.cs │ │ │ ├── ExpressionsSubMenuRule.cs │ │ │ ├── HaveExParamsInControllersRule.cs │ │ │ ├── HaveTransformAnimationRule.cs │ │ │ └── HaveNoMissingAnimationPathRule.cs │ │ ├── UseCases │ │ │ ├── Localize.cs.meta │ │ │ ├── VRCAvatars3Validator.cs.meta │ │ │ ├── VRCAvatars3Validator.cs │ │ │ └── Localize.cs │ │ ├── Utilities │ │ │ ├── RuleUtility.cs.meta │ │ │ ├── VRCAvatarUtility.cs.meta │ │ │ ├── UtilityExtensionTools.cs.meta │ │ │ ├── ValidatorSettingsUtility.cs.meta │ │ │ ├── UtilityExtensionTools.cs │ │ │ ├── RuleUtility.cs │ │ │ ├── VRCAvatarUtility.cs │ │ │ └── ValidatorSettingsUtility.cs │ │ ├── Views │ │ │ ├── LanguagePackAttribute.cs.meta │ │ │ ├── VRCAvatars3ValidatorView.cs.meta │ │ │ ├── VRCAvatars3ValidatorSettingsProvider.cs.meta │ │ │ ├── VRCAvatars3ValidatorSettingsProvider.cs │ │ │ ├── LanguagePackAttribute.cs │ │ │ └── VRCAvatars3ValidatorView.cs │ │ ├── ViewModels │ │ │ ├── VRCAvatars3ValidatorViewModel.cs.meta │ │ │ └── VRCAvatars3ValidatorViewModel.cs │ │ └── AvatarUploadWatcher.cs │ ├── package.json.meta │ ├── Editor.meta │ └── package.json ├── Editor.meta ├── ScriptTemplates.meta ├── VRCAV3ValidTest.meta ├── VRCAV3ValidTest │ ├── Editor.meta │ └── Editor │ │ ├── Tests.meta │ │ └── Tests │ │ ├── Models.meta │ │ ├── ExpressionsSubMenuRule │ │ ├── TestAvatar.prefab.meta │ │ ├── ExpressionsMenu.asset.meta │ │ ├── ExpressionsSubMenu 1.asset.meta │ │ ├── ExpressionsSubMenu 2.asset.meta │ │ ├── ExpressionsSubMenu 2.asset │ │ ├── ExpressionsSubMenu 1.asset │ │ ├── ExpressionsMenu.asset │ │ └── TestAvatar.prefab │ │ ├── ExpressionsSubMenuRule.meta │ │ ├── HaveNoMissingAnimationPathRule │ │ ├── AvatarRoot.prefab.meta │ │ ├── FX.controller.meta │ │ ├── HaveMissing.anim.meta │ │ ├── NoMissing.anim.meta │ │ ├── HaveMissing2.anim.meta │ │ ├── HaveMissing.anim │ │ ├── HaveMissing2.anim │ │ ├── NoMissing.anim │ │ ├── FX.controller │ │ └── AvatarRoot.prefab │ │ ├── HaveNoMissingAnimationPathRule.meta │ │ ├── ExpressionsSubMenuRuleTest.cs.meta │ │ ├── HaveNoMissingAnimationPathRuleTest.cs.meta │ │ ├── ExpressionsSubMenuRuleTest.cs │ │ └── HaveNoMissingAnimationPathRuleTest.cs ├── VRCAvatars3Validator.meta ├── ScriptTemplates │ ├── 81-C# VRCAvatars3ValidatorRule-NewRule.cs.txt.meta │ └── 81-C# VRCAvatars3ValidatorRule-NewRule.cs.txt └── Editor │ ├── UnityPackageExporter.cs.meta │ └── UnityPackageExporter.cs ├── LICENSE.meta ├── CHANGELOG.md.meta ├── README.md.meta ├── .github ├── ISSUE_TEMPLATE │ ├── request-new-rule------------.md │ ├── feature-request-----.md │ └── bug-report--------.md └── workflows │ ├── activation.yml │ └── release.yml ├── LICENSE ├── .gitignore ├── Packages ├── manifest.json └── packages-lock.json └── README.md /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # [v1.0] - 2021-05-26 2 | 3 | - first release 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2019.4.31f1 2 | m_EditorVersionWithRevision: 2019.4.31f1 (bd5abf232a62) 3 | -------------------------------------------------------------------------------- /.vsconfig: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "components": [ 4 | "Microsoft.VisualStudio.Workload.ManagedGame" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCSDKRequestedBuildTypeMock.cs: -------------------------------------------------------------------------------- 1 | namespace VRCAvatars3Validator.Mocks 2 | { 3 | public class VRCSDKRequestedBuildTypeMock 4 | { 5 | } 6 | } -------------------------------------------------------------------------------- /LICENSE.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6f049594550bf4e4da8d6b5406a39665 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /CHANGELOG.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1a1b19affbd507f4a9fdfba11ea2a6c6 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bde18f8267e635944bbb9b6b4eb4cb9c 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCSdkControlPanelAvatarBuilderMock.cs: -------------------------------------------------------------------------------- 1 | namespace VRCAvatars3Validator.Mocks 2 | { 3 | public class VRCSdkControlPanelAvatarBuilderMock 4 | { 5 | } 6 | } -------------------------------------------------------------------------------- /Assets/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ec7c78d60236d5542929e7ec4545ee9a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /Assets/ScriptTemplates.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 236122be90e571f459dd079453cd7470 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 72ae1a1d6f789c14598aaff61139d958 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e6a31c0bfb5f0be4db8601fbfd717921 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 020b82bfeeca96249844ef64a59b4840 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f495ee653653854438656501060733ab 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 166dbe07c0da88b4b8512c9661c4d90f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 24e8a2d62f9e1074587105fda9b6f4bf 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/Models.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b8cccb8ab15c9c545beb9a34f37734c5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Langs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 196adc3a9248241499b0ff5ed39f13d4 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ae41128ffc4620a4db016d902836c2cd 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1fc4260ac79ec844a879364645db9c0a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b59fbb4cf72cc4a48962130e993deb66 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/UseCases.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 158e72d5c0496144f81fe605070458d8 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 83dff1d7c14ccff498bac94dcdaaa5eb 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Views.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 92a47e2130e818d4f9336d9f315278a4 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Interfaces.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ebdf0c50d80ae0549a626eee7764b243 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/ViewModels.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 90bc9a7f6a3c60f43a47ba8195767a03 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/ScriptTemplates/81-C# VRCAvatars3ValidatorRule-NewRule.cs.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f890a778db5023d4dab9d847df0d8a8b 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/TestAvatar.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4af480d8b06d1e948a211660b844a55e 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0a2d3f26e8db4b6409d888b1cfd210f6 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/AvatarRoot.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bf0785317e095d54483b43e4821470dd 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 073b72a26f0a17049bb7d87affcc8573 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Langs/EN.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f54568a67bf53e242b2525c27a648d93 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Langs/JA.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 59579ba22684a2b499f7d90dd4b57446 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.1 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/LanguageType.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace VRCAvatars3Validator.Models 6 | { 7 | public enum LanguageType 8 | { 9 | JA, EN 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/ExpressionsMenu.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fb299a6d92bd39444bbf3ed1162c841d 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/FX.controller.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 39da2c23fc38aa640829bf155bcb8d88 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 9100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/HaveMissing.anim.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2efc90e0d0024f24f9e72f6b6325138b 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 7400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/NoMissing.anim.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 80e8a5336587e314c984d3ca6aebb4e8 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 7400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Interfaces/Settingable.cs: -------------------------------------------------------------------------------- 1 | using VRCAvatars3Validator.Models; 2 | 3 | namespace VRCAvatars3Validator 4 | { 5 | public interface Settingable 6 | { 7 | object Options { get; } 8 | void OnGUI(RuleItemOptions options); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/ExpressionsSubMenu 1.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d45114c3013d98b4d85df714fa36ca57 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/ExpressionsSubMenu 2.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 04a550970d05e884c968c4e41b156cd7 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/HaveMissing2.anim.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7a10dddcd1fb33c48b79d0eafe93949f 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 7400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Editor/UnityPackageExporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1dfe2282fafe35940afbd17f245a81f5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/RuleItem.cs: -------------------------------------------------------------------------------- 1 | namespace VRCAvatars3Validator.Models 2 | { 3 | [System.Serializable] 4 | public class RuleItem 5 | { 6 | public string Name; 7 | public string FilePath; 8 | public bool Enabled; 9 | public RuleItemOptions Options; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Interfaces/IRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 387a821172bd3d14bbbef1baab0f45d8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/RuleItem.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 67344a21f52e379458e65ca27a366735 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/AvatarUploadWatcher.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 82af8dfd9f99c784f826cdd90d6e7527 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/JsonDictionary.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b17c63cb379fe7344a9b63a9f850df4f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/LanguagePack.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1e5494b88e46dca47947ab5b0186d7a8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/LanguageType.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 88b3c458782e42e459e9c64a8362bd04 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/ValidateResult.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 56fc3042cf418c7469ce1ff91d8639ba 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/TemplateRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c11adf2526cd5a94890e99579dab4413 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/UseCases/Localize.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c8690403fe30d0f4a8a7458fdc417db9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/RuleUtility.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: deca147dd68fdba48a714832b483f9a3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_RenderPipeSettingsPath: 10 | m_FixedTimeStep: 0.016666668 11 | m_MaxDeltaTime: 0.05 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Interfaces/Settingable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ae0a0490e78728a4ea0782312da97804 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/RuleItemOptions.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 377351f3605b3d2499d9da2ca6c3d71b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/ValidatorSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 76a91ac18e37052439b8d71206ae3c46 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveEmptyStateRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 41428c56f07f50a469f4e358642cf18d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/VRCAvatarUtility.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f7949ebd546d6ce43909bb3f50054aa3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRuleTest.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 696d157766b3b6748997def09d44a58e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCAvatarDescriptorMock.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a63238aa2245bc8459cf06f7c7ce68d4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCExpressionsMenuMock.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 64cbc2961151e4a4787ba1a88cba2dde 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/ControllerLayerWeightRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e4c26c9c9094ee54da717d8dfdf194a4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/ExpressionsSubMenuRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7e754f434507e604cb7c0cb34843d435 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/UseCases/VRCAvatars3Validator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2f3b6e06787f6ca418a2437761fc62b5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/UtilityExtensionTools.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b2987c4987be89b48bdcbe0c31e45da8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Views/LanguagePackAttribute.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3e0b1cf628989ff4aa716505aec6552f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Views/VRCAvatars3ValidatorView.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1d5eb479a761edf41be1d26d92f5f682 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRuleTest.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce349409859c40544bc1cfae83015eb5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCExpressionParametersMock.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2abd2c683ace5564686a28eb3a068774 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCSDKRequestedBuildTypeMock.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f22abd56af3d0e4ba0528c6770d1b9c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveExParamsInControllersRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6d90dcf1aec3c4544ba1c00fd16d9248 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveNoMissingAnimationPathRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 41af40b87851d974fb32156fe2382da4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveTransformAnimationRule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 50580e44be258a64ab8db3eb6a286821 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/ValidatorSettingsUtility.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 54bb5e98914e53a40aebeee81ff1a27a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCSdkControlPanelAvatarBuilderMock.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f3589c861a6ac0d41b47eda8492c132b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/ViewModels/VRCAvatars3ValidatorViewModel.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9621c9973442b864ba2133751b8a539c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Views/VRCAvatars3ValidatorSettingsProvider.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1f7ac91d58b3ff14b9d7fc94125a0326 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/IVRCSDKBuildRequestedCallbackMockIVRCSDKBuildRequestedCallbackMock.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 51e72c79fb41a60499583a48d7c9624a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/IVRCSDKBuildRequestedCallbackMockIVRCSDKBuildRequestedCallbackMock.cs: -------------------------------------------------------------------------------- 1 | using VRCSDKRequestedBuildType = VRCAvatars3Validator.Mocks.VRCSDKRequestedBuildTypeMock; 2 | 3 | namespace VRCAvatars3Validator.Mocks 4 | { 5 | public interface IVRCSDKBuildRequestedCallbackMock 6 | { 7 | int callbackOrder { get; } 8 | bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType); 9 | } 10 | } -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | m_Volume: 1 7 | Rolloff Scale: 1 8 | Doppler Factor: 1 9 | Default Speaker Mode: 2 10 | m_SampleRate: 0 11 | m_DSPBufferSize: 1024 12 | m_VirtualVoiceCount: 512 13 | m_RealVoiceCount: 32 14 | m_SpatializerPlugin: 15 | m_AmbisonicDecoderPlugin: 16 | m_DisableAudio: 0 17 | m_VirtualizeEffects: 1 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/request-new-rule------------.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Request new rule (新しいルールを提案) 3 | about: Request new rule to validate avatar of avatars3.0. (Avatars3.0のアバターを検証するための新しいルールを提案する) 4 | title: "[Rule] " 5 | labels: rule 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Rule summary (ルールの概要)** 11 | Write this. ここに書いてください 12 | 13 | **Usage scene (使用場面)** 14 | Write this. ここに書いてください 15 | 16 | **Supplement (補足)** 17 | Write this if have supplement. 補足があればここに書いてください 18 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/UtilityExtensionTools.cs: -------------------------------------------------------------------------------- 1 | using UnityEditor; 2 | using UnityEngine; 3 | 4 | public class UtilityExtensionTools : Editor 5 | { 6 | [MenuItem("Assets/Copy GUID")] 7 | public static void CopyGUID() 8 | { 9 | var asset = Selection.activeObject; 10 | var path = AssetDatabase.GetAssetPath(asset); 11 | var guid = AssetDatabase.AssetPathToGUID(path); 12 | GUIUtility.systemCopyBuffer = guid; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Assets/Editor/UnityPackageExporter.cs: -------------------------------------------------------------------------------- 1 | using UnityEditor; 2 | 3 | 4 | public static class UnityPackageExporter 5 | { 6 | public static void Export() 7 | { 8 | var exportDirs = new[] 9 | { 10 | "Assets/VRCAvatars3Validator" 11 | }; 12 | var exportPath = "./VRCAvatars3Validator.unitypackage"; 13 | 14 | AssetDatabase.ExportPackage( 15 | exportDirs, 16 | exportPath, 17 | ExportPackageOptions.Recurse); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "net.gatosyocora.vrcavatars3validator", 3 | "displayName": "VRCAvatars3Validator", 4 | "version": "1.0.0", 5 | "unity": "2018.4.20f1", 6 | "description": "Unity Editor extension to detect errors of VRChat avatar", 7 | "author": { 8 | "name": "gatosyocora", 9 | "url": "https://github.com/gatosyocora/VRCAvatars3Validator" 10 | }, 11 | 12 | "keywords": [ 13 | "VRChat", 14 | "Avatars3.0", 15 | "Unity" 16 | ], 17 | 18 | "dependencies": { 19 | }, 20 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/ValidatorSettings.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using UnityEditor; 6 | using UnityEngine; 7 | 8 | namespace VRCAvatars3Validator.Models 9 | { 10 | public class ValidatorSettings : ScriptableObject 11 | { 12 | public bool validateOnUploadAvatar = true; 13 | public bool suspendUploadingByWarningMessage = true; 14 | 15 | public LanguageType languageType = LanguageType.EN; 16 | 17 | public List rules = new List(); 18 | } 19 | } -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - PostProcessing 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request-----.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request (要望) 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 7 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 2 10 | m_DefaultBehaviorMode: 0 11 | m_SpritePackerMode: 0 12 | m_SpritePackerPaddingPower: 1 13 | m_EtcTextureCompressorBehavior: 1 14 | m_EtcTextureFastCompressor: 1 15 | m_EtcTextureNormalCompressor: 2 16 | m_EtcTextureBestCompressor: 4 17 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd 18 | m_ProjectGenerationRootNamespace: 19 | m_UserGeneratedProjectSuffix: 20 | m_CollabEditorSettings: 21 | inProgressEnabled: 1 22 | -------------------------------------------------------------------------------- /.github/workflows/activation.yml: -------------------------------------------------------------------------------- 1 | name: Acquire activation file 2 | on: 3 | workflow_dispatch: {} 4 | jobs: 5 | activation: 6 | name: Request manual activation file 🔑 7 | runs-on: ubuntu-latest 8 | steps: 9 | # Request manual activation file 10 | - name: Request manual activation file 11 | id: getManualLicenseFile 12 | uses: game-ci/unity-request-activation-file@v2 13 | with: 14 | unityVersion: 2018.4.20f1 15 | # Upload artifact (Unity_v20XX.X.XXXX.alf) 16 | - name: Expose as artifact 17 | uses: actions/upload-artifact@v2 18 | with: 19 | name: ${{ steps.getManualLicenseFile.outputs.filePath }} 20 | path: ${{ steps.getManualLicenseFile.outputs.filePath }} 21 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/ExpressionsSubMenu 2.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: -340790334, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} 13 | m_Name: ExpressionsSubMenu 2 14 | m_EditorClassIdentifier: 15 | controls: 16 | - name: Unset Sub Menu 4 17 | icon: {fileID: 0} 18 | type: 103 19 | parameter: 20 | name: 21 | value: 1 22 | style: 0 23 | subMenu: {fileID: 0} 24 | subParameters: [] 25 | labels: [] 26 | -------------------------------------------------------------------------------- /Assets/ScriptTemplates/81-C# VRCAvatars3ValidatorRule-NewRule.cs.txt: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System; 4 | using System.Linq; 5 | using UnityEngine; 6 | using VRCAvatars3Validator.Models; 7 | #if VRC_SDK_VRCSDK3 8 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 9 | #else 10 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 11 | #endif 12 | 13 | namespace VRCAvatars3Validator.Rules 14 | { 15 | public class #SCRIPTNAME# : IRule 16 | { 17 | public string RuleSummary => "#SCRIPTNAME#"; 18 | 19 | public IEnumerable Validate(VRCAvatarDescriptor avatar) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCExpressionParametersMock.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace VRCAvatars3Validator.Mocks 4 | { 5 | public class VRCExpressionParametersMock : ScriptableObject 6 | { 7 | public const int MAX_PARAMETERS = 16; 8 | public Parameter[] parameters; 9 | 10 | //public VRCExpressionParameters(); 11 | 12 | //public Parameter FindParameter(string name); 13 | //public Parameter GetParameter(int index); 14 | 15 | public enum ValueType 16 | { 17 | Int = 0, 18 | Float = 1, 19 | Bool = 2 20 | } 21 | 22 | public class Parameter 23 | { 24 | public string name; 25 | public ValueType valueType; 26 | 27 | //public Parameter(); 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Interfaces/IRule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | #if VRC_SDK_VRCSDK3 3 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 4 | #else 5 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 6 | #endif 7 | using VRCAvatars3Validator.Models; 8 | 9 | namespace VRCAvatars3Validator 10 | { 11 | public interface IRule 12 | { 13 | /// 14 | /// Rule summary. 15 | /// 16 | string RuleSummary { get; } 17 | 18 | /// 19 | /// Run validation by defined rules. 20 | /// 21 | /// Validated avatar 22 | /// Validate results 23 | IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options); 24 | } 25 | } -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | m_DefaultList: 7 | - type: 8 | m_NativeTypeID: 108 9 | m_ManagedTypePPtr: {fileID: 0} 10 | m_ManagedTypeFallback: 11 | defaultPresets: 12 | - m_Preset: {fileID: 2655988077585873504, guid: c1cf8506f04ef2c4a88b64b6c4202eea, 13 | type: 2} 14 | - type: 15 | m_NativeTypeID: 1020 16 | m_ManagedTypePPtr: {fileID: 0} 17 | m_ManagedTypeFallback: 18 | defaultPresets: 19 | - m_Preset: {fileID: 2655988077585873504, guid: 0cd792cc87e492d43b4e95b205fc5cc6, 20 | type: 2} 21 | - type: 22 | m_NativeTypeID: 1006 23 | m_ManagedTypePPtr: {fileID: 0} 24 | m_ManagedTypeFallback: 25 | defaultPresets: 26 | - m_Preset: {fileID: 2655988077585873504, guid: 7a99f8aa944efe94cb9bd74562b7d5f9, 27 | type: 2} 28 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/TemplateRule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | #if VRC_SDK_VRCSDK3 3 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 4 | #else 5 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 6 | #endif 7 | using VRCAvatars3Validator.Models; 8 | 9 | namespace VRCAvatars3Validator.Rules 10 | { 11 | /// 12 | /// Write rule summary. 13 | /// 14 | public class TemplateRule : IRule 15 | { 16 | public string RuleSummary => "Write rule summary."; 17 | 18 | public IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options) 19 | { 20 | // Write validation code. 21 | // Return validation result if have error. 22 | yield return new ValidateResult( 23 | null, 24 | ValidateResult.ValidateResultType.Error, 25 | "Write result message."); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_TestInitMode: 0 13 | CrashReportingSettings: 14 | m_EventUrl: https://perf-events.cloud.unity3d.com 15 | m_Enabled: 0 16 | m_LogBufferSize: 10 17 | m_CaptureEditorExceptions: 1 18 | UnityPurchasingSettings: 19 | m_Enabled: 0 20 | m_TestMode: 0 21 | UnityAnalyticsSettings: 22 | m_Enabled: 0 23 | m_TestMode: 0 24 | m_InitializeOnStartup: 1 25 | UnityAdsSettings: 26 | m_Enabled: 0 27 | m_InitializeOnStartup: 1 28 | m_TestMode: 0 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report--------.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report (不具合報告) 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/ExpressionsSubMenu 1.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: -340790334, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} 13 | m_Name: ExpressionsSubMenu 1 14 | m_EditorClassIdentifier: 15 | controls: 16 | - name: Unset Sub Menu 3 17 | icon: {fileID: 0} 18 | type: 103 19 | parameter: 20 | name: 21 | value: 1 22 | style: 0 23 | subMenu: {fileID: 0} 24 | subParameters: [] 25 | labels: [] 26 | - name: Set Sub Menu 2 27 | icon: {fileID: 0} 28 | type: 103 29 | parameter: 30 | name: 31 | value: 1 32 | style: 0 33 | subMenu: {fileID: 11400000, guid: 04a550970d05e884c968c4e41b156cd7, type: 2} 34 | subParameters: [] 35 | labels: [] 36 | -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_ScopedRegistriesSettingsExpanded: 1 16 | oneTimeWarningShown: 0 17 | m_Registries: 18 | - m_Id: main 19 | m_Name: 20 | m_Url: https://packages.unity.com 21 | m_Scopes: [] 22 | m_IsDefault: 1 23 | m_UserSelectedRegistryName: 24 | m_UserAddingNewScopedRegistry: 0 25 | m_RegistryInfoDraft: 26 | m_ErrorMessage: 27 | m_Original: 28 | m_Id: 29 | m_Name: 30 | m_Url: 31 | m_Scopes: [] 32 | m_IsDefault: 0 33 | m_Modified: 0 34 | m_Name: 35 | m_Url: 36 | m_Scopes: 37 | - 38 | m_SelectedScopeIndex: 0 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 gatosyocora 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 8 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/ExpressionsMenu.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: -340790334, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} 13 | m_Name: ExpressionsMenu 14 | m_EditorClassIdentifier: 15 | controls: 16 | - name: Unset Sub Menu 1 17 | icon: {fileID: 0} 18 | type: 103 19 | parameter: 20 | name: 21 | value: 1 22 | style: 0 23 | subMenu: {fileID: 0} 24 | subParameters: [] 25 | labels: [] 26 | - name: Unset Sub Menu 2 27 | icon: {fileID: 0} 28 | type: 103 29 | parameter: 30 | name: 31 | value: 1 32 | style: 0 33 | subMenu: {fileID: 0} 34 | subParameters: [] 35 | labels: [] 36 | - name: Set Sub Menu 37 | icon: {fileID: 0} 38 | type: 103 39 | parameter: 40 | name: 41 | value: 1 42 | style: 0 43 | subMenu: {fileID: 11400000, guid: d45114c3013d98b4d85df714fa36ca57, type: 2} 44 | subParameters: [] 45 | labels: [] 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Mm]emoryCaptures/ 12 | 13 | # Never ignore Asset meta data 14 | !/[Aa]ssets/**/*.meta 15 | 16 | # Uncomment this line if you wish to ignore the asset store tools plugin 17 | # /[Aa]ssets/AssetStoreTools* 18 | 19 | # Autogenerated Jetbrains Rider plugin 20 | [Aa]ssets/Plugins/Editor/JetBrains* 21 | 22 | # Visual Studio cache directory 23 | .vs/ 24 | 25 | # Gradle cache directory 26 | .gradle/ 27 | 28 | # Autogenerated VS/MD/Consulo solution and project files 29 | ExportedObj/ 30 | .consulo/ 31 | *.csproj 32 | *.unityproj 33 | *.sln 34 | *.suo 35 | *.tmp 36 | *.user 37 | *.userprefs 38 | *.pidb 39 | *.booproj 40 | *.svd 41 | *.pdb 42 | *.mdb 43 | *.opendb 44 | *.VC.db 45 | 46 | # Unity3D generated meta files 47 | *.pidb.meta 48 | *.pdb.meta 49 | *.mdb.meta 50 | 51 | # Unity3D generated file on crash reports 52 | sysinfo.txt 53 | 54 | # Builds 55 | *.apk 56 | *.unitypackage 57 | 58 | # Crashlytics generated file 59 | crashlytics-build.properties 60 | 61 | Assets/* 62 | !Assets/VRCAvatars3Validator* 63 | !Assets/ScriptTemplates.?* 64 | !Assets/Editor 65 | !Assets/Editor/UnityPackageExporter.* 66 | !Assets/VRCAV3ValidTest* 67 | 68 | Assets/VRCAvatars3Validator/Editor/Settings.asset 69 | Assets/VRCAvatars3Validator/Editor/Settings.asset.meta 70 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/UseCases/VRCAvatars3Validator.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | #if VRC_SDK_VRCSDK3 4 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 5 | #else 6 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 7 | #endif 8 | using VRCAvatars3Validator.Models; 9 | using VRCAvatars3Validator.Utilities; 10 | 11 | namespace VRCAvatars3Validator 12 | { 13 | public sealed class VRCAvatars3Validator 14 | { 15 | public static Dictionary> ValidateAvatars3(VRCAvatarDescriptor avatar, IEnumerable rules) 16 | { 17 | if (avatar == null) 18 | return new Dictionary>(); 19 | return rules.Select((rule, index) => new { Rule = rule, Index = index}) 20 | .Where(rulePair => rulePair.Rule.Enabled) 21 | .Select(rulePair => 22 | { 23 | var rule = RuleUtility.FilePath2IRule(rulePair.Rule.FilePath); 24 | var results = rule.Validate(avatar, rulePair.Rule.Options); 25 | if (!results.Any()) return new KeyValuePair>(0, null); 26 | return new KeyValuePair>(rulePair.Index + 1, results); 27 | }) 28 | .Where(x => x.Key > 0) 29 | .ToDictionary(resultPair => resultPair.Key, resultPair => resultPair.Value); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_AutoSimulation: 1 23 | m_QueriesHitTriggers: 1 24 | m_QueriesStartInColliders: 1 25 | m_ChangeStopsCallbacks: 0 26 | m_CallbacksOnDisable: 1 27 | m_ReuseCollisionCallbacks: 1 28 | m_AutoSyncTransforms: 0 29 | m_AlwaysShowColliders: 0 30 | m_ShowColliderSleep: 1 31 | m_ShowColliderContacts: 0 32 | m_ShowColliderAABB: 0 33 | m_ContactArrowScale: 0.2 34 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 35 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 36 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 37 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 38 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 39 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/ControllerLayerWeightRule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | #if VRC_SDK_VRCSDK3 3 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 4 | #else 5 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 6 | #endif 7 | using VRCAvatars3Validator.Models; 8 | using VRCAvatars3Validator.Utilities; 9 | 10 | namespace VRCAvatars3Validator.Rules 11 | { 12 | /// 13 | /// Weight0のレイヤーを持つかどうか 14 | /// 15 | public class ControllerLayerWeightRule : IRule 16 | { 17 | public string RuleSummary => Localize.Translate("ControllerLayerWeightRule_summary"); 18 | 19 | public IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options) 20 | { 21 | var controllers = VRCAvatarUtility.GetControllers(avatar); 22 | 23 | foreach (var controller in controllers) 24 | { 25 | // 一番上のLayerは内部的にweight0であっても強制的に1になるので調べない 26 | for (int i = 1; i < controller.layers.Length; i++) 27 | { 28 | var layer = controller.layers[i]; 29 | if (layer.defaultWeight == 0) 30 | { 31 | yield return new ValidateResult( 32 | controller, 33 | ValidateResult.ValidateResultType.Warning, 34 | Localize.Translate("ControllerLayerWeightRule_result", layer.name, controller.name)); 35 | } 36 | } 37 | } 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/JsonDictionary.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEngine; 5 | 6 | namespace Kogane 7 | { 8 | [Serializable] 9 | public struct KeyValuePair 10 | { 11 | [SerializeField] private string key; 12 | 13 | [SerializeField] private string value; 14 | 15 | public string Key => key; 16 | public string Value => value; 17 | 18 | public KeyValuePair(string key, string value) 19 | { 20 | this.key = key; 21 | this.value = value; 22 | } 23 | } 24 | 25 | [Serializable] 26 | public class JsonDictionary : ISerializationCallbackReceiver 27 | { 28 | public string this[string index] => dictionary.Where(x => x.Key == index).Single().Value; 29 | 30 | [SerializeField] private KeyValuePair[] dictionary = default; 31 | 32 | private Dictionary m_dictionary; 33 | 34 | public Dictionary Dictionary => m_dictionary; 35 | 36 | public JsonDictionary(Dictionary dictionary) 37 | { 38 | m_dictionary = dictionary; 39 | } 40 | 41 | void ISerializationCallbackReceiver.OnBeforeSerialize() 42 | { 43 | dictionary = m_dictionary 44 | .Select(x => new KeyValuePair(x.Key, x.Value)) 45 | .ToArray(); 46 | } 47 | 48 | void ISerializationCallbackReceiver.OnAfterDeserialize() 49 | { 50 | m_dictionary = dictionary.ToDictionary(x => x.Key, x => x.Value); 51 | dictionary = null; 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/UseCases/Localize.cs: -------------------------------------------------------------------------------- 1 | using Kogane; 2 | using System; 3 | using UnityEditor; 4 | using UnityEngine; 5 | using VRCAvatars3Validator.Models; 6 | using VRCAvatars3Validator.Utilities; 7 | 8 | namespace VRCAvatars3Validator 9 | { 10 | public class Localize 11 | { 12 | public static string LANGUAGE_PACK_FOLDER = "Assets/VRCAvatars3Validator/Editor/Langs/"; 13 | 14 | public static ValidatorSettings settings = ValidatorSettingsUtility.GetOrCreateSettings(); 15 | public static LanguageType languageType; 16 | 17 | public static LanguagePack languagePack; 18 | 19 | public static JsonDictionary translateDictionary; 20 | 21 | public static string Translate(string textId, params string[] values) 22 | { 23 | if (languageType != settings.languageType) 24 | { 25 | languageType = settings.languageType; 26 | languagePack = null; 27 | translateDictionary = null; 28 | } 29 | 30 | if (languagePack == null) 31 | { 32 | languagePack = AssetDatabase.LoadAssetAtPath($"{LANGUAGE_PACK_FOLDER}{languageType}.asset"); 33 | } 34 | 35 | if (translateDictionary == null) 36 | { 37 | translateDictionary = JsonUtility.FromJson(languagePack.data); 38 | } 39 | var text = translateDictionary.Dictionary[textId]; 40 | for(int i = 0; i < values.Length; i++) 41 | { 42 | text = text.Replace($"<{i + 1}>", values[i]); 43 | } 44 | return text; 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveEmptyStateRule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using VRCAvatars3Validator.Models; 3 | using VRCAvatars3Validator.Utilities; 4 | #if VRC_SDK_VRCSDK3 5 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 6 | #else 7 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 8 | #endif 9 | 10 | namespace VRCAvatars3Validator.Rules 11 | { 12 | public class HaveEmptyStateRule : IRule 13 | { 14 | public string RuleSummary => Localize.Translate("HaveEmptyStateRule_summary"); 15 | 16 | public IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options) 17 | { 18 | var result = new List(); 19 | 20 | var controllers = VRCAvatarUtility.GetControllers(avatar); 21 | 22 | foreach (var controller in controllers) 23 | { 24 | foreach (var layer in controller.layers) 25 | { 26 | foreach (var childState in layer.stateMachine.states) 27 | { 28 | if (childState.state.motion == null) 29 | { 30 | result.Add(new ValidateResult( 31 | controller, 32 | ValidateResult.ValidateResultType.Error, 33 | Localize.Translate("HaveEmptyStateRule_result", childState.state.name, layer.name, controller.name) 34 | )); 35 | } 36 | } 37 | } 38 | } 39 | 40 | return result; 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/ValidateResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Object = UnityEngine.Object; 3 | 4 | namespace VRCAvatars3Validator.Models 5 | { 6 | public class ValidateResult 7 | { 8 | public enum ValidateResultType 9 | { 10 | Success, // No Problem 11 | Warning, // May need to fix 12 | Error, // Should fix 13 | } 14 | 15 | /// 16 | /// Fix target 17 | /// 18 | public Object Target { get; private set; } 19 | 20 | /// 21 | /// Fix proposal level 22 | /// 23 | public ValidateResultType ResultType { get; private set; } 24 | 25 | /// 26 | /// Result message 27 | /// 28 | public string ResultMessage { get; private set; } 29 | 30 | /// 31 | /// Way to fix 32 | /// 33 | public string SolutionMessage { get; private set; } 34 | 35 | /// 36 | /// Can use auto fix function 37 | /// 38 | public bool CanAutoFix { get => AutoFix != null; } 39 | 40 | /// 41 | /// auto fix function 42 | /// 43 | public Action AutoFix { get; private set; } 44 | 45 | public ValidateResult(Object target, ValidateResultType resultType, string resultMessage, string solutionMessage = "", Action autoFix = null) 46 | { 47 | Target = target; 48 | ResultType = resultType; 49 | ResultMessage = resultMessage; 50 | SolutionMessage = solutionMessage; 51 | AutoFix = autoFix; 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/RuleUtility.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using UnityEditor; 6 | 7 | namespace VRCAvatars3Validator.Utilities 8 | { 9 | public class RuleUtility 10 | { 11 | public const string RULES_FOLDER_PATH = "Assets/VRCAvatars3Validator/Editor/Rules"; 12 | public const string IGNORE_RULE_NAME = "TemplateRule"; 13 | 14 | public static IEnumerable GetRuleFilePaths() 15 | => Directory.EnumerateFiles(RULES_FOLDER_PATH, "*.cs", SearchOption.AllDirectories) 16 | .Where(filePath => !Path.GetFileNameWithoutExtension(filePath).Equals(IGNORE_RULE_NAME)); 17 | 18 | public static IEnumerable GetRules() 19 | => GetRuleFilePaths() 20 | .Select((filePath, index) => 21 | { 22 | return FilePath2IRule(filePath); 23 | }); 24 | 25 | public static IEnumerable GetRuleNames() 26 | => GetRuleFilePaths() 27 | .Select(filePath => Path.GetFileNameWithoutExtension(filePath)); 28 | 29 | public static IRule FilePath2IRule(string filePath) 30 | { 31 | var ruleAsset = AssetDatabase.LoadAssetAtPath(filePath); 32 | var type = ruleAsset.GetClass(); 33 | return Activator.CreateInstance(type) as IRule; 34 | } 35 | 36 | public static Settingable FilePath2Settingable(string filePath) 37 | { 38 | var ruleAsset = AssetDatabase.LoadAssetAtPath(filePath); 39 | var type = ruleAsset.GetClass(); 40 | return Activator.CreateInstance(type) as Settingable; 41 | } 42 | 43 | public static string FilePath2RuleName(string filePath) 44 | => Path.GetFileNameWithoutExtension(filePath); 45 | } 46 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCExpressionsMenuMock.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using VRCExpressionsMenu = VRCAvatars3Validator.Mocks.VRCExpressionsMenuMock; 4 | 5 | namespace VRCAvatars3Validator.Mocks 6 | { 7 | public class VRCExpressionsMenuMock : ScriptableObject 8 | { 9 | public const int MAX_CONTROLS = 8; 10 | public List controls; 11 | 12 | //public VRCExpressionsMenu(); 13 | 14 | public class Control 15 | { 16 | public string name; 17 | public Texture2D icon; 18 | public ControlType type; 19 | public Parameter parameter; 20 | public float value; 21 | public Style style; 22 | public VRCExpressionsMenu subMenu; 23 | public Parameter[] subParameters; 24 | public Label[] labels; 25 | 26 | //public Control(); 27 | 28 | //public Label GetLabel(int i); 29 | //public Parameter GetSubParameter(int i); 30 | 31 | public enum ControlType 32 | { 33 | Button = 101, 34 | Toggle = 102, 35 | SubMenu = 103, 36 | TwoAxisPuppet = 201, 37 | FourAxisPuppet = 202, 38 | RadialPuppet = 203 39 | } 40 | public enum Style 41 | { 42 | Style1 = 0, 43 | Style2 = 1, 44 | Style3 = 2, 45 | Style4 = 3 46 | } 47 | 48 | public struct Label 49 | { 50 | public string name; 51 | public Texture2D icon; 52 | } 53 | 54 | public class Parameter 55 | { 56 | public string name; 57 | //public Parameter(); 58 | public int hash { get; } 59 | //public static bool IsNull(Parameter parameter); 60 | } 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/VRCAvatarUtility.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEditor.Animations; 5 | using UnityEngine; 6 | #if VRC_SDK_VRCSDK3 7 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 8 | using VRCExpressionParameters = VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionParameters; 9 | #else 10 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 11 | using VRCExpressionParameters = VRCAvatars3Validator.Mocks.VRCExpressionParametersMock; 12 | #endif 13 | 14 | namespace VRCAvatars3Validator.Utilities 15 | { 16 | public static class VRCAvatarUtility 17 | { 18 | public static IEnumerable GetControllers(VRCAvatarDescriptor avatar) 19 | => avatar.baseAnimationLayers 20 | .Union(avatar.specialAnimationLayers) 21 | .Select(l => l.animatorController as AnimatorController) 22 | .Where(c => c != null); 23 | 24 | public static IEnumerable GetBaseAnimationLayers(VRCAvatarDescriptor avatar) 25 | => avatar.baseAnimationLayers 26 | .Where(l => l.animatorController != null); 27 | 28 | public static IEnumerable GetParameters(IEnumerable controllers) 29 | => controllers 30 | .Where(c => c != null) 31 | .SelectMany(c => c.parameters); 32 | 33 | public static VRCExpressionParameters GetExpressionParametersAsset(VRCAvatarDescriptor avatar) 34 | => avatar.expressionParameters; 35 | 36 | public static IEnumerable GetAnimationClips(VRCAvatarDescriptor avatar) 37 | => GetControllers(avatar) 38 | .SelectMany(controller => controller.animationClips); 39 | } 40 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/RuleItemOptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEditor; 3 | using UnityEngine; 4 | using VRCAvatars3Validator.Utilities; 5 | 6 | namespace VRCAvatars3Validator.Models 7 | { 8 | [Serializable] 9 | public class RuleItemOptions 10 | { 11 | public RuleItemOptions(object options) 12 | { 13 | if (options == null) return; 14 | jsonText = JsonUtility.ToJson(options); 15 | } 16 | 17 | [SerializeField] 18 | private string jsonText; 19 | 20 | public T ReadOptions() where T : class 21 | { 22 | if (jsonText == null || jsonText == "") 23 | return null; 24 | return JsonUtility.FromJson(jsonText); 25 | } 26 | 27 | public void WriteOptions(object options) 28 | { 29 | jsonText = JsonUtility.ToJson(options); 30 | EditorUtility.SetDirty(ValidatorSettingsUtility.GetOrCreateSettings()); 31 | } 32 | 33 | public void ChangeOptions(ChangeOptionsValueDelegate changeOptionsDelegate) where T : class 34 | { 35 | WriteOptions(changeOptionsDelegate(ReadOptions())); 36 | } 37 | 38 | public void ChangeOptions(ChangeOptionsVoidDelegate changeOptionsDelegate) where T : class, new() 39 | { 40 | var options = ReadOptions(); 41 | if (options == null) 42 | options = new T(); 43 | changeOptionsDelegate(options); 44 | WriteOptions(options); 45 | } 46 | 47 | public void ChangeOptions(ChangeOptionsVoidDelegate changeOptionsDelegate, ChangeOptionsIfNullDelegate changeOptionsIfNullDelegate) where T : class 48 | { 49 | var options = ReadOptions(); 50 | if (options == null) 51 | options = changeOptionsIfNullDelegate(); 52 | changeOptionsDelegate(options); 53 | WriteOptions(options); 54 | } 55 | 56 | public delegate T ChangeOptionsValueDelegate(T options); 57 | public delegate void ChangeOptionsVoidDelegate(T options); 58 | public delegate T ChangeOptionsIfNullDelegate(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.2d.sprite": "1.0.0", 4 | "com.unity.2d.tilemap": "1.0.0", 5 | "com.unity.ads": "3.7.5", 6 | "com.unity.analytics": "3.6.11", 7 | "com.unity.collab-proxy": "1.10.2", 8 | "com.unity.ide.rider": "1.2.1", 9 | "com.unity.ide.visualstudio": "2.0.11", 10 | "com.unity.ide.vscode": "1.2.4", 11 | "com.unity.multiplayer-hlapi": "1.0.8", 12 | "com.unity.purchasing": "3.2.2", 13 | "com.unity.test-framework": "1.1.29", 14 | "com.unity.textmeshpro": "2.1.4", 15 | "com.unity.timeline": "1.2.18", 16 | "com.unity.ugui": "1.0.0", 17 | "com.unity.xr.legacyinputhelpers": "2.1.8", 18 | "com.unity.xr.oculus.standalone": "2.38.4", 19 | "com.unity.xr.openvr.standalone": "2.0.5", 20 | "com.unity.modules.ai": "1.0.0", 21 | "com.unity.modules.androidjni": "1.0.0", 22 | "com.unity.modules.animation": "1.0.0", 23 | "com.unity.modules.assetbundle": "1.0.0", 24 | "com.unity.modules.audio": "1.0.0", 25 | "com.unity.modules.cloth": "1.0.0", 26 | "com.unity.modules.director": "1.0.0", 27 | "com.unity.modules.imageconversion": "1.0.0", 28 | "com.unity.modules.imgui": "1.0.0", 29 | "com.unity.modules.jsonserialize": "1.0.0", 30 | "com.unity.modules.particlesystem": "1.0.0", 31 | "com.unity.modules.physics": "1.0.0", 32 | "com.unity.modules.physics2d": "1.0.0", 33 | "com.unity.modules.screencapture": "1.0.0", 34 | "com.unity.modules.terrain": "1.0.0", 35 | "com.unity.modules.terrainphysics": "1.0.0", 36 | "com.unity.modules.tilemap": "1.0.0", 37 | "com.unity.modules.ui": "1.0.0", 38 | "com.unity.modules.uielements": "1.0.0", 39 | "com.unity.modules.umbra": "1.0.0", 40 | "com.unity.modules.unityanalytics": "1.0.0", 41 | "com.unity.modules.unitywebrequest": "1.0.0", 42 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 43 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 44 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 45 | "com.unity.modules.unitywebrequestwww": "1.0.0", 46 | "com.unity.modules.vehicles": "1.0.0", 47 | "com.unity.modules.video": "1.0.0", 48 | "com.unity.modules.vr": "1.0.0", 49 | "com.unity.modules.wind": "1.0.0", 50 | "com.unity.modules.xr": "1.0.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Langs/EN.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 1e5494b88e46dca47947ab5b0186d7a8, type: 3} 13 | m_Name: EN 14 | m_EditorClassIdentifier: 15 | data: '{"dictionary":[{"key":"ExpressionsSubMenuRule_summary","value":"Exists unset 16 | SubMenu"},{"key":"ControllerLayerWeightRule_summary","value":"Have weight 0 layer"},{"key":"HaveTransformAnimationRule_summary","value":"Have 17 | other than Transform Animation in other than FX"},{"key":"HaveExParamsInControllersRule_summary","value":"Missing 18 | Expression Parameter"},{"key":"HaveNoMissingAnimationPathRule_summary","value":"Exists 19 | missing path in AnimationClips"},{"key":"HaveEmptyStateRule_summary","value":"Exists 20 | state missing AnimationClip in AnimatorControllers"},{"key":"language","value":"Language"},{"key":"ValidateOnUploadAvatar","value":"Validate 21 | OnUploadAvatar"},{"key":"SuspendWarning","value":"Suspend uploading by warning 22 | message"},{"key":"EnableRules","value":"Enable Rules"},{"key":"Settings","value":"Settings"},{"key":"Avatar","value":"Avatar"},{"key":"Rules","value":"Rules"},{"key":"Validate","value":"Validate"},{"key":"Errors","value":"Errors"},{"key":"NoError","value":"No 23 | Error"},{"key":"Select","value":"Select"},{"key":"AutoFix","value":"AutoFix"},{"key":"ControllerLayerWeightRule_result","value":"`<1>` 24 | Layer in <2> is weight 0."},{"key":"HaveExParamsInControllersRule_result","value":"<1> 25 | is not found in AnimatorControllers"},{"key":"ExpressionsSubMenuRule_result","value":"`<1>` 26 | exists unset SubMenu."},{"key":"HaveTransformAnimationRule_result","value":"<1> 27 | have key changed other than Transform"},{"key":"HaveNoMissingAnimationPathRule_result","value":"`<1>` 28 | have missing path. (<2>)"},{"key":"HaveNoMissingAnimationPathRule_options_ignoreFileNameRegex","value":"Ignore 29 | animation file name pattern"},{"key":"HaveEmptyStateRule_result","value":"`<1>` 30 | has not animation clip in <2> layer of <3>."},{"key":"Add","value":"Add"},{"key":"Reset","value":"Reset"},{"key":"Save","value":"Save"}]}' 31 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/ExpressionsSubMenuRule.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Collections.Generic; 3 | #if VRC_SDK_VRCSDK3 4 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 5 | using ControlType = VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionsMenu.Control.ControlType; 6 | using VRCExpressionsMenu = VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionsMenu; 7 | #else 8 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 9 | using ControlType = VRCAvatars3Validator.Mocks.VRCExpressionsMenuMock.Control.ControlType; 10 | using VRCExpressionsMenu = VRCAvatars3Validator.Mocks.VRCExpressionsMenuMock; 11 | #endif 12 | 13 | using ValidateResultType = VRCAvatars3Validator.Models.ValidateResult.ValidateResultType; 14 | using VRCAvatars3Validator.Models; 15 | 16 | namespace VRCAvatars3Validator.Rules 17 | { 18 | /// 19 | /// Validate if exists unset SubMenu. 20 | /// 21 | public class ExpressionsSubMenuRule : IRule 22 | { 23 | public string RuleSummary => Localize.Translate("ExpressionsSubMenuRule_summary"); 24 | 25 | public IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options) 26 | { 27 | if (avatar.expressionsMenu is null) return Enumerable.Empty(); 28 | 29 | return ValidateExpressionsMenu(avatar.expressionsMenu); 30 | } 31 | 32 | private IEnumerable ValidateExpressionsMenu(VRCExpressionsMenu expressionsMenu) 33 | { 34 | foreach (var control in expressionsMenu.controls) 35 | { 36 | if (control.type != ControlType.SubMenu) continue; 37 | 38 | if (control.subMenu is null) 39 | { 40 | yield return new ValidateResult( 41 | expressionsMenu, 42 | ValidateResultType.Error, 43 | Localize.Translate("ExpressionsSubMenuRule_result", expressionsMenu.name)); 44 | } 45 | else 46 | { 47 | // Validating recursively. 48 | foreach (var validateResult in ValidateExpressionsMenu(control.subMenu)) 49 | { 50 | yield return validateResult; 51 | } 52 | } 53 | } 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRuleTest.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using System.Linq; 3 | using UnityEditor; 4 | using UnityEngine; 5 | #if VRC_SDK_VRCSDK3 6 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 7 | #else 8 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 9 | #endif 10 | using VRCAvatars3Validator.Models; 11 | using VRCAvatars3Validator.Rules; 12 | 13 | namespace VRCAvatars3Validator.Tests 14 | { 15 | public class ExpressionsSubMenuRuleTest 16 | { 17 | [Test] 18 | public void UnsetSubMenuDetect() 19 | { 20 | var testAvatarGUID = "4af480d8b06d1e948a211660b844a55e"; 21 | var assetPath = AssetDatabase.GUIDToAssetPath(testAvatarGUID); 22 | 23 | var prefab = PrefabUtility.LoadPrefabContents(assetPath); 24 | var avatar = GameObject.Instantiate(prefab); 25 | var vrcAvatarDescriptor = avatar.GetComponent(); 26 | 27 | var expecteds = new ValidateResult[] 28 | { 29 | new ValidateResult(vrcAvatarDescriptor.expressionsMenu, ValidateResult.ValidateResultType.Error, "`Unset Sub Menu 1` exists unset SubMenu."), 30 | new ValidateResult(vrcAvatarDescriptor.expressionsMenu, ValidateResult.ValidateResultType.Error, "`Unset Sub Menu 2` exists unset SubMenu."), 31 | new ValidateResult(vrcAvatarDescriptor.expressionsMenu.controls[2].subMenu, ValidateResult.ValidateResultType.Error, "`Unset Sub Menu 3` exists unset SubMenu."), 32 | new ValidateResult(vrcAvatarDescriptor.expressionsMenu.controls[2].subMenu.controls[1].subMenu, ValidateResult.ValidateResultType.Error, "`Unset Sub Menu 4` exists unset SubMenu."), 33 | }; 34 | 35 | var results = new ExpressionsSubMenuRule().Validate(vrcAvatarDescriptor, new RuleItemOptions(null)).ToArray(); 36 | 37 | Assert.AreEqual(4, results.Length); 38 | 39 | for (int i = 0; i < results.Length; i++) 40 | { 41 | var result = results[i]; 42 | var expected = expecteds[i]; 43 | 44 | Assert.AreEqual(expected.ResultMessage, result.ResultMessage); 45 | Assert.AreEqual(expected.ResultType, result.ResultType); 46 | Assert.AreEqual(expected.Target, result.Target); 47 | Assert.AreEqual(expected.SolutionMessage, result.SolutionMessage); 48 | Assert.AreEqual(expected.CanAutoFix, result.CanAutoFix); 49 | Assert.AreEqual(expected.AutoFix, result.AutoFix); 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/ViewModels/VRCAvatars3ValidatorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using UnityEditor; 4 | #if VRC_SDK_VRCSDK3 5 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 6 | #else 7 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 8 | #endif 9 | using VRCAvatars3Validator.Models; 10 | using VRCAvatars3Validator.Utilities; 11 | 12 | namespace VRCAvatars3Validator.ViewModels 13 | { 14 | public class VRCAvatars3ValidatorViewModel 15 | { 16 | public VRCAvatarDescriptor avatar { get; private set; } 17 | 18 | public Dictionary> resultDictionary { get; private set; } 19 | 20 | public ValidatorSettings settings { get; private set; } 21 | 22 | public static string EDITOR_NAME = "VRCAvatars3Validator"; 23 | 24 | public bool HasNeverValided = true; 25 | 26 | public void OnOpen() 27 | { 28 | if (settings == null) 29 | { 30 | settings = ValidatorSettingsUtility.GetOrCreateSettings(); 31 | } 32 | 33 | if (!avatar && Selection.activeGameObject) 34 | { 35 | avatar = Selection.activeGameObject.GetComponent(); 36 | Validate(); 37 | } 38 | } 39 | 40 | public void OnSwitchAvatar(VRCAvatarDescriptor avatar) 41 | { 42 | this.avatar = avatar; 43 | HasNeverValided = true; 44 | } 45 | 46 | public void OnSettingsClick() 47 | { 48 | SettingsService.OpenProjectSettings("Project/VRCAvatars3Validator"); 49 | } 50 | 51 | public void OnValidateClick() 52 | { 53 | Validate(); 54 | } 55 | 56 | public void OnSelectClick(ValidateResult result) 57 | { 58 | FocusTarget(result); 59 | } 60 | 61 | public void OnAutoFixClick(ValidateResult result) 62 | { 63 | result.AutoFix(); 64 | } 65 | 66 | public bool IsSelectionAvatar() => avatar == null; 67 | public bool ExistValidationResult() => resultDictionary != null && resultDictionary.Any(); 68 | 69 | private void Validate() 70 | { 71 | resultDictionary = VRCAvatars3Validator.ValidateAvatars3(avatar, settings.rules); 72 | HasNeverValided = false; 73 | } 74 | 75 | private void FocusTarget(ValidateResult result) 76 | { 77 | Selection.activeObject = result.Target; 78 | EditorGUIUtility.PingObject(result.Target); 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} 40 | - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} 41 | m_PreloadedShaders: [] 42 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 43 | type: 0} 44 | m_CustomRenderPipeline: {fileID: 0} 45 | m_TransparencySortMode: 0 46 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 47 | m_DefaultRenderingPath: 1 48 | m_DefaultMobileRenderingPath: 1 49 | m_TierSettings: [] 50 | m_LightmapStripping: 0 51 | m_FogStripping: 1 52 | m_InstancingStripping: 0 53 | m_LightmapKeepPlain: 1 54 | m_LightmapKeepDirCombined: 1 55 | m_LightmapKeepDynamicPlain: 1 56 | m_LightmapKeepDynamicDirCombined: 1 57 | m_LightmapKeepShadowMask: 1 58 | m_LightmapKeepSubtractive: 1 59 | m_FogKeepLinear: 1 60 | m_FogKeepExp: 1 61 | m_FogKeepExp2: 1 62 | m_AlbedoSwatchInfos: [] 63 | m_LightsUseLinearIntensity: 1 64 | m_LightsUseColorTemperature: 1 65 | m_LogWhenShaderIsCompiled: 0 66 | m_AllowEnlightenSupportForUpgradedProject: 1 67 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRuleTest.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using System.Linq; 3 | using UnityEditor; 4 | using UnityEngine; 5 | #if VRC_SDK_VRCSDK3 6 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 7 | #else 8 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 9 | #endif 10 | using VRCAvatars3Validator.Models; 11 | using VRCAvatars3Validator.Rules; 12 | 13 | namespace VRCAvatars3Validator.Tests 14 | { 15 | public class HaveNoMissingAnimationPathRuleTest 16 | { 17 | [Test] 18 | public void MissingPathDetect() 19 | { 20 | var testAvatarGUID = "bf0785317e095d54483b43e4821470dd"; 21 | var assetPath = AssetDatabase.GUIDToAssetPath(testAvatarGUID); 22 | 23 | var prefab = PrefabUtility.LoadPrefabContents(assetPath); 24 | var avatar = GameObject.Instantiate(prefab); 25 | var vrcAvatarDescriptor = avatar.GetComponent(); 26 | 27 | var expecteds = new ValidateResult[] 28 | { 29 | new ValidateResult(AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath("2efc90e0d0024f24f9e72f6b6325138b")), ValidateResult.ValidateResultType.Warning, "`HaveMissing` have missing path. (Parent/Cube)"), 30 | new ValidateResult(AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath("7a10dddcd1fb33c48b79d0eafe93949f")), ValidateResult.ValidateResultType.Warning, "`HaveMissing2` have missing path. (Spher)"), 31 | new ValidateResult(AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath("7a10dddcd1fb33c48b79d0eafe93949f")), ValidateResult.ValidateResultType.Warning, "`HaveMissing2` have missing path. (Parent/Capsules)"), 32 | }; 33 | 34 | var results = new HaveNoMissingAnimationPathRule().Validate(vrcAvatarDescriptor, new RuleItemOptions(null)).ToArray(); 35 | 36 | Assert.AreEqual(3, results.Length); 37 | 38 | for (int i = 0; i < results.Length; i++) 39 | { 40 | var result = results[i]; 41 | var expected = expecteds[i]; 42 | 43 | Assert.AreEqual(expected.ResultMessage, result.ResultMessage); 44 | Assert.AreEqual(expected.ResultType, result.ResultType); 45 | Assert.AreEqual(expected.Target, result.Target); 46 | Assert.AreEqual(expected.SolutionMessage, result.SolutionMessage); 47 | Assert.AreEqual(expected.CanAutoFix, result.CanAutoFix); 48 | Assert.AreEqual(expected.AutoFix, result.AutoFix); 49 | } 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/AvatarUploadWatcher.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Reflection; 3 | using UnityEditor; 4 | #if VRC_SDK_VRCSDK3 5 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 6 | using VRCSdkControlPanelAvatarBuilder = VRC.SDKBase.Editor.VRCSdkControlPanelAvatarBuilder; 7 | using IVRCSDKBuildRequestedCallback = VRC.SDKBase.Editor.BuildPipeline.IVRCSDKBuildRequestedCallback; 8 | using VRCSDKRequestedBuildType = VRC.SDKBase.Editor.BuildPipeline.VRCSDKRequestedBuildType; 9 | #else 10 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 11 | using VRCSdkControlPanelAvatarBuilder = VRCAvatars3Validator.Mocks.VRCSdkControlPanelAvatarBuilderMock; 12 | using IVRCSDKBuildRequestedCallback = VRCAvatars3Validator.Mocks.IVRCSDKBuildRequestedCallbackMock; 13 | using VRCSDKRequestedBuildType = VRCAvatars3Validator.Mocks.VRCSDKRequestedBuildTypeMock; 14 | #endif 15 | using VRCAvatars3Validator.Models; 16 | using VRCAvatars3Validator.Utilities; 17 | using VRCAvatars3Validator.Views; 18 | using System.Collections.Generic; 19 | 20 | namespace VRCAvatars3Validator 21 | { 22 | public class AvatarUploadWatcher : IVRCSDKBuildRequestedCallback 23 | { 24 | public int callbackOrder => -1; 25 | 26 | public bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType) 27 | { 28 | var settings = ValidatorSettingsUtility.GetOrCreateSettings(); 29 | 30 | if (!settings.validateOnUploadAvatar) return true; 31 | 32 | var type = typeof(VRCSdkControlPanelAvatarBuilder); 33 | var field = type.GetField("_selectedAvatar", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 34 | var avatar = field.GetValue(null) as VRCAvatarDescriptor; 35 | if (avatar == null) return true; 36 | Selection.activeObject = avatar.gameObject; 37 | 38 | var resultDictionary = VRCAvatars3Validator.ValidateAvatars3(avatar, settings.rules); 39 | 40 | if (IncludeErrorResult(resultDictionary) || 41 | (IncludeWarningResult(resultDictionary) && settings.suspendUploadingByWarningMessage)) 42 | { 43 | VRCAvatars3ValidatorView.Open(); 44 | return false; 45 | } 46 | 47 | return true; 48 | } 49 | 50 | private bool IncludeErrorResult(Dictionary> resultDictionary) 51 | => resultDictionary.Any(result => result.Value.Any(r => r.ResultType == ValidateResult.ValidateResultType.Error)); 52 | 53 | private bool IncludeWarningResult(Dictionary> resultDictionary) 54 | => resultDictionary.Any(result => result.Value.Any(r => r.ResultType == ValidateResult.ValidateResultType.Warning)); 55 | } 56 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Models/LanguagePack.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using VRCAvatars3Validator.Views; 3 | 4 | namespace VRCAvatars3Validator.Models 5 | { 6 | [CreateAssetMenu(menuName = "VRCAvatars3Validator/LanguagePack")] 7 | public class LanguagePack : ScriptableObject 8 | { 9 | [LanguagePack] 10 | public string data = 11 | "{\n" + 12 | "\"dictionary\":[\n" + 13 | " {\"key\":\"ExpressionsSubMenuRule_summary\",\"value\":\"Exists unset SubMenu\"}\n" + 14 | ",{\"key\":\"ControllerLayerWeightRule_summary\",\"value\":\"Have weight 0 layer\"}\n" + 15 | ",{\"key\":\"HaveTransformAnimationRule_summary\",\"value\":\"Have other than Transform Animation in other than FX\"}\n" + 16 | ",{\"key\":\"HaveExParamsInControllersRule_summary\",\"value\":\"Missing Expression Parameter\"}\n" + 17 | ",{\"key\":\"HaveNoMissingAnimationPathRule_summary\",\"value\":\"Exists missing path in AnimationClips\"}\n" + 18 | ",{\"key\":\"HaveEmptyStateRule_summary\",\"value\":\"Exists state missing AnimationClip in AnimatorControllers\"}\n" + 19 | ",{\"key\":\"language\",\"value\":\"Language\"}\n" + 20 | ",{\"key\":\"ValidateOnUploadAvatar\",\"value\":\"Validate OnUploadAvatar\"}\n" + 21 | ",{\"key\":\"SuspendWarning\",\"value\":\"Suspend uploading by warning message\"}\n" + 22 | ",{\"key\":\"EnableRules\",\"value\":\"Enable Rules\"}\n" + 23 | ",{\"key\":\"Settings\",\"value\":\"Settings\"}\n" + 24 | ",{\"key\":\"Avatar\",\"value\":\"Avatar\"}\n" + 25 | ",{\"key\":\"Rules\",\"value\":\"Rules\"}\n" + 26 | ",{\"key\":\"Validate\",\"value\":\"Validate\"}\n" + 27 | ",{\"key\":\"Errors\",\"value\":\"Errors\"}\n" + 28 | ",{\"key\":\"NoError\",\"value\":\"No Error\"}\n" + 29 | ",{\"key\":\"Select\",\"value\":\"Select\"}\n" + 30 | ",{\"key\":\"AutoFix\",\"value\":\"AutoFix\"}\n" + 31 | ",{\"key\":\"ControllerLayerWeightRule_result\",\"value\":\"`<1>` Layer in <2> is weight 0.\"}\n" + 32 | ",{\"key\":\"HaveExParamsInControllersRule_result\",\"value\":\"<1> is not found in AnimatorControllers\"}\n" + 33 | ",{\"key\":\"ExpressionsSubMenuRule_result\",\"value\":\"`<1>` exists unset SubMenu.\"}\n" + 34 | ",{\"key\":\"HaveTransformAnimationRule_result\",\"value\":\"<1> have key changed other than Transform\"}\n" + 35 | ",{\"key\":\"HaveNoMissingAnimationPathRule_result\",\"value\":\"`<1>` have missing path. (<2>)\"}\n" + 36 | ",{\"key\":\"HaveNoMissingAnimationPathRule_options_ignoreFileNameRegex\",\"value\":\"Ignore animation file name pattern\"}\n" + 37 | ",{\"key\":\"HaveEmptyStateRule_result\",\"value\":\"`<1>` has not animation clip in <2> layer of <3>.\"}\n" + 38 | ",{\"key\":\"Add\",\"value\":\"Add\"}\n" + 39 | ",{\"key\":\"Reset\",\"value\":\"Reset\"}\n" + 40 | ",{\"key\":\"Save\",\"value\":\"Save\"}\n" + 41 | "]\n" + 42 | "}"; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveExParamsInControllersRule.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using UnityEditor.Animations; 6 | using UnityEngine; 7 | #if VRC_SDK_VRCSDK3 8 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 9 | using VRCExpressionParameters = VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionParameters; 10 | #else 11 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 12 | using VRCExpressionParameters = VRCAvatars3Validator.Mocks.VRCExpressionParametersMock; 13 | #endif 14 | using VRCAvatars3Validator.Models; 15 | using VRCAvatars3Validator.Utilities; 16 | 17 | namespace VRCAvatars3Validator.Rules 18 | { 19 | /// 20 | /// ExpressionParametersに設定されているAnimatorParameterがどのControllerにもない 21 | /// 22 | public class HaveExParamsInControllersRule : IRule 23 | { 24 | public string RuleSummary => Localize.Translate("HaveExParamsInControllersRule_summary"); 25 | 26 | public IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options) 27 | { 28 | var exParamsAsset = VRCAvatarUtility.GetExpressionParametersAsset(avatar); 29 | 30 | if (exParamsAsset is null) yield break; 31 | 32 | var exParams = exParamsAsset.parameters.Where(p => !string.IsNullOrEmpty(p.name)).ToArray(); 33 | 34 | if (!exParams.Any()) yield break; 35 | 36 | var parameterlist = VRCAvatarUtility.GetParameters(avatar.baseAnimationLayers.Select(l => l.animatorController as AnimatorController)); 37 | 38 | bool found = false; 39 | foreach (var exParam in exParams) 40 | { 41 | var exParamName = exParam.name; 42 | var exParamType = ParamTypeMap[exParam.valueType]; 43 | 44 | found = false; 45 | foreach (var param in parameterlist) 46 | { 47 | if (exParamName == param.name && exParamType == param.type) 48 | { 49 | found = true; 50 | break; 51 | } 52 | } 53 | if (!found) 54 | { 55 | yield return new ValidateResult( 56 | exParamsAsset, 57 | ValidateResult.ValidateResultType.Error, 58 | Localize.Translate("HaveExParamsInControllersRule_result", exParamName)); 59 | } 60 | } 61 | } 62 | 63 | Dictionary ParamTypeMap = 64 | new Dictionary { 65 | { VRCExpressionParameters.ValueType.Int, AnimatorControllerParameterType.Int }, 66 | { VRCExpressionParameters.ValueType.Float, AnimatorControllerParameterType.Float }, 67 | { VRCExpressionParameters.ValueType.Bool, AnimatorControllerParameterType.Bool }, 68 | }; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Utilities/ValidatorSettingsUtility.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEditor; 5 | using UnityEngine; 6 | using VRCAvatars3Validator.Models; 7 | 8 | namespace VRCAvatars3Validator.Utilities 9 | { 10 | public class ValidatorSettingsUtility 11 | { 12 | private const string SETTINGS_FILE_PATH = "Assets/VRCAvatars3Validator/Editor/Settings.asset"; 13 | 14 | public static ValidatorSettings GetOrCreateSettings() 15 | { 16 | var settings = AssetDatabase.LoadAssetAtPath(SETTINGS_FILE_PATH); 17 | if (settings) 18 | { 19 | FetchRules(settings); 20 | return settings; 21 | } 22 | 23 | return CreateSettings(); 24 | } 25 | 26 | private static ValidatorSettings CreateSettings() 27 | { 28 | var settings = ScriptableObject.CreateInstance(); 29 | 30 | settings.validateOnUploadAvatar = true; 31 | 32 | var filePaths = RuleUtility.GetRuleFilePaths(); 33 | foreach (var filePath in filePaths) 34 | { 35 | AddRule(settings, filePath); 36 | } 37 | 38 | AssetDatabase.CreateAsset(settings, SETTINGS_FILE_PATH); 39 | AssetDatabase.SaveAssets(); 40 | return settings; 41 | } 42 | 43 | private static void FetchRules(ValidatorSettings settings = null) 44 | { 45 | if (settings == null) 46 | { 47 | settings = GetOrCreateSettings(); 48 | } 49 | var currentRuleFilePaths = RuleUtility.GetRuleFilePaths().ToArray(); 50 | var settingsFilePaths = settings.rules.Select(rule => rule.FilePath).ToArray(); 51 | 52 | // 現在の設定にないものを追加する 53 | foreach (var filePath in currentRuleFilePaths) 54 | { 55 | if (!settingsFilePaths.Contains(filePath)) 56 | { 57 | AddRule(settings, filePath); 58 | } 59 | } 60 | 61 | // 現在の設定に余分にあるものを削除する 62 | var deleteRuleIndices = new List(); 63 | foreach (var filePath in settingsFilePaths) 64 | { 65 | if (!currentRuleFilePaths.Contains(filePath)) 66 | { 67 | var index = Array.IndexOf(currentRuleFilePaths, filePath); 68 | deleteRuleIndices.Add(index); 69 | } 70 | } 71 | 72 | foreach (int index in deleteRuleIndices.OrderByDescending(x => x)) 73 | { 74 | settings.rules.RemoveAt(index); 75 | } 76 | } 77 | 78 | private static void AddRule(ValidatorSettings settings, string filePath) 79 | { 80 | var settingable = RuleUtility.FilePath2Settingable(filePath); 81 | object options = null; 82 | if (settingable != null) 83 | { 84 | options = settingable.Options; 85 | } 86 | settings.rules.Add(new RuleItem 87 | { 88 | Name = RuleUtility.FilePath2RuleName(filePath), 89 | Enabled = true, 90 | FilePath = filePath, 91 | Options = new RuleItemOptions(options), 92 | }); 93 | } 94 | } 95 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Views/VRCAvatars3ValidatorSettingsProvider.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using UnityEditor; 4 | using UnityEngine; 5 | using VRCAvatars3Validator.Models; 6 | using VRCAvatars3Validator.Utilities; 7 | 8 | namespace VRCAvatars3Validator.Views 9 | { 10 | public class VRCAvatars3ValidatorSettingsProvider : Editor 11 | { 12 | #if VRC_SDK_VRCSDK3 13 | [SettingsProvider] 14 | #endif 15 | public static SettingsProvider CreateSettingsProvider() 16 | { 17 | return new SettingsProvider("Project/VRCAvatars3Validator", SettingsScope.Project) 18 | { 19 | label = "VRCAvatars3Validator", 20 | keywords = new HashSet(new string[] { "VRChat", "VRC", "Avatars3.0" }), 21 | guiHandler = (searchContext) => 22 | { 23 | var settings = ValidatorSettingsUtility.GetOrCreateSettings(); 24 | settings.validateOnUploadAvatar = EditorGUILayout.Toggle(Localize.Translate("ValidateOnUploadAvatar"), settings.validateOnUploadAvatar); 25 | 26 | EditorGUILayout.Space(); 27 | 28 | settings.suspendUploadingByWarningMessage = EditorGUILayout.ToggleLeft(Localize.Translate("SuspendWarning"), settings.suspendUploadingByWarningMessage); 29 | 30 | EditorGUILayout.Space(); 31 | 32 | settings.languageType = (LanguageType)EditorGUILayout.EnumPopup(Localize.Translate("language"), settings.languageType); 33 | 34 | EditorGUILayout.Space(); 35 | 36 | EditorGUILayout.LabelField(Localize.Translate("EnableRules"), EditorStyles.boldLabel); 37 | 38 | var ruleNames = settings.rules.Select(rule => rule.Name).ToArray(); 39 | var rules = settings.rules.Select(x => RuleUtility.FilePath2IRule(x.FilePath)).ToArray(); 40 | 41 | for (int i = 0; i < ruleNames.Length; i++) 42 | { 43 | var validateRule = settings.rules[i].Enabled; 44 | var ruleName = ruleNames[i]; 45 | var ruleSummary = rules[i].RuleSummary; 46 | settings.rules[i].Enabled = EditorGUILayout.ToggleLeft($"[{ruleName}] {ruleSummary}", validateRule); 47 | } 48 | 49 | EditorGUILayout.Space(); 50 | 51 | for (int i = 0; i < rules.Length; i++) 52 | { 53 | var rule = rules[i]; 54 | if (rule is Settingable settingableRule) 55 | { 56 | EditorGUILayout.LabelField(rule.GetType().Name, EditorStyles.boldLabel); 57 | settingableRule.OnGUI(settings.rules[i].Options); 58 | } 59 | EditorGUILayout.Space(); 60 | } 61 | 62 | using (new EditorGUILayout.HorizontalScope()) 63 | { 64 | GUILayout.FlexibleSpace(); 65 | 66 | if (GUILayout.Button(Localize.Translate("Save"))) 67 | { 68 | EditorUtility.SetDirty(settings); 69 | AssetDatabase.SaveAssets(); 70 | AssetDatabase.Refresh(); 71 | } 72 | } 73 | } 74 | }; 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Langs/JA.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 1e5494b88e46dca47947ab5b0186d7a8, type: 3} 13 | m_Name: JA 14 | m_EditorClassIdentifier: 15 | data: "{\"dictionary\":[{\"key\":\"ExpressionsSubMenuRule_summary\",\"value\":\"\u30BB\u30C3\u30C8\u3055\u308C\u3066\u3044\u306A\u3044SubMenu\u304C\u3042\u308B\"},{\"key\":\"ControllerLayerWeightRule_summary\",\"value\":\"Weight\u304C0\u306E\u30EC\u30A4\u30E4\u30FC\u304C\u3042\u308B\"},{\"key\":\"HaveTransformAnimationRule_summary\",\"value\":\"FX\u4EE5\u5916\u306E\u30EC\u30A4\u30E4\u30FC\u306BTransform\u3092\u64CD\u4F5C\u3059\u308BAnimation\u304C\u3042\u308B\"},{\"key\":\"HaveExParamsInControllersRule_summary\",\"value\":\"Controller\u3082\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044ExpressionParamter\u304C\u3042\u308B\"},{\"key\":\"HaveNoMissingAnimationPathRule_summary\",\"value\":\"Missing\u306B\u306A\u3063\u3066\u3044\u308B\u30D1\u30B9\u3092\u6301\u3064Animation\u304C\u3042\u308B\"},{\"key\":\"language\",\"value\":\"\u8A00\u8A9E\"},{\"key\":\"ValidateOnUploadAvatar\",\"value\":\"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u6642\u306B\u691C\u67FB\u3059\u308B\"},{\"key\":\"SuspendWarning\",\"value\":\"\u8B66\u544A\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u51FA\u305F\u3089\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3092\u4E2D\u6B62\u3059\u308B\"},{\"key\":\"EnableRules\",\"value\":\"\u6709\u52B9\u306A\u30EB\u30FC\u30EB\"},{\"key\":\"Settings\",\"value\":\"\u8A2D\u5B9A\"},{\"key\":\"Avatar\",\"value\":\"\u30A2\u30D0\u30BF\u30FC\"},{\"key\":\"Rules\",\"value\":\"\u30EB\u30FC\u30EB\"},{\"key\":\"Validate\",\"value\":\"\u691C\u67FB\u3059\u308B\"},{\"key\":\"Errors\",\"value\":\"\u30A8\u30E9\u30FC\"},{\"key\":\"NoError\",\"value\":\"\u30A8\u30E9\u30FC\u306A\u3057\"},{\"key\":\"Select\",\"value\":\"\u9078\u629E\"},{\"key\":\"AutoFix\",\"value\":\"\u81EA\u52D5\u4FEE\u6B63\"},{\"key\":\"ControllerLayerWeightRule_result\",\"value\":\" 16 | <2>\u306E<1>\u30EC\u30A4\u30E4\u30FC\u306Eweight\u304C0\u3067\u3059\"},{\"key\":\"HaveExParamsInControllersRule_result\",\"value\":\"\u3069\u306EAnimatorController\u304B\u3089\u3082<1>\u30D1\u30E9\u30E1\u30FC\u30BF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\"},{\"key\":\"ExpressionsSubMenuRule_result\",\"value\":\"<1>\u306BSubMenu\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044Control\u304C\u3042\u308A\u307E\u3059\"},{\"key\":\"HaveTransformAnimationRule_result\",\"value\":\"<1> 17 | \u306FTransform\u4EE5\u5916\u3092\u5909\u66F4\u3059\u308B\u30AD\u30FC\u3092\u6301\u3063\u3066\u3044\u307E\u3059\"},{\"key\":\"HaveNoMissingAnimationPathRule_result\",\"value\":\"<1>\u306FMissing\u306A\u30D1\u30B9\u3092\u6301\u3063\u3066\u3044\u307E\u3059 18 | (<2>)\"},{\"key\":\"HaveNoMissingAnimationPathRule_options_ignoreFileNameRegex\",\"value\":\"\u691C\u8A3C\u3057\u306A\u3044Animation\u30D5\u30A1\u30A4\u30EB\u306E\u540D\u524D\u306E\u5F62\u5F0F\"},{\"key\":\"Add\",\"value\":\"\u8FFD\u52A0\"},{\"key\":\"Reset\",\"value\":\"\u521D\u671F\u5024\u306B\u623B\u3059\"},{\"key\":\"HaveEmptyStateRule_summary\",\"value\":\"AnimationClip\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044State\u304C\u3042\u308B\"},{\"key\":\"HaveEmptyStateRule_result\",\"value\":\" 19 | <3>\u306E<2>\u30EC\u30A4\u30E4\u30FC\u306E<1>\u306BAnimation\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\"},{\"key\":\"Save\",\"value\":\"\u4FDD\u5B58\"}]}" 20 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | workflow_dispatch: 9 | 10 | env: 11 | UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} 12 | TOOL_NAME: VRCAvatars3Validator 13 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 14 | 15 | jobs: 16 | build: 17 | runs-on: ubuntu-latest 18 | 19 | steps: 20 | - uses: actions/checkout@v2 21 | 22 | - name: set output data 23 | id: outputdata 24 | run: | 25 | VERSION=$(echo ${{ github.ref }} | sed -e "s#refs/tags/##g") 26 | echo ::set-output name=version::$VERSION 27 | echo ::set-output name=filedir::${TOOL_NAME}_$VERSION 28 | echo ::set-output name=filename::${TOOL_NAME}_$VERSION.unitypackage 29 | 30 | - name: git settings 31 | run: | 32 | git config --global user.email ${{ secrets.EMAIL }} 33 | git config --global user.name "github-ci" 34 | git remote set-url origin https://gatosyocora:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} 35 | 36 | - name: copy readme & license 37 | run: | 38 | cp -f README.md ./Assets/VRCAvatars3Validator/README.md 39 | cp -f README.md.meta ./Assets/VRCAvatars3Validator/README.md.meta 40 | cp -f LICENSE ./Assets/VRCAvatars3Validator/LICENSE 41 | cp -f LICENSE.meta ./Assets/VRCAvatars3Validator/LICENSE.meta 42 | cp -f CHANGELOG.md ./Assets/VRCAvatars3Validator/CHANGELOG.md 43 | cp -f CHANGELOG.md.meta ./Assets/VRCAvatars3Validator/CHANGELOG.md.meta 44 | 45 | - name: git commit & push 46 | run: | 47 | git add . 48 | git commit -m "update files" 49 | 50 | - name: build unitypackage 51 | uses: game-ci/unity-builder@v2 52 | with: 53 | unityVersion: 2018.4.20f1 54 | buildMethod: UnityPackageExporter.Export 55 | 56 | - name: rename unitypackage 57 | run: | 58 | mv VRCAvatars3Validator.unitypackage ${{ steps.outputdata.outputs.filename }} 59 | 60 | - name: zip unitypackage 61 | run: | 62 | DIR=$(echo ${{ steps.outputdata.outputs.filedir }}) 63 | mkdir $DIR 64 | cp -f ${{ steps.outputdata.outputs.filename }} $DIR/${{ steps.outputdata.outputs.filename }} 65 | cp -f README.md $DIR/README.md 66 | cp -f LICENSE $DIR/LICENSE 67 | cp -f CHANGELOG.md $DIR/CHANGELOG.md 68 | zip -r $DIR.zip $DIR 69 | 70 | - name: create release 71 | id: create-release 72 | uses: actions/create-release@v1.0.0 73 | with: 74 | tag_name: ${{ steps.outputdata.outputs.version }} 75 | release_name: ${{ steps.outputdata.outputs.version }} 76 | draft: false 77 | prerelease: false 78 | 79 | - name: upload unitypackage 80 | id: upload-unitypackage 81 | uses: actions/upload-release-asset@v1.0.1 82 | with: 83 | upload_url: ${{ steps.create-release.outputs.upload_url }} 84 | asset_path: ./${{ steps.outputdata.outputs.filename }} 85 | asset_name: ${{ steps.outputdata.outputs.filename }} 86 | asset_content_type: application/zip 87 | 88 | - name: upload zip 89 | id: upload-zip 90 | uses: actions/upload-release-asset@v1.0.1 91 | with: 92 | upload_url: ${{ steps.create-release.outputs.upload_url }} 93 | asset_path: ./${{ steps.outputdata.outputs.filedir }}.zip 94 | asset_name: ${{ steps.outputdata.outputs.filedir }}.zip 95 | asset_content_type: application/zip 96 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveTransformAnimationRule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System; 4 | using System.Linq; 5 | using UnityEngine; 6 | #if VRC_SDK_VRCSDK3 7 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 8 | #else 9 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 10 | #endif 11 | using UnityEditor.Animations; 12 | using UnityEditor; 13 | using VRCAvatars3Validator.Utilities; 14 | using VRCAvatars3Validator.Models; 15 | 16 | namespace VRCAvatars3Validator.Rules 17 | { 18 | public class HaveTransformAnimationRule : IRule 19 | { 20 | public string RuleSummary => Localize.Translate("HaveTransformAnimationRule_summary"); 21 | 22 | private static string[] humanoidBoneNamesMissingInHumanBodyBones = new string[] 23 | { 24 | "Left Arm ", 25 | "Left Forearm ", 26 | "Right Arm ", 27 | "Right Forearm ", 28 | "RootT", 29 | "RootQ" 30 | }; 31 | 32 | public IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options) 33 | { 34 | var humanoidBoneNames = Enum.GetNames(typeof(HumanBodyBones)) 35 | .SelectMany(n => new string[] { n, ToContainSpace(n) }) 36 | .Concat(humanoidBoneNamesMissingInHumanBodyBones) 37 | .Distinct() 38 | .ToArray(); 39 | 40 | var playableLayers = VRCAvatarUtility.GetBaseAnimationLayers(avatar); 41 | 42 | if (!playableLayers.Any()) yield break; 43 | 44 | foreach (var playableLayer in playableLayers) 45 | { 46 | if (playableLayer.type == VRCAvatarDescriptor.AnimLayerType.FX) continue; 47 | 48 | var animatorController = playableLayer.animatorController as AnimatorController; 49 | 50 | if (animatorController is null) continue; 51 | 52 | foreach (var state in animatorController.layers.SelectMany(l => l.stateMachine.states)) 53 | { 54 | var clip = state.state.motion as AnimationClip; 55 | 56 | if (clip is null) continue; 57 | 58 | foreach (var binding in AnimationUtility.GetCurveBindings(clip)) 59 | { 60 | // Transformを操作するもの以外が含まれているか検出 61 | if (binding.type != typeof(Transform) && 62 | !(binding.type == typeof(Animator) && humanoidBoneNames.Any(n => binding.propertyName.StartsWith(n)))) 63 | { 64 | yield return new ValidateResult( 65 | clip, 66 | ValidateResult.ValidateResultType.Error, 67 | Localize.Translate("HaveTransformAnimationRule_result", clip.name)); 68 | } 69 | } 70 | } 71 | } 72 | } 73 | 74 | private string ToContainSpace(string input) 75 | { 76 | if (string.IsNullOrEmpty(input)) return string.Empty; 77 | 78 | int startIndex = 0, count = 1; 79 | var words = new List(); 80 | // 最初が小文字の可能性があるため1から 81 | for (int i = 1; i < input.Length; i++) 82 | { 83 | if (char.IsUpper(input[i])) 84 | { 85 | words.Add(input.Substring(startIndex, count)); 86 | startIndex = i; 87 | count = 1; 88 | } 89 | else count++; 90 | } 91 | words.Add(input.Substring(startIndex, count)); 92 | 93 | return string.Join(" ", words); 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Mocks/VRCAvatarDescriptorMock.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using VRCExpressionParameters = VRCAvatars3Validator.Mocks.VRCExpressionParametersMock; 4 | using VRCExpressionsMenu = VRCAvatars3Validator.Mocks.VRCExpressionsMenuMock; 5 | 6 | namespace VRCAvatars3Validator.Mocks 7 | { 8 | public class VRCAvatarDescriptorMock : MonoBehaviour 9 | { 10 | public bool customExpressions; 11 | public bool autoLocomotion; 12 | public bool autoFootsteps; 13 | public ScriptableObject AnimationPreset; 14 | public CustomAnimLayer[] specialAnimationLayers; 15 | public CustomAnimLayer[] baseAnimationLayers; 16 | [HideInInspector] 17 | public List animationHashSet; 18 | public CustomEyeLookSettings customEyeLookSettings; 19 | public bool enableEyeLook; 20 | public VRCExpressionParameters expressionParameters; 21 | public VRCExpressionsMenu expressionsMenu; 22 | public bool customizeAnimationLayers; 23 | 24 | //public VRCAvatarDescriptor(); 25 | 26 | //public VRCExpressionParameters.Parameter GetExpressionParameter(int index); 27 | //public int GetExpressionParameterCount(); 28 | 29 | public enum AnimLayerType 30 | { 31 | Base = 0, 32 | SpecialIK = 1, 33 | Additive = 2, 34 | Gesture = 3, 35 | Action = 4, 36 | FX = 5, 37 | Sitting = 6, 38 | TPose = 7, 39 | IKPose = 8 40 | } 41 | public enum EyelidType 42 | { 43 | None = 0, 44 | Bones = 1, 45 | Blendshapes = 2 46 | } 47 | 48 | public struct CustomEyeLookSettings 49 | { 50 | public EyeMovements eyeMovement; 51 | public int[] eyelidsBlendshapes; 52 | public SkinnedMeshRenderer eyelidsSkinnedMesh; 53 | public EyelidRotations eyelidsLookingDown; 54 | public EyelidRotations eyelidsLookingUp; 55 | public EyelidRotations eyelidsClosed; 56 | public EyelidRotations eyelidsDefault; 57 | public Transform lowerRightEyelid; 58 | public Transform lowerLeftEyelid; 59 | public Transform upperRightEyelid; 60 | public EyelidType eyelidType; 61 | public EyeRotations eyesLookingRight; 62 | public EyeRotations eyesLookingLeft; 63 | public EyeRotations eyesLookingDown; 64 | public EyeRotations eyesLookingUp; 65 | public EyeRotations eyesLookingStraight; 66 | public Transform rightEye; 67 | public Transform leftEye; 68 | public Transform upperLeftEyelid; 69 | 70 | public class EyeRotations 71 | { 72 | public bool linked; 73 | public Quaternion left; 74 | public Quaternion right; 75 | 76 | //public EyeRotations(); 77 | } 78 | public class EyeMovements 79 | { 80 | public float confidence; 81 | public float excitement; 82 | 83 | //public EyeMovements(); 84 | } 85 | public class EyelidRotations 86 | { 87 | public EyeRotations upper; 88 | public EyeRotations lower; 89 | 90 | //public EyelidRotations(); 91 | } 92 | } 93 | public struct CustomAnimLayer 94 | { 95 | public bool isEnabled; 96 | public AnimLayerType type; 97 | public RuntimeAnimatorController animatorController; 98 | public AvatarMask mask; 99 | public bool isDefault; 100 | } 101 | public struct DebugHash 102 | { 103 | public int hash; 104 | public string name; 105 | } 106 | } 107 | } -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/HaveMissing.anim: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!74 &7400000 4 | AnimationClip: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_Name: HaveMissing 10 | serializedVersion: 6 11 | m_Legacy: 0 12 | m_Compressed: 0 13 | m_UseHighQualityCurve: 1 14 | m_RotationCurves: [] 15 | m_CompressedRotationCurves: [] 16 | m_EulerCurves: [] 17 | m_PositionCurves: [] 18 | m_ScaleCurves: [] 19 | m_FloatCurves: 20 | - curve: 21 | serializedVersion: 2 22 | m_Curve: 23 | - serializedVersion: 3 24 | time: 0 25 | value: 1 26 | inSlope: Infinity 27 | outSlope: Infinity 28 | tangentMode: 103 29 | weightedMode: 0 30 | inWeight: 0 31 | outWeight: 0 32 | m_PreInfinity: 2 33 | m_PostInfinity: 2 34 | m_RotationOrder: 4 35 | attribute: m_IsActive 36 | path: Parent/Cube 37 | classID: 1 38 | script: {fileID: 0} 39 | - curve: 40 | serializedVersion: 2 41 | m_Curve: 42 | - serializedVersion: 3 43 | time: 0 44 | value: 1 45 | inSlope: Infinity 46 | outSlope: Infinity 47 | tangentMode: 103 48 | weightedMode: 0 49 | inWeight: 0 50 | outWeight: 0 51 | m_PreInfinity: 2 52 | m_PostInfinity: 2 53 | m_RotationOrder: 4 54 | attribute: m_IsActive 55 | path: Sphere 56 | classID: 1 57 | script: {fileID: 0} 58 | m_PPtrCurves: [] 59 | m_SampleRate: 60 60 | m_WrapMode: 0 61 | m_Bounds: 62 | m_Center: {x: 0, y: 0, z: 0} 63 | m_Extent: {x: 0, y: 0, z: 0} 64 | m_ClipBindingConstant: 65 | genericBindings: 66 | - serializedVersion: 2 67 | path: 3529590570 68 | attribute: 2086281974 69 | script: {fileID: 0} 70 | typeID: 1 71 | customType: 0 72 | isPPtrCurve: 0 73 | - serializedVersion: 2 74 | path: 1381327793 75 | attribute: 2086281974 76 | script: {fileID: 0} 77 | typeID: 1 78 | customType: 0 79 | isPPtrCurve: 0 80 | pptrCurveMapping: [] 81 | m_AnimationClipSettings: 82 | serializedVersion: 2 83 | m_AdditiveReferencePoseClip: {fileID: 0} 84 | m_AdditiveReferencePoseTime: 0 85 | m_StartTime: 0 86 | m_StopTime: 0 87 | m_OrientationOffsetY: 0 88 | m_Level: 0 89 | m_CycleOffset: 0 90 | m_HasAdditiveReferencePose: 0 91 | m_LoopTime: 0 92 | m_LoopBlend: 0 93 | m_LoopBlendOrientation: 0 94 | m_LoopBlendPositionY: 0 95 | m_LoopBlendPositionXZ: 0 96 | m_KeepOriginalOrientation: 0 97 | m_KeepOriginalPositionY: 1 98 | m_KeepOriginalPositionXZ: 0 99 | m_HeightFromFeet: 0 100 | m_Mirror: 0 101 | m_EditorCurves: 102 | - curve: 103 | serializedVersion: 2 104 | m_Curve: 105 | - serializedVersion: 3 106 | time: 0 107 | value: 1 108 | inSlope: Infinity 109 | outSlope: Infinity 110 | tangentMode: 103 111 | weightedMode: 0 112 | inWeight: 0 113 | outWeight: 0 114 | m_PreInfinity: 2 115 | m_PostInfinity: 2 116 | m_RotationOrder: 4 117 | attribute: m_IsActive 118 | path: Parent/Cube 119 | classID: 1 120 | script: {fileID: 0} 121 | - curve: 122 | serializedVersion: 2 123 | m_Curve: 124 | - serializedVersion: 3 125 | time: 0 126 | value: 1 127 | inSlope: Infinity 128 | outSlope: Infinity 129 | tangentMode: 103 130 | weightedMode: 0 131 | inWeight: 0 132 | outWeight: 0 133 | m_PreInfinity: 2 134 | m_PostInfinity: 2 135 | m_RotationOrder: 4 136 | attribute: m_IsActive 137 | path: Sphere 138 | classID: 1 139 | script: {fileID: 0} 140 | m_EulerEditorCurves: [] 141 | m_HasGenericRootTransform: 0 142 | m_HasMotionFloatCurves: 0 143 | m_Events: [] 144 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Views/LanguagePackAttribute.cs: -------------------------------------------------------------------------------- 1 | using Kogane; 2 | using System; 3 | using System.Collections; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Text.RegularExpressions; 8 | using UnityEditor; 9 | using UnityEngine; 10 | using VRCAvatars3Validator.Models; 11 | 12 | namespace VRCAvatars3Validator.Views 13 | { 14 | public class LanguagePackAttribute : PropertyAttribute 15 | { 16 | public LanguagePackAttribute() { } 17 | } 18 | 19 | [CustomPropertyDrawer(typeof(LanguagePackAttribute))] 20 | public class LanguagePackDrawer : PropertyDrawer 21 | { 22 | public static int H = 18; 23 | private bool enable = false; 24 | 25 | public class Pair 26 | { 27 | public string key; 28 | public string value; 29 | } 30 | 31 | public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) 32 | { 33 | EditorGUI.BeginProperty(position, label, property); 34 | 35 | var y = position.y; 36 | var dictionary = Deserialize(property.stringValue); 37 | var keys = dictionary.Dictionary.Keys.Select(key => key).ToArray(); 38 | if (GUI.Button(NewRect(position, y, H), "Toggle Enable")) 39 | { 40 | enable = !enable; 41 | } 42 | if (GUI.Button(NewRect(position, y + H, H), "Copy")) 43 | { 44 | EditorGUIUtility.systemCopyBuffer = property.stringValue; 45 | } 46 | if (GUI.Button(NewRect(position, y + 2 * H, H), "Fetch")) 47 | { 48 | var classType = fieldInfo.DeclaringType; 49 | var languagePack = Activator.CreateInstance(classType) as LanguagePack; 50 | var masterDictionary = JsonUtility.FromJson(languagePack.data); 51 | foreach (var key in masterDictionary.Dictionary.Keys) 52 | { 53 | if(!dictionary.Dictionary.TryGetValue(key, out string value)) 54 | { 55 | dictionary.Dictionary.Add(key, masterDictionary.Dictionary[key]); 56 | } 57 | } 58 | property.stringValue = Serialize(dictionary); 59 | } 60 | using (new EditorGUI.DisabledGroupScope(!enable)) 61 | { 62 | for (int i = 0; i < keys.Length; i++) 63 | { 64 | var pair = dictionary.Dictionary.Keys; 65 | using (var check = new EditorGUI.ChangeCheckScope()) 66 | { 67 | var key = keys[i]; 68 | var value = dictionary.Dictionary[key]; 69 | var newValue = EditorGUI.TextField(NewRect(position, y + (3 + i) * H, H), key, value); 70 | 71 | if (check.changed) 72 | { 73 | dictionary.Dictionary[key] = newValue; 74 | property.stringValue = Serialize(dictionary); 75 | } 76 | } 77 | } 78 | } 79 | 80 | EditorGUI.EndProperty(); 81 | } 82 | 83 | public override float GetPropertyHeight(SerializedProperty property, GUIContent label) 84 | { 85 | var dictionary = Deserialize(property.stringValue); 86 | var keys = dictionary.Dictionary.Keys.Select(key => key).ToArray(); 87 | return H * (3 + keys.Length); 88 | } 89 | 90 | private string Serialize(JsonDictionary dictionary) 91 | { 92 | return JsonUtility.ToJson(dictionary); 93 | } 94 | 95 | private JsonDictionary Deserialize(string data) 96 | { 97 | return JsonUtility.FromJson(data); 98 | } 99 | 100 | private Rect NewRect(Rect position, float y, float height) => new Rect(position.x, y, position.width, height); 101 | } 102 | } 103 | 104 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VRCAvatars3Validator 2 | 3 | [![Release](https://img.shields.io/github/v/release/gatosyocora/VRCAvatars3Validator?sort=semver)](https://img.shields.io/github/v/release/gatosyocora/VRCAvatars3Validator?sort=semver) 4 | [![License](https://img.shields.io/badge/License-MIT-green.svg)](https://img.shields.io/badge/License-MIT-green.svg) 5 | 6 | [JP](#jp) / [EN](#en) 7 | 8 |

9 | VRChatのAvatars3.0のアバターで起きがちなミスをチェックできるEditor拡張です 10 | 11 | チェックするためのルールを新規に作成して自由に追加できます 12 | 13 | ## 使い方 14 | 15 | ### VRCAvatars3Validator専用ウィンドウ 16 | 17 | Unity上部メニューの`VRCAvatars3Validator/Editor`から専用のウィンドウを開きます 18 | 19 | 1. Avatarにセットアップ済みのAvatars3.0のアバターを選択します 20 | 2. Rulesの検査したいルールにチェックを入れます 21 | 3. Validateボタンを押すとErrorsに結果が表示されます 22 | 4. Selectを押すと対象のオブジェクトが選択され, 可能なものはAutoFixで直せます 23 | 24 | - アバターアップロード時にルールの検査に引っかかる場合はアップロードが中止されて、本ウィンドウが表示されます 25 | 26 | ### Project Settings/VRCAvatars3Validator 27 | 28 | Unity上部メニューの`Edit> Project Settings> VRCAvatars3Validator`で開くことができる設定ウィンドウです 29 | 30 | - **Validate OnUploadAvatar** : チェックをいれることでアバターアップロード時に自動テストを行います 31 | - **Enable Rules** : チェックが入っているルールで検査します。これらのチェックの有無は専用ウィンドウと同期します 32 | 33 | ## ルールの追加 34 | 35 | 1. ルールのテンプレートを用いて新規のルールスクリプトを作成する。以下のいずれかの方法でテンプレートから作成できます 36 | - Projectウィンドウで`Create> C# VRCAvatars3ValidatorRule`を選択する 37 | - Unity上部メニューから`Assets> Create> C# VRCAvatars3ValidatorRule`を選択する 38 | - Rulesフォルダにある`TemplateRule.cs`を`右クリック> Duplicate`で複製する 39 | 2. VRCAvatars3ValidatorフォルダにあるRulesフォルダに作成したルールスクリプトをいれる 40 | 3. 専用ウィンドウを開きなおす 41 | 42 | - ルールを追加した際にはぜひgithubのリポジトリにPRをください 43 | 44 | 45 | ## 動作保証環境 46 | 47 | Unity 2018.4.20f1 48 | 49 | ## 依存パッケージ 50 | 51 | このツールをUnityにインストールして使用する際には以下のものもインストールしてください 52 | 53 | - VRCSDK3-AVATAR-xxxx.xx.xx.xx.xx_Public.unitypackage 54 | 55 | ## 利用規約 56 | 57 | 本ツールを使用して発生した問題に対して、 58 | 著作者gatosyocoraは一切の責任を負いかねますので、 59 | あらかじめご了承ください 60 | 61 | 本ツールはMITライセンスで運用されます 62 | 詳しくは[LICENSE](https://github.com/gatosyocora/VRCAvatars3Validator/blob/master/LICENSE)をご覧ください 63 | 64 | ## 変更履歴 65 | 66 | [CHANGELOG.md](./CHANGELOG.md)を確認してください 67 | 68 | ## 連絡先 69 | 70 | - Twitter : [@gatosyocora](https://twitter.com/gatosyocora) 71 | - Discord : gatosyocora#9575 72 | 73 | --- 74 |

75 | Unity Editor extension to detect errors of VRChat avatar 76 | 77 | It can add new detection rule. 78 | 79 | ## How to use 80 | 81 | ### VRCAvatars3Validator tool window 82 | 83 | It open tool window from `VRCAvatars3Validator/Editor` at Unity top menu. 84 | 85 | 1. select avatar in `Avatar` 86 | 2. put a check rules you want to use of `Rules` 87 | 3. press `Validate`, show errors 88 | 4. press `Select`, select object had error. press `AutoFix`, fix automatically if can fix. 89 | 90 | - When upload avatar, show this window if avatar has error by validate. 91 | 92 | ### VRCAvatars3Validator setting window 93 | 94 | It open tool setting window from `Edit> Project Settings> VRCAvatars3Validator` at Unity top menu. 95 | 96 | - **Validate OnUploadAvatar** : validate automatically on upload avatar if put a check 97 | - **Enable Rules** : it use rule that put a check in validation. 98 | 99 | ## Add new rule 100 | 101 | 1. It duplicate template file and create rule script. You can select way of duplicate. 102 | - Select `Create> C# VRCAvatars3ValidatorRule` in Project window 103 | - Select `Assets> Create> C# VRCAvatars3ValidatorRule` at Unity top menu. 104 | - Duplicate `TemplateRule.cs` file in Rules folder by `Left click> Duplicate` 105 | 2. Put new rule script in Rules folder. 106 | 3. Reopen tool window. 107 | 108 | - Please PR to github repository if add new rule 109 | 110 | 111 | ## Environment 112 | 113 | Unity 2018.4.20f1 114 | 115 | ## Dependence packages 116 | 117 | It needs to install those package if use this tool. 118 | 119 | - VRCSDK3-AVATAR-xxxx.xx.xx.xx.xx_Public.unitypackage 120 | 121 | ## Terms of use 122 | 123 | The author gatosyocora cannot be held responsible for any problems that may arise from using this tool. 124 | 125 | This tool is MIT License 126 | It reads [LICENSE](https://github.com/gatosyocora/VRCAvatars3Validator/blob/master/LICENSE) in detail. 127 | 128 | ## Changelog 129 | 130 | see [CHANGELOG.md](./CHANGELOG.md) 131 | 132 | ## Contact 133 | 134 | - Twitter : [@gatosyocora](https://twitter.com/gatosyocora) 135 | - Discord : gatosyocora#9575 136 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Rules/HaveNoMissingAnimationPathRule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEditor; 3 | #if VRC_SDK_VRCSDK3 4 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 5 | #else 6 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 7 | #endif 8 | using VRCAvatars3Validator.Models; 9 | using VRCAvatars3Validator.Utilities; 10 | using UnityEngine; 11 | using System.Linq; 12 | using System.IO; 13 | using System.Text.RegularExpressions; 14 | 15 | namespace VRCAvatars3Validator.Rules 16 | { 17 | /// 18 | /// Validate if have missing path in AnimationClips 19 | /// 20 | public class HaveNoMissingAnimationPathRule : IRule, Settingable 21 | { 22 | public string RuleSummary => Localize.Translate("HaveNoMissingAnimationPathRule_summary"); 23 | 24 | public static List ignoreAnimationFileRegexsDefault 25 | { 26 | get => new List 27 | { 28 | "^proxy_*" 29 | }; 30 | } 31 | 32 | public object Options => new HaveNoMissingAnimationPathRuleOptions(); 33 | 34 | 35 | public IEnumerable Validate(VRCAvatarDescriptor avatar, RuleItemOptions options) 36 | { 37 | var animationClips = VRCAvatarUtility.GetAnimationClips(avatar); 38 | var ignoreAnimationFileRegexs = (options.ReadOptions() ?? new HaveNoMissingAnimationPathRuleOptions()).IgnoreAnimationFileRegexs; 39 | foreach (var animationClip in animationClips) 40 | { 41 | var fileName = Path.GetFileName(AssetDatabase.GetAssetPath(animationClip)); 42 | if (ignoreAnimationFileRegexs.Any(regex => Regex.IsMatch(fileName, regex))) { 43 | continue; 44 | } 45 | foreach (var binding in AnimationUtility.GetCurveBindings(animationClip)) 46 | { 47 | if (!avatar.transform.Find(binding.path)) 48 | { 49 | yield return new ValidateResult( 50 | animationClip, 51 | ValidateResult.ValidateResultType.Warning, 52 | Localize.Translate("HaveNoMissingAnimationPathRule_result", animationClip.name, binding.path)); 53 | } 54 | } 55 | } 56 | } 57 | 58 | public void OnGUI(RuleItemOptions options) { 59 | EditorGUILayout.LabelField(Localize.Translate("HaveNoMissingAnimationPathRule_options_ignoreFileNameRegex")); 60 | using (new EditorGUILayout.HorizontalScope()) { 61 | GUILayout.FlexibleSpace(); 62 | if (GUILayout.Button(Localize.Translate("Add"))) { 63 | options.ChangeOptions(option => option.IgnoreAnimationFileRegexs.Add("")); 64 | } 65 | if (GUILayout.Button(Localize.Translate("Reset"))) { 66 | options.ChangeOptions(option => option.IgnoreAnimationFileRegexs = ignoreAnimationFileRegexsDefault); 67 | } 68 | } 69 | var haveNoMissingAnimationPathRuleOption = options.ReadOptions(); 70 | if (haveNoMissingAnimationPathRuleOption == null) return; 71 | var ignoreAnimationFileRegexs = haveNoMissingAnimationPathRuleOption.IgnoreAnimationFileRegexs; 72 | for (int i = 0; i < ignoreAnimationFileRegexs.Count; i++) { 73 | var ignoreAnimationFileRegex = ignoreAnimationFileRegexs[i]; 74 | 75 | using (new EditorGUILayout.HorizontalScope()) 76 | using (var check = new EditorGUI.ChangeCheckScope()) { 77 | ignoreAnimationFileRegexs[i] = EditorGUILayout.TextField(ignoreAnimationFileRegex); 78 | 79 | if (check.changed) { 80 | options.ChangeOptions(option => option.IgnoreAnimationFileRegexs = ignoreAnimationFileRegexs); 81 | } 82 | 83 | if (GUILayout.Button("×")) { 84 | ignoreAnimationFileRegexs.RemoveAt(i); 85 | options.ChangeOptions(option => option.IgnoreAnimationFileRegexs = ignoreAnimationFileRegexs); 86 | } 87 | } 88 | } 89 | } 90 | 91 | class HaveNoMissingAnimationPathRuleOptions 92 | { 93 | public List IgnoreAnimationFileRegexs = ignoreAnimationFileRegexsDefault; 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/HaveMissing2.anim: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!74 &7400000 4 | AnimationClip: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_Name: HaveMissing2 10 | serializedVersion: 6 11 | m_Legacy: 0 12 | m_Compressed: 0 13 | m_UseHighQualityCurve: 1 14 | m_RotationCurves: [] 15 | m_CompressedRotationCurves: [] 16 | m_EulerCurves: [] 17 | m_PositionCurves: [] 18 | m_ScaleCurves: [] 19 | m_FloatCurves: 20 | - curve: 21 | serializedVersion: 2 22 | m_Curve: 23 | - serializedVersion: 3 24 | time: 0 25 | value: 1 26 | inSlope: Infinity 27 | outSlope: Infinity 28 | tangentMode: 103 29 | weightedMode: 0 30 | inWeight: 0 31 | outWeight: 0 32 | - serializedVersion: 3 33 | time: 1 34 | value: 1 35 | inSlope: Infinity 36 | outSlope: Infinity 37 | tangentMode: 103 38 | weightedMode: 0 39 | inWeight: 0 40 | outWeight: 0 41 | m_PreInfinity: 2 42 | m_PostInfinity: 2 43 | m_RotationOrder: 4 44 | attribute: m_IsActive 45 | path: Spher 46 | classID: 1 47 | script: {fileID: 0} 48 | - curve: 49 | serializedVersion: 2 50 | m_Curve: 51 | - serializedVersion: 3 52 | time: 0 53 | value: 1 54 | inSlope: Infinity 55 | outSlope: Infinity 56 | tangentMode: 103 57 | weightedMode: 0 58 | inWeight: 0 59 | outWeight: 0 60 | - serializedVersion: 3 61 | time: 1 62 | value: 1 63 | inSlope: Infinity 64 | outSlope: Infinity 65 | tangentMode: 103 66 | weightedMode: 0 67 | inWeight: 0 68 | outWeight: 0 69 | m_PreInfinity: 2 70 | m_PostInfinity: 2 71 | m_RotationOrder: 4 72 | attribute: m_IsActive 73 | path: Parent/Capsules 74 | classID: 1 75 | script: {fileID: 0} 76 | m_PPtrCurves: [] 77 | m_SampleRate: 60 78 | m_WrapMode: 0 79 | m_Bounds: 80 | m_Center: {x: 0, y: 0, z: 0} 81 | m_Extent: {x: 0, y: 0, z: 0} 82 | m_ClipBindingConstant: 83 | genericBindings: 84 | - serializedVersion: 2 85 | path: 854325232 86 | attribute: 2086281974 87 | script: {fileID: 0} 88 | typeID: 1 89 | customType: 0 90 | isPPtrCurve: 0 91 | - serializedVersion: 2 92 | path: 1906329340 93 | attribute: 2086281974 94 | script: {fileID: 0} 95 | typeID: 1 96 | customType: 0 97 | isPPtrCurve: 0 98 | pptrCurveMapping: [] 99 | m_AnimationClipSettings: 100 | serializedVersion: 2 101 | m_AdditiveReferencePoseClip: {fileID: 0} 102 | m_AdditiveReferencePoseTime: 0 103 | m_StartTime: 0 104 | m_StopTime: 1 105 | m_OrientationOffsetY: 0 106 | m_Level: 0 107 | m_CycleOffset: 0 108 | m_HasAdditiveReferencePose: 0 109 | m_LoopTime: 0 110 | m_LoopBlend: 0 111 | m_LoopBlendOrientation: 0 112 | m_LoopBlendPositionY: 0 113 | m_LoopBlendPositionXZ: 0 114 | m_KeepOriginalOrientation: 0 115 | m_KeepOriginalPositionY: 1 116 | m_KeepOriginalPositionXZ: 0 117 | m_HeightFromFeet: 0 118 | m_Mirror: 0 119 | m_EditorCurves: 120 | - curve: 121 | serializedVersion: 2 122 | m_Curve: 123 | - serializedVersion: 3 124 | time: 0 125 | value: 1 126 | inSlope: Infinity 127 | outSlope: Infinity 128 | tangentMode: 103 129 | weightedMode: 0 130 | inWeight: 0 131 | outWeight: 0 132 | - serializedVersion: 3 133 | time: 1 134 | value: 1 135 | inSlope: Infinity 136 | outSlope: Infinity 137 | tangentMode: 103 138 | weightedMode: 0 139 | inWeight: 0 140 | outWeight: 0 141 | m_PreInfinity: 2 142 | m_PostInfinity: 2 143 | m_RotationOrder: 4 144 | attribute: m_IsActive 145 | path: Spher 146 | classID: 1 147 | script: {fileID: 0} 148 | - curve: 149 | serializedVersion: 2 150 | m_Curve: 151 | - serializedVersion: 3 152 | time: 0 153 | value: 1 154 | inSlope: Infinity 155 | outSlope: Infinity 156 | tangentMode: 103 157 | weightedMode: 0 158 | inWeight: 0 159 | outWeight: 0 160 | - serializedVersion: 3 161 | time: 1 162 | value: 1 163 | inSlope: Infinity 164 | outSlope: Infinity 165 | tangentMode: 103 166 | weightedMode: 0 167 | inWeight: 0 168 | outWeight: 0 169 | m_PreInfinity: 2 170 | m_PostInfinity: 2 171 | m_RotationOrder: 4 172 | attribute: m_IsActive 173 | path: Parent/Capsules 174 | classID: 1 175 | script: {fileID: 0} 176 | m_EulerEditorCurves: [] 177 | m_HasGenericRootTransform: 0 178 | m_HasMotionFloatCurves: 0 179 | m_Events: [] 180 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 4 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | particleRaycastBudget: 4 33 | asyncUploadTimeSlice: 2 34 | asyncUploadBufferSize: 16 35 | resolutionScalingFixedDPIFactor: 1 36 | excludedTargetPlatforms: [] 37 | - serializedVersion: 2 38 | name: Low 39 | pixelLightCount: 0 40 | shadows: 0 41 | shadowResolution: 0 42 | shadowProjection: 1 43 | shadowCascades: 1 44 | shadowDistance: 20 45 | shadowNearPlaneOffset: 3 46 | shadowCascade2Split: 0.33333334 47 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 48 | shadowmaskMode: 0 49 | blendWeights: 2 50 | textureQuality: 0 51 | anisotropicTextures: 0 52 | antiAliasing: 0 53 | softParticles: 0 54 | softVegetation: 0 55 | realtimeReflectionProbes: 0 56 | billboardsFaceCameraPosition: 0 57 | vSyncCount: 0 58 | lodBias: 0.4 59 | maximumLODLevel: 0 60 | particleRaycastBudget: 16 61 | asyncUploadTimeSlice: 2 62 | asyncUploadBufferSize: 16 63 | resolutionScalingFixedDPIFactor: 1 64 | excludedTargetPlatforms: [] 65 | - serializedVersion: 2 66 | name: Medium 67 | pixelLightCount: 1 68 | shadows: 1 69 | shadowResolution: 0 70 | shadowProjection: 1 71 | shadowCascades: 1 72 | shadowDistance: 20 73 | shadowNearPlaneOffset: 3 74 | shadowCascade2Split: 0.33333334 75 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 76 | shadowmaskMode: 0 77 | blendWeights: 2 78 | textureQuality: 0 79 | anisotropicTextures: 1 80 | antiAliasing: 0 81 | softParticles: 0 82 | softVegetation: 0 83 | realtimeReflectionProbes: 0 84 | billboardsFaceCameraPosition: 0 85 | vSyncCount: 1 86 | lodBias: 0.7 87 | maximumLODLevel: 0 88 | particleRaycastBudget: 64 89 | asyncUploadTimeSlice: 2 90 | asyncUploadBufferSize: 16 91 | resolutionScalingFixedDPIFactor: 1 92 | excludedTargetPlatforms: [] 93 | - serializedVersion: 2 94 | name: High 95 | pixelLightCount: 2 96 | shadows: 2 97 | shadowResolution: 1 98 | shadowProjection: 1 99 | shadowCascades: 2 100 | shadowDistance: 40 101 | shadowNearPlaneOffset: 3 102 | shadowCascade2Split: 0.33333334 103 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 104 | shadowmaskMode: 1 105 | blendWeights: 2 106 | textureQuality: 0 107 | anisotropicTextures: 1 108 | antiAliasing: 2 109 | softParticles: 0 110 | softVegetation: 1 111 | realtimeReflectionProbes: 1 112 | billboardsFaceCameraPosition: 1 113 | vSyncCount: 1 114 | lodBias: 1 115 | maximumLODLevel: 0 116 | particleRaycastBudget: 256 117 | asyncUploadTimeSlice: 2 118 | asyncUploadBufferSize: 16 119 | resolutionScalingFixedDPIFactor: 1 120 | excludedTargetPlatforms: [] 121 | - serializedVersion: 2 122 | name: Very High 123 | pixelLightCount: 3 124 | shadows: 2 125 | shadowResolution: 2 126 | shadowProjection: 1 127 | shadowCascades: 2 128 | shadowDistance: 40 129 | shadowNearPlaneOffset: 3 130 | shadowCascade2Split: 0.33333334 131 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 132 | shadowmaskMode: 1 133 | blendWeights: 4 134 | textureQuality: 0 135 | anisotropicTextures: 1 136 | antiAliasing: 4 137 | softParticles: 1 138 | softVegetation: 1 139 | realtimeReflectionProbes: 1 140 | billboardsFaceCameraPosition: 1 141 | vSyncCount: 1 142 | lodBias: 1.5 143 | maximumLODLevel: 0 144 | particleRaycastBudget: 1024 145 | asyncUploadTimeSlice: 2 146 | asyncUploadBufferSize: 16 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Ultra 151 | pixelLightCount: 4 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 4 156 | shadowDistance: 150 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 1 164 | antiAliasing: 4 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 2 171 | maximumLODLevel: 0 172 | particleRaycastBudget: 4096 173 | asyncUploadTimeSlice: 2 174 | asyncUploadBufferSize: 16 175 | resolutionScalingFixedDPIFactor: 1 176 | excludedTargetPlatforms: [] 177 | m_PerPlatformDefaultQuality: 178 | Android: 2 179 | Nintendo 3DS: 5 180 | Nintendo Switch: 5 181 | PS4: 5 182 | PSP2: 2 183 | Standalone: 5 184 | Tizen: 2 185 | WebGL: 3 186 | WiiU: 5 187 | Windows Store Apps: 5 188 | XboxOne: 5 189 | iPhone: 2 190 | tvOS: 2 191 | -------------------------------------------------------------------------------- /Assets/VRCAvatars3Validator/Editor/Views/VRCAvatars3ValidatorView.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using UnityEditor; 4 | using UnityEngine; 5 | #if VRC_SDK_VRCSDK3 6 | using VRCAvatarDescriptor = VRC.SDK3.Avatars.Components.VRCAvatarDescriptor; 7 | #else 8 | using VRCAvatarDescriptor = VRCAvatars3Validator.Mocks.VRCAvatarDescriptorMock; 9 | #endif 10 | using VRCAvatars3Validator.Models; 11 | using VRCAvatars3Validator.Utilities; 12 | using VRCAvatars3Validator.ViewModels; 13 | 14 | namespace VRCAvatars3Validator.Views 15 | { 16 | public class VRCAvatars3ValidatorView : EditorWindow 17 | { 18 | private VRCAvatars3ValidatorViewModel _viewModel = new VRCAvatars3ValidatorViewModel(); 19 | 20 | private Vector2 scrollPos = Vector2.zero; 21 | 22 | #if VRC_SDK_VRCSDK3 23 | [MenuItem("VRCAvatars3Validator/Editor")] 24 | #endif 25 | public static void Open() 26 | { 27 | GetWindow(VRCAvatars3ValidatorViewModel.EDITOR_NAME); 28 | } 29 | 30 | #if VRC_SDK_VRCSDK3 31 | [MenuItem("VRCAvatars3Validator/Setting")] 32 | #endif 33 | public static void OpenSetting() 34 | { 35 | SettingsService.OpenProjectSettings("Project/VRCAvatars3Validator"); 36 | } 37 | 38 | private void OnOpen() => _viewModel.OnOpen(); 39 | 40 | public void OnGUI() 41 | { 42 | OnOpen(); 43 | 44 | EditorGUILayout.Space(); 45 | 46 | using (new EditorGUILayout.HorizontalScope()) 47 | { 48 | GUILayout.FlexibleSpace(); 49 | 50 | if (GUILayout.Button(Localize.Translate("Settings"))) 51 | { 52 | _viewModel.OnSettingsClick(); 53 | } 54 | } 55 | 56 | using (var check = new EditorGUI.ChangeCheckScope()) 57 | { 58 | var avatar = EditorGUILayout.ObjectField( 59 | Localize.Translate("Avatar"), 60 | _viewModel.avatar, 61 | typeof(VRCAvatarDescriptor), 62 | true) as VRCAvatarDescriptor; 63 | 64 | if (check.changed) 65 | { 66 | _viewModel.OnSwitchAvatar(avatar); 67 | } 68 | } 69 | 70 | EditorGUILayout.Space(); 71 | 72 | EditorGUILayout.LabelField(Localize.Translate("Rules"), EditorStyles.boldLabel); 73 | 74 | using (new EditorGUI.IndentLevelScope()) 75 | { 76 | for (int i = 0; i < _viewModel.settings.rules.Count; i++) 77 | { 78 | var rule = RuleUtility.FilePath2IRule(_viewModel.settings.rules[i].FilePath); 79 | var enabled = EditorGUILayout.ToggleLeft( 80 | $"[{i + 1}] {rule.RuleSummary}", 81 | _viewModel.settings.rules[i].Enabled); 82 | if (enabled != _viewModel.settings.rules[i].Enabled) { 83 | EditorUtility.SetDirty(_viewModel.settings); 84 | _viewModel.settings.rules[i].Enabled = enabled; 85 | } 86 | } 87 | } 88 | 89 | EditorGUILayout.Space(); 90 | 91 | using (new EditorGUI.DisabledGroupScope(_viewModel.IsSelectionAvatar())) 92 | { 93 | if (GUILayout.Button(Localize.Translate("Validate"))) 94 | { 95 | _viewModel.OnValidateClick(); 96 | } 97 | } 98 | 99 | EditorGUILayout.Space(); 100 | 101 | EditorGUILayout.LabelField(Localize.Translate("Errors"), EditorStyles.boldLabel); 102 | 103 | if (_viewModel.HasNeverValided) return; 104 | 105 | if (_viewModel.ExistValidationResult()) 106 | { 107 | using (var scroll = new EditorGUILayout.ScrollViewScope(scrollPos)) 108 | { 109 | scrollPos = scroll.scrollPosition; 110 | foreach (var resultPair in _viewModel.resultDictionary) 111 | { 112 | var ruleId = resultPair.Key; 113 | var results = resultPair.Value; 114 | 115 | foreach (var result in results) 116 | { 117 | DrawResultItem(ruleId, result); 118 | } 119 | } 120 | } 121 | } 122 | else 123 | { 124 | EditorGUILayout.HelpBox(Localize.Translate("NoError"), MessageType.Info); 125 | } 126 | 127 | } 128 | 129 | private void DrawResultItem(int ruleId, ValidateResult result) 130 | { 131 | using (new EditorGUILayout.HorizontalScope()) 132 | { 133 | EditorGUILayout.HelpBox($"[{ruleId}] {result.ResultMessage}", 134 | result.ResultType == ValidateResult.ValidateResultType.Error ? MessageType.Error : 135 | result.ResultType == ValidateResult.ValidateResultType.Warning ? MessageType.Warning : MessageType.None); 136 | 137 | using (new EditorGUILayout.VerticalScope(GUILayout.Width(60f))) 138 | { 139 | if (GUILayout.Button(Localize.Translate("Select"), GUILayout.Width(60f))) 140 | { 141 | _viewModel.OnSelectClick(result); 142 | } 143 | 144 | using (new EditorGUI.DisabledGroupScope(!result.CanAutoFix)) 145 | { 146 | if (GUILayout.Button(Localize.Translate("AutoFix"), GUILayout.Width(60f))) 147 | { 148 | _viewModel.OnAutoFixClick(result); 149 | } 150 | } 151 | } 152 | } 153 | } 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/ExpressionsSubMenuRule/TestAvatar.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &2272470196771495860 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 2272470196771495819} 12 | - component: {fileID: 2272470196771495818} 13 | - component: {fileID: 2272470196771495861} 14 | m_Layer: 0 15 | m_Name: TestAvatar 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!4 &2272470196771495819 22 | Transform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 2272470196771495860} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_Children: [] 32 | m_Father: {fileID: 0} 33 | m_RootOrder: 0 34 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 35 | --- !u!114 &2272470196771495818 36 | MonoBehaviour: 37 | m_ObjectHideFlags: 0 38 | m_CorrespondingSourceObject: {fileID: 0} 39 | m_PrefabInstance: {fileID: 0} 40 | m_PrefabAsset: {fileID: 0} 41 | m_GameObject: {fileID: 2272470196771495860} 42 | m_Enabled: 1 43 | m_EditorHideFlags: 0 44 | m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} 45 | m_Name: 46 | m_EditorClassIdentifier: 47 | Name: 48 | ViewPosition: {x: 0, y: 1.6, z: 0.2} 49 | Animations: 0 50 | ScaleIPD: 1 51 | lipSync: 0 52 | lipSyncJawBone: {fileID: 0} 53 | lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1} 54 | lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1} 55 | VisemeSkinnedMesh: {fileID: 0} 56 | MouthOpenBlendShapeName: Facial_Blends.Jaw_Down 57 | VisemeBlendShapes: [] 58 | unityVersion: 59 | portraitCameraPositionOffset: {x: 0, y: 0, z: 0} 60 | portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} 61 | customExpressions: 1 62 | expressionsMenu: {fileID: 11400000, guid: fb299a6d92bd39444bbf3ed1162c841d, type: 2} 63 | expressionParameters: {fileID: 0} 64 | enableEyeLook: 0 65 | customEyeLookSettings: 66 | eyeMovement: 67 | confidence: 0.5 68 | excitement: 0.5 69 | leftEye: {fileID: 0} 70 | rightEye: {fileID: 0} 71 | eyesLookingStraight: 72 | linked: 1 73 | left: {x: 0, y: 0, z: 0, w: 0} 74 | right: {x: 0, y: 0, z: 0, w: 0} 75 | eyesLookingUp: 76 | linked: 1 77 | left: {x: 0, y: 0, z: 0, w: 0} 78 | right: {x: 0, y: 0, z: 0, w: 0} 79 | eyesLookingDown: 80 | linked: 1 81 | left: {x: 0, y: 0, z: 0, w: 0} 82 | right: {x: 0, y: 0, z: 0, w: 0} 83 | eyesLookingLeft: 84 | linked: 1 85 | left: {x: 0, y: 0, z: 0, w: 0} 86 | right: {x: 0, y: 0, z: 0, w: 0} 87 | eyesLookingRight: 88 | linked: 1 89 | left: {x: 0, y: 0, z: 0, w: 0} 90 | right: {x: 0, y: 0, z: 0, w: 0} 91 | eyelidType: 0 92 | upperLeftEyelid: {fileID: 0} 93 | upperRightEyelid: {fileID: 0} 94 | lowerLeftEyelid: {fileID: 0} 95 | lowerRightEyelid: {fileID: 0} 96 | eyelidsDefault: 97 | upper: 98 | linked: 1 99 | left: {x: 0, y: 0, z: 0, w: 0} 100 | right: {x: 0, y: 0, z: 0, w: 0} 101 | lower: 102 | linked: 1 103 | left: {x: 0, y: 0, z: 0, w: 0} 104 | right: {x: 0, y: 0, z: 0, w: 0} 105 | eyelidsClosed: 106 | upper: 107 | linked: 1 108 | left: {x: 0, y: 0, z: 0, w: 0} 109 | right: {x: 0, y: 0, z: 0, w: 0} 110 | lower: 111 | linked: 1 112 | left: {x: 0, y: 0, z: 0, w: 0} 113 | right: {x: 0, y: 0, z: 0, w: 0} 114 | eyelidsLookingUp: 115 | upper: 116 | linked: 1 117 | left: {x: 0, y: 0, z: 0, w: 0} 118 | right: {x: 0, y: 0, z: 0, w: 0} 119 | lower: 120 | linked: 1 121 | left: {x: 0, y: 0, z: 0, w: 0} 122 | right: {x: 0, y: 0, z: 0, w: 0} 123 | eyelidsLookingDown: 124 | upper: 125 | linked: 1 126 | left: {x: 0, y: 0, z: 0, w: 0} 127 | right: {x: 0, y: 0, z: 0, w: 0} 128 | lower: 129 | linked: 1 130 | left: {x: 0, y: 0, z: 0, w: 0} 131 | right: {x: 0, y: 0, z: 0, w: 0} 132 | eyelidsSkinnedMesh: {fileID: 0} 133 | eyelidsBlendshapes: 134 | customizeAnimationLayers: 0 135 | baseAnimationLayers: 136 | - isEnabled: 0 137 | type: 0 138 | animatorController: {fileID: 0} 139 | mask: {fileID: 0} 140 | isDefault: 1 141 | - isEnabled: 0 142 | type: 2 143 | animatorController: {fileID: 0} 144 | mask: {fileID: 0} 145 | isDefault: 1 146 | - isEnabled: 0 147 | type: 3 148 | animatorController: {fileID: 0} 149 | mask: {fileID: 0} 150 | isDefault: 1 151 | - isEnabled: 0 152 | type: 4 153 | animatorController: {fileID: 0} 154 | mask: {fileID: 0} 155 | isDefault: 1 156 | - isEnabled: 0 157 | type: 5 158 | animatorController: {fileID: 0} 159 | mask: {fileID: 0} 160 | isDefault: 1 161 | specialAnimationLayers: 162 | - isEnabled: 0 163 | type: 6 164 | animatorController: {fileID: 0} 165 | mask: {fileID: 0} 166 | isDefault: 1 167 | - isEnabled: 0 168 | type: 7 169 | animatorController: {fileID: 0} 170 | mask: {fileID: 0} 171 | isDefault: 1 172 | - isEnabled: 0 173 | type: 8 174 | animatorController: {fileID: 0} 175 | mask: {fileID: 0} 176 | isDefault: 1 177 | AnimationPreset: {fileID: 0} 178 | animationHashSet: [] 179 | autoFootsteps: 1 180 | autoLocomotion: 1 181 | --- !u!114 &2272470196771495861 182 | MonoBehaviour: 183 | m_ObjectHideFlags: 0 184 | m_CorrespondingSourceObject: {fileID: 0} 185 | m_PrefabInstance: {fileID: 0} 186 | m_PrefabAsset: {fileID: 0} 187 | m_GameObject: {fileID: 2272470196771495860} 188 | m_Enabled: 1 189 | m_EditorHideFlags: 0 190 | m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3} 191 | m_Name: 192 | m_EditorClassIdentifier: 193 | launchedFromSDKPipeline: 0 194 | completedSDKPipeline: 0 195 | blueprintId: 196 | contentType: 0 197 | assetBundleUnityVersion: 198 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/NoMissing.anim: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!74 &7400000 4 | AnimationClip: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_Name: NoMissing 10 | serializedVersion: 6 11 | m_Legacy: 0 12 | m_Compressed: 0 13 | m_UseHighQualityCurve: 1 14 | m_RotationCurves: [] 15 | m_CompressedRotationCurves: [] 16 | m_EulerCurves: [] 17 | m_PositionCurves: [] 18 | m_ScaleCurves: [] 19 | m_FloatCurves: 20 | - curve: 21 | serializedVersion: 2 22 | m_Curve: 23 | - serializedVersion: 3 24 | time: 0 25 | value: 1 26 | inSlope: Infinity 27 | outSlope: Infinity 28 | tangentMode: 103 29 | weightedMode: 0 30 | inWeight: 0 31 | outWeight: 0 32 | - serializedVersion: 3 33 | time: 1 34 | value: 1 35 | inSlope: Infinity 36 | outSlope: Infinity 37 | tangentMode: 103 38 | weightedMode: 0 39 | inWeight: 0 40 | outWeight: 0 41 | m_PreInfinity: 2 42 | m_PostInfinity: 2 43 | m_RotationOrder: 4 44 | attribute: m_IsActive 45 | path: Cube 46 | classID: 1 47 | script: {fileID: 0} 48 | - curve: 49 | serializedVersion: 2 50 | m_Curve: 51 | - serializedVersion: 3 52 | time: 0 53 | value: 1 54 | inSlope: Infinity 55 | outSlope: Infinity 56 | tangentMode: 103 57 | weightedMode: 0 58 | inWeight: 0 59 | outWeight: 0 60 | - serializedVersion: 3 61 | time: 1 62 | value: 1 63 | inSlope: Infinity 64 | outSlope: Infinity 65 | tangentMode: 103 66 | weightedMode: 0 67 | inWeight: 0 68 | outWeight: 0 69 | m_PreInfinity: 2 70 | m_PostInfinity: 2 71 | m_RotationOrder: 4 72 | attribute: m_Enabled 73 | path: Sphere 74 | classID: 23 75 | script: {fileID: 0} 76 | - curve: 77 | serializedVersion: 2 78 | m_Curve: 79 | - serializedVersion: 3 80 | time: 0 81 | value: 1 82 | inSlope: Infinity 83 | outSlope: Infinity 84 | tangentMode: 103 85 | weightedMode: 0 86 | inWeight: 0 87 | outWeight: 0 88 | - serializedVersion: 3 89 | time: 1 90 | value: 1 91 | inSlope: Infinity 92 | outSlope: Infinity 93 | tangentMode: 103 94 | weightedMode: 0 95 | inWeight: 0 96 | outWeight: 0 97 | m_PreInfinity: 2 98 | m_PostInfinity: 2 99 | m_RotationOrder: 4 100 | attribute: m_IsActive 101 | path: Parent/Capsule 102 | classID: 1 103 | script: {fileID: 0} 104 | m_PPtrCurves: [] 105 | m_SampleRate: 60 106 | m_WrapMode: 0 107 | m_Bounds: 108 | m_Center: {x: 0, y: 0, z: 0} 109 | m_Extent: {x: 0, y: 0, z: 0} 110 | m_ClipBindingConstant: 111 | genericBindings: 112 | - serializedVersion: 2 113 | path: 2429296262 114 | attribute: 2086281974 115 | script: {fileID: 0} 116 | typeID: 1 117 | customType: 0 118 | isPPtrCurve: 0 119 | - serializedVersion: 2 120 | path: 1381327793 121 | attribute: 3305885265 122 | script: {fileID: 0} 123 | typeID: 23 124 | customType: 0 125 | isPPtrCurve: 0 126 | - serializedVersion: 2 127 | path: 514393361 128 | attribute: 2086281974 129 | script: {fileID: 0} 130 | typeID: 1 131 | customType: 0 132 | isPPtrCurve: 0 133 | pptrCurveMapping: [] 134 | m_AnimationClipSettings: 135 | serializedVersion: 2 136 | m_AdditiveReferencePoseClip: {fileID: 0} 137 | m_AdditiveReferencePoseTime: 0 138 | m_StartTime: 0 139 | m_StopTime: 1 140 | m_OrientationOffsetY: 0 141 | m_Level: 0 142 | m_CycleOffset: 0 143 | m_HasAdditiveReferencePose: 0 144 | m_LoopTime: 0 145 | m_LoopBlend: 0 146 | m_LoopBlendOrientation: 0 147 | m_LoopBlendPositionY: 0 148 | m_LoopBlendPositionXZ: 0 149 | m_KeepOriginalOrientation: 0 150 | m_KeepOriginalPositionY: 1 151 | m_KeepOriginalPositionXZ: 0 152 | m_HeightFromFeet: 0 153 | m_Mirror: 0 154 | m_EditorCurves: 155 | - curve: 156 | serializedVersion: 2 157 | m_Curve: 158 | - serializedVersion: 3 159 | time: 0 160 | value: 1 161 | inSlope: Infinity 162 | outSlope: Infinity 163 | tangentMode: 103 164 | weightedMode: 0 165 | inWeight: 0 166 | outWeight: 0 167 | - serializedVersion: 3 168 | time: 1 169 | value: 1 170 | inSlope: Infinity 171 | outSlope: Infinity 172 | tangentMode: 103 173 | weightedMode: 0 174 | inWeight: 0 175 | outWeight: 0 176 | m_PreInfinity: 2 177 | m_PostInfinity: 2 178 | m_RotationOrder: 4 179 | attribute: m_IsActive 180 | path: Cube 181 | classID: 1 182 | script: {fileID: 0} 183 | - curve: 184 | serializedVersion: 2 185 | m_Curve: 186 | - serializedVersion: 3 187 | time: 0 188 | value: 1 189 | inSlope: Infinity 190 | outSlope: Infinity 191 | tangentMode: 103 192 | weightedMode: 0 193 | inWeight: 0 194 | outWeight: 0 195 | - serializedVersion: 3 196 | time: 1 197 | value: 1 198 | inSlope: Infinity 199 | outSlope: Infinity 200 | tangentMode: 103 201 | weightedMode: 0 202 | inWeight: 0 203 | outWeight: 0 204 | m_PreInfinity: 2 205 | m_PostInfinity: 2 206 | m_RotationOrder: 4 207 | attribute: m_Enabled 208 | path: Sphere 209 | classID: 23 210 | script: {fileID: 0} 211 | - curve: 212 | serializedVersion: 2 213 | m_Curve: 214 | - serializedVersion: 3 215 | time: 0 216 | value: 1 217 | inSlope: Infinity 218 | outSlope: Infinity 219 | tangentMode: 103 220 | weightedMode: 0 221 | inWeight: 0 222 | outWeight: 0 223 | - serializedVersion: 3 224 | time: 1 225 | value: 1 226 | inSlope: Infinity 227 | outSlope: Infinity 228 | tangentMode: 103 229 | weightedMode: 0 230 | inWeight: 0 231 | outWeight: 0 232 | m_PreInfinity: 2 233 | m_PostInfinity: 2 234 | m_RotationOrder: 4 235 | attribute: m_IsActive 236 | path: Parent/Capsule 237 | classID: 1 238 | script: {fileID: 0} 239 | m_EulerEditorCurves: [] 240 | m_HasGenericRootTransform: 0 241 | m_HasMotionFloatCurves: 0 242 | m_Events: [] 243 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/FX.controller: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!91 &9100000 4 | AnimatorController: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_Name: FX 10 | serializedVersion: 5 11 | m_AnimatorParameters: [] 12 | m_AnimatorLayers: 13 | - serializedVersion: 5 14 | m_Name: Base Layer 15 | m_StateMachine: {fileID: 1107219198239648110} 16 | m_Mask: {fileID: 0} 17 | m_Motions: [] 18 | m_Behaviours: [] 19 | m_BlendingMode: 0 20 | m_SyncedLayerIndex: -1 21 | m_DefaultWeight: 0 22 | m_IKPass: 0 23 | m_SyncedLayerAffectsTiming: 0 24 | m_Controller: {fileID: 9100000} 25 | - serializedVersion: 5 26 | m_Name: New Layer 27 | m_StateMachine: {fileID: 1107218631768383142} 28 | m_Mask: {fileID: 0} 29 | m_Motions: [] 30 | m_Behaviours: [] 31 | m_BlendingMode: 0 32 | m_SyncedLayerIndex: -1 33 | m_DefaultWeight: 1 34 | m_IKPass: 0 35 | m_SyncedLayerAffectsTiming: 0 36 | m_Controller: {fileID: 9100000} 37 | - serializedVersion: 5 38 | m_Name: New Layer 0 39 | m_StateMachine: {fileID: 1107511561352770002} 40 | m_Mask: {fileID: 0} 41 | m_Motions: [] 42 | m_Behaviours: [] 43 | m_BlendingMode: 0 44 | m_SyncedLayerIndex: -1 45 | m_DefaultWeight: 1 46 | m_IKPass: 0 47 | m_SyncedLayerAffectsTiming: 0 48 | m_Controller: {fileID: 9100000} 49 | --- !u!1101 &1101988247173481488 50 | AnimatorStateTransition: 51 | m_ObjectHideFlags: 1 52 | m_CorrespondingSourceObject: {fileID: 0} 53 | m_PrefabInstance: {fileID: 0} 54 | m_PrefabAsset: {fileID: 0} 55 | m_Name: 56 | m_Conditions: [] 57 | m_DstStateMachine: {fileID: 0} 58 | m_DstState: {fileID: 1102519741847120032} 59 | m_Solo: 0 60 | m_Mute: 0 61 | m_IsExit: 0 62 | serializedVersion: 3 63 | m_TransitionDuration: 0.25 64 | m_TransitionOffset: 0 65 | m_ExitTime: 0.75 66 | m_HasExitTime: 1 67 | m_HasFixedDuration: 1 68 | m_InterruptionSource: 0 69 | m_OrderedInterruption: 1 70 | m_CanTransitionToSelf: 1 71 | --- !u!1102 &1102519741847120032 72 | AnimatorState: 73 | serializedVersion: 5 74 | m_ObjectHideFlags: 1 75 | m_CorrespondingSourceObject: {fileID: 0} 76 | m_PrefabInstance: {fileID: 0} 77 | m_PrefabAsset: {fileID: 0} 78 | m_Name: HaveMissing2 79 | m_Speed: 1 80 | m_CycleOffset: 0 81 | m_Transitions: [] 82 | m_StateMachineBehaviours: [] 83 | m_Position: {x: 50, y: 50, z: 0} 84 | m_IKOnFeet: 0 85 | m_WriteDefaultValues: 1 86 | m_Mirror: 0 87 | m_SpeedParameterActive: 0 88 | m_MirrorParameterActive: 0 89 | m_CycleOffsetParameterActive: 0 90 | m_TimeParameterActive: 0 91 | m_Motion: {fileID: 7400000, guid: 7a10dddcd1fb33c48b79d0eafe93949f, type: 2} 92 | m_Tag: 93 | m_SpeedParameter: 94 | m_MirrorParameter: 95 | m_CycleOffsetParameter: 96 | m_TimeParameter: 97 | --- !u!1102 &1102606519137102018 98 | AnimatorState: 99 | serializedVersion: 5 100 | m_ObjectHideFlags: 1 101 | m_CorrespondingSourceObject: {fileID: 0} 102 | m_PrefabInstance: {fileID: 0} 103 | m_PrefabAsset: {fileID: 0} 104 | m_Name: NoMissing 105 | m_Speed: 1 106 | m_CycleOffset: 0 107 | m_Transitions: 108 | - {fileID: 1101988247173481488} 109 | m_StateMachineBehaviours: [] 110 | m_Position: {x: 50, y: 50, z: 0} 111 | m_IKOnFeet: 0 112 | m_WriteDefaultValues: 1 113 | m_Mirror: 0 114 | m_SpeedParameterActive: 0 115 | m_MirrorParameterActive: 0 116 | m_CycleOffsetParameterActive: 0 117 | m_TimeParameterActive: 0 118 | m_Motion: {fileID: 7400000, guid: 80e8a5336587e314c984d3ca6aebb4e8, type: 2} 119 | m_Tag: 120 | m_SpeedParameter: 121 | m_MirrorParameter: 122 | m_CycleOffsetParameter: 123 | m_TimeParameter: 124 | --- !u!1102 &1102720591545502590 125 | AnimatorState: 126 | serializedVersion: 5 127 | m_ObjectHideFlags: 1 128 | m_CorrespondingSourceObject: {fileID: 0} 129 | m_PrefabInstance: {fileID: 0} 130 | m_PrefabAsset: {fileID: 0} 131 | m_Name: HaveMissing 132 | m_Speed: 1 133 | m_CycleOffset: 0 134 | m_Transitions: [] 135 | m_StateMachineBehaviours: [] 136 | m_Position: {x: 50, y: 50, z: 0} 137 | m_IKOnFeet: 0 138 | m_WriteDefaultValues: 1 139 | m_Mirror: 0 140 | m_SpeedParameterActive: 0 141 | m_MirrorParameterActive: 0 142 | m_CycleOffsetParameterActive: 0 143 | m_TimeParameterActive: 0 144 | m_Motion: {fileID: 7400000, guid: 2efc90e0d0024f24f9e72f6b6325138b, type: 2} 145 | m_Tag: 146 | m_SpeedParameter: 147 | m_MirrorParameter: 148 | m_CycleOffsetParameter: 149 | m_TimeParameter: 150 | --- !u!1107 &1107218631768383142 151 | AnimatorStateMachine: 152 | serializedVersion: 5 153 | m_ObjectHideFlags: 1 154 | m_CorrespondingSourceObject: {fileID: 0} 155 | m_PrefabInstance: {fileID: 0} 156 | m_PrefabAsset: {fileID: 0} 157 | m_Name: New Layer 158 | m_ChildStates: 159 | - serializedVersion: 1 160 | m_State: {fileID: 1102720591545502590} 161 | m_Position: {x: 431.19116, y: -80.70532, z: 0} 162 | m_ChildStateMachines: [] 163 | m_AnyStateTransitions: [] 164 | m_EntryTransitions: [] 165 | m_StateMachineTransitions: {} 166 | m_StateMachineBehaviours: [] 167 | m_AnyStatePosition: {x: 50, y: 20, z: 0} 168 | m_EntryPosition: {x: 50, y: 120, z: 0} 169 | m_ExitPosition: {x: 800, y: 120, z: 0} 170 | m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} 171 | m_DefaultState: {fileID: 1102720591545502590} 172 | --- !u!1107 &1107219198239648110 173 | AnimatorStateMachine: 174 | serializedVersion: 5 175 | m_ObjectHideFlags: 1 176 | m_CorrespondingSourceObject: {fileID: 0} 177 | m_PrefabInstance: {fileID: 0} 178 | m_PrefabAsset: {fileID: 0} 179 | m_Name: Base Layer 180 | m_ChildStates: [] 181 | m_ChildStateMachines: [] 182 | m_AnyStateTransitions: [] 183 | m_EntryTransitions: [] 184 | m_StateMachineTransitions: {} 185 | m_StateMachineBehaviours: [] 186 | m_AnyStatePosition: {x: 50, y: 20, z: 0} 187 | m_EntryPosition: {x: 50, y: 120, z: 0} 188 | m_ExitPosition: {x: 800, y: 120, z: 0} 189 | m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} 190 | m_DefaultState: {fileID: 0} 191 | --- !u!1107 &1107511561352770002 192 | AnimatorStateMachine: 193 | serializedVersion: 5 194 | m_ObjectHideFlags: 1 195 | m_CorrespondingSourceObject: {fileID: 0} 196 | m_PrefabInstance: {fileID: 0} 197 | m_PrefabAsset: {fileID: 0} 198 | m_Name: New Layer 0 199 | m_ChildStates: 200 | - serializedVersion: 1 201 | m_State: {fileID: 1102606519137102018} 202 | m_Position: {x: 324, y: 324, z: 0} 203 | - serializedVersion: 1 204 | m_State: {fileID: 1102519741847120032} 205 | m_Position: {x: 528, y: 468, z: 0} 206 | m_ChildStateMachines: [] 207 | m_AnyStateTransitions: [] 208 | m_EntryTransitions: [] 209 | m_StateMachineTransitions: {} 210 | m_StateMachineBehaviours: [] 211 | m_AnyStatePosition: {x: 50, y: 20, z: 0} 212 | m_EntryPosition: {x: 50, y: 120, z: 0} 213 | m_ExitPosition: {x: 800, y: 120, z: 0} 214 | m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} 215 | m_DefaultState: {fileID: 1102606519137102018} 216 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.2d.sprite": { 4 | "version": "1.0.0", 5 | "depth": 0, 6 | "source": "builtin", 7 | "dependencies": {} 8 | }, 9 | "com.unity.2d.tilemap": { 10 | "version": "1.0.0", 11 | "depth": 0, 12 | "source": "builtin", 13 | "dependencies": {} 14 | }, 15 | "com.unity.ads": { 16 | "version": "3.7.5", 17 | "depth": 0, 18 | "source": "registry", 19 | "dependencies": { 20 | "com.unity.ugui": "1.0.0" 21 | }, 22 | "url": "https://packages.unity.com" 23 | }, 24 | "com.unity.analytics": { 25 | "version": "3.6.11", 26 | "depth": 0, 27 | "source": "registry", 28 | "dependencies": { 29 | "com.unity.ugui": "1.0.0" 30 | }, 31 | "url": "https://packages.unity.com" 32 | }, 33 | "com.unity.collab-proxy": { 34 | "version": "1.10.2", 35 | "depth": 0, 36 | "source": "registry", 37 | "dependencies": {}, 38 | "url": "https://packages.unity.com" 39 | }, 40 | "com.unity.ext.nunit": { 41 | "version": "1.0.6", 42 | "depth": 1, 43 | "source": "registry", 44 | "dependencies": {}, 45 | "url": "https://packages.unity.com" 46 | }, 47 | "com.unity.ide.rider": { 48 | "version": "1.2.1", 49 | "depth": 0, 50 | "source": "registry", 51 | "dependencies": { 52 | "com.unity.test-framework": "1.1.1" 53 | }, 54 | "url": "https://packages.unity.com" 55 | }, 56 | "com.unity.ide.visualstudio": { 57 | "version": "2.0.11", 58 | "depth": 0, 59 | "source": "registry", 60 | "dependencies": { 61 | "com.unity.test-framework": "1.1.9" 62 | }, 63 | "url": "https://packages.unity.com" 64 | }, 65 | "com.unity.ide.vscode": { 66 | "version": "1.2.4", 67 | "depth": 0, 68 | "source": "registry", 69 | "dependencies": {}, 70 | "url": "https://packages.unity.com" 71 | }, 72 | "com.unity.multiplayer-hlapi": { 73 | "version": "1.0.8", 74 | "depth": 0, 75 | "source": "registry", 76 | "dependencies": { 77 | "nuget.mono-cecil": "0.1.6-preview" 78 | }, 79 | "url": "https://packages.unity.com" 80 | }, 81 | "com.unity.purchasing": { 82 | "version": "3.2.2", 83 | "depth": 0, 84 | "source": "registry", 85 | "dependencies": { 86 | "com.unity.ugui": "1.0.0", 87 | "com.unity.modules.unityanalytics": "1.0.0", 88 | "com.unity.modules.unitywebrequest": "1.0.0", 89 | "com.unity.modules.jsonserialize": "1.0.0", 90 | "com.unity.modules.androidjni": "1.0.0" 91 | }, 92 | "url": "https://packages.unity.com" 93 | }, 94 | "com.unity.test-framework": { 95 | "version": "1.1.29", 96 | "depth": 0, 97 | "source": "registry", 98 | "dependencies": { 99 | "com.unity.ext.nunit": "1.0.6", 100 | "com.unity.modules.imgui": "1.0.0", 101 | "com.unity.modules.jsonserialize": "1.0.0" 102 | }, 103 | "url": "https://packages.unity.com" 104 | }, 105 | "com.unity.textmeshpro": { 106 | "version": "2.1.4", 107 | "depth": 0, 108 | "source": "registry", 109 | "dependencies": { 110 | "com.unity.ugui": "1.0.0" 111 | }, 112 | "url": "https://packages.unity.com" 113 | }, 114 | "com.unity.timeline": { 115 | "version": "1.2.18", 116 | "depth": 0, 117 | "source": "registry", 118 | "dependencies": { 119 | "com.unity.modules.director": "1.0.0", 120 | "com.unity.modules.animation": "1.0.0", 121 | "com.unity.modules.audio": "1.0.0", 122 | "com.unity.modules.particlesystem": "1.0.0" 123 | }, 124 | "url": "https://packages.unity.com" 125 | }, 126 | "com.unity.ugui": { 127 | "version": "1.0.0", 128 | "depth": 0, 129 | "source": "builtin", 130 | "dependencies": { 131 | "com.unity.modules.ui": "1.0.0", 132 | "com.unity.modules.imgui": "1.0.0" 133 | } 134 | }, 135 | "com.unity.xr.legacyinputhelpers": { 136 | "version": "2.1.8", 137 | "depth": 0, 138 | "source": "registry", 139 | "dependencies": { 140 | "com.unity.modules.vr": "1.0.0", 141 | "com.unity.modules.xr": "1.0.0" 142 | }, 143 | "url": "https://packages.unity.com" 144 | }, 145 | "com.unity.xr.oculus.standalone": { 146 | "version": "2.38.4", 147 | "depth": 0, 148 | "source": "registry", 149 | "dependencies": {}, 150 | "url": "https://packages.unity.com" 151 | }, 152 | "com.unity.xr.openvr.standalone": { 153 | "version": "2.0.5", 154 | "depth": 0, 155 | "source": "registry", 156 | "dependencies": {}, 157 | "url": "https://packages.unity.com" 158 | }, 159 | "nuget.mono-cecil": { 160 | "version": "0.1.6-preview", 161 | "depth": 1, 162 | "source": "registry", 163 | "dependencies": {}, 164 | "url": "https://packages.unity.com" 165 | }, 166 | "com.unity.modules.ai": { 167 | "version": "1.0.0", 168 | "depth": 0, 169 | "source": "builtin", 170 | "dependencies": {} 171 | }, 172 | "com.unity.modules.androidjni": { 173 | "version": "1.0.0", 174 | "depth": 0, 175 | "source": "builtin", 176 | "dependencies": {} 177 | }, 178 | "com.unity.modules.animation": { 179 | "version": "1.0.0", 180 | "depth": 0, 181 | "source": "builtin", 182 | "dependencies": {} 183 | }, 184 | "com.unity.modules.assetbundle": { 185 | "version": "1.0.0", 186 | "depth": 0, 187 | "source": "builtin", 188 | "dependencies": {} 189 | }, 190 | "com.unity.modules.audio": { 191 | "version": "1.0.0", 192 | "depth": 0, 193 | "source": "builtin", 194 | "dependencies": {} 195 | }, 196 | "com.unity.modules.cloth": { 197 | "version": "1.0.0", 198 | "depth": 0, 199 | "source": "builtin", 200 | "dependencies": { 201 | "com.unity.modules.physics": "1.0.0" 202 | } 203 | }, 204 | "com.unity.modules.director": { 205 | "version": "1.0.0", 206 | "depth": 0, 207 | "source": "builtin", 208 | "dependencies": { 209 | "com.unity.modules.audio": "1.0.0", 210 | "com.unity.modules.animation": "1.0.0" 211 | } 212 | }, 213 | "com.unity.modules.imageconversion": { 214 | "version": "1.0.0", 215 | "depth": 0, 216 | "source": "builtin", 217 | "dependencies": {} 218 | }, 219 | "com.unity.modules.imgui": { 220 | "version": "1.0.0", 221 | "depth": 0, 222 | "source": "builtin", 223 | "dependencies": {} 224 | }, 225 | "com.unity.modules.jsonserialize": { 226 | "version": "1.0.0", 227 | "depth": 0, 228 | "source": "builtin", 229 | "dependencies": {} 230 | }, 231 | "com.unity.modules.particlesystem": { 232 | "version": "1.0.0", 233 | "depth": 0, 234 | "source": "builtin", 235 | "dependencies": {} 236 | }, 237 | "com.unity.modules.physics": { 238 | "version": "1.0.0", 239 | "depth": 0, 240 | "source": "builtin", 241 | "dependencies": {} 242 | }, 243 | "com.unity.modules.physics2d": { 244 | "version": "1.0.0", 245 | "depth": 0, 246 | "source": "builtin", 247 | "dependencies": {} 248 | }, 249 | "com.unity.modules.screencapture": { 250 | "version": "1.0.0", 251 | "depth": 0, 252 | "source": "builtin", 253 | "dependencies": { 254 | "com.unity.modules.imageconversion": "1.0.0" 255 | } 256 | }, 257 | "com.unity.modules.subsystems": { 258 | "version": "1.0.0", 259 | "depth": 1, 260 | "source": "builtin", 261 | "dependencies": { 262 | "com.unity.modules.jsonserialize": "1.0.0" 263 | } 264 | }, 265 | "com.unity.modules.terrain": { 266 | "version": "1.0.0", 267 | "depth": 0, 268 | "source": "builtin", 269 | "dependencies": {} 270 | }, 271 | "com.unity.modules.terrainphysics": { 272 | "version": "1.0.0", 273 | "depth": 0, 274 | "source": "builtin", 275 | "dependencies": { 276 | "com.unity.modules.physics": "1.0.0", 277 | "com.unity.modules.terrain": "1.0.0" 278 | } 279 | }, 280 | "com.unity.modules.tilemap": { 281 | "version": "1.0.0", 282 | "depth": 0, 283 | "source": "builtin", 284 | "dependencies": { 285 | "com.unity.modules.physics2d": "1.0.0" 286 | } 287 | }, 288 | "com.unity.modules.ui": { 289 | "version": "1.0.0", 290 | "depth": 0, 291 | "source": "builtin", 292 | "dependencies": {} 293 | }, 294 | "com.unity.modules.uielements": { 295 | "version": "1.0.0", 296 | "depth": 0, 297 | "source": "builtin", 298 | "dependencies": { 299 | "com.unity.modules.imgui": "1.0.0", 300 | "com.unity.modules.jsonserialize": "1.0.0" 301 | } 302 | }, 303 | "com.unity.modules.umbra": { 304 | "version": "1.0.0", 305 | "depth": 0, 306 | "source": "builtin", 307 | "dependencies": {} 308 | }, 309 | "com.unity.modules.unityanalytics": { 310 | "version": "1.0.0", 311 | "depth": 0, 312 | "source": "builtin", 313 | "dependencies": { 314 | "com.unity.modules.unitywebrequest": "1.0.0", 315 | "com.unity.modules.jsonserialize": "1.0.0" 316 | } 317 | }, 318 | "com.unity.modules.unitywebrequest": { 319 | "version": "1.0.0", 320 | "depth": 0, 321 | "source": "builtin", 322 | "dependencies": {} 323 | }, 324 | "com.unity.modules.unitywebrequestassetbundle": { 325 | "version": "1.0.0", 326 | "depth": 0, 327 | "source": "builtin", 328 | "dependencies": { 329 | "com.unity.modules.assetbundle": "1.0.0", 330 | "com.unity.modules.unitywebrequest": "1.0.0" 331 | } 332 | }, 333 | "com.unity.modules.unitywebrequestaudio": { 334 | "version": "1.0.0", 335 | "depth": 0, 336 | "source": "builtin", 337 | "dependencies": { 338 | "com.unity.modules.unitywebrequest": "1.0.0", 339 | "com.unity.modules.audio": "1.0.0" 340 | } 341 | }, 342 | "com.unity.modules.unitywebrequesttexture": { 343 | "version": "1.0.0", 344 | "depth": 0, 345 | "source": "builtin", 346 | "dependencies": { 347 | "com.unity.modules.unitywebrequest": "1.0.0", 348 | "com.unity.modules.imageconversion": "1.0.0" 349 | } 350 | }, 351 | "com.unity.modules.unitywebrequestwww": { 352 | "version": "1.0.0", 353 | "depth": 0, 354 | "source": "builtin", 355 | "dependencies": { 356 | "com.unity.modules.unitywebrequest": "1.0.0", 357 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 358 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 359 | "com.unity.modules.audio": "1.0.0", 360 | "com.unity.modules.assetbundle": "1.0.0", 361 | "com.unity.modules.imageconversion": "1.0.0" 362 | } 363 | }, 364 | "com.unity.modules.vehicles": { 365 | "version": "1.0.0", 366 | "depth": 0, 367 | "source": "builtin", 368 | "dependencies": { 369 | "com.unity.modules.physics": "1.0.0" 370 | } 371 | }, 372 | "com.unity.modules.video": { 373 | "version": "1.0.0", 374 | "depth": 0, 375 | "source": "builtin", 376 | "dependencies": { 377 | "com.unity.modules.audio": "1.0.0", 378 | "com.unity.modules.ui": "1.0.0", 379 | "com.unity.modules.unitywebrequest": "1.0.0" 380 | } 381 | }, 382 | "com.unity.modules.vr": { 383 | "version": "1.0.0", 384 | "depth": 0, 385 | "source": "builtin", 386 | "dependencies": { 387 | "com.unity.modules.jsonserialize": "1.0.0", 388 | "com.unity.modules.physics": "1.0.0", 389 | "com.unity.modules.xr": "1.0.0" 390 | } 391 | }, 392 | "com.unity.modules.wind": { 393 | "version": "1.0.0", 394 | "depth": 0, 395 | "source": "builtin", 396 | "dependencies": {} 397 | }, 398 | "com.unity.modules.xr": { 399 | "version": "1.0.0", 400 | "depth": 0, 401 | "source": "builtin", 402 | "dependencies": { 403 | "com.unity.modules.physics": "1.0.0", 404 | "com.unity.modules.jsonserialize": "1.0.0", 405 | "com.unity.modules.subsystems": "1.0.0" 406 | } 407 | } 408 | } 409 | } 410 | -------------------------------------------------------------------------------- /Assets/VRCAV3ValidTest/Editor/Tests/HaveNoMissingAnimationPathRule/AvatarRoot.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &7712123161586065370 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 7712123161586065371} 12 | - component: {fileID: 7712123161586065373} 13 | - component: {fileID: 7712123161586065372} 14 | m_Layer: 0 15 | m_Name: Capsule 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!4 &7712123161586065371 22 | Transform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 7712123161586065370} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_Children: [] 32 | m_Father: {fileID: 7712123162017742753} 33 | m_RootOrder: 0 34 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 35 | --- !u!33 &7712123161586065373 36 | MeshFilter: 37 | m_ObjectHideFlags: 0 38 | m_CorrespondingSourceObject: {fileID: 0} 39 | m_PrefabInstance: {fileID: 0} 40 | m_PrefabAsset: {fileID: 0} 41 | m_GameObject: {fileID: 7712123161586065370} 42 | m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} 43 | --- !u!23 &7712123161586065372 44 | MeshRenderer: 45 | m_ObjectHideFlags: 0 46 | m_CorrespondingSourceObject: {fileID: 0} 47 | m_PrefabInstance: {fileID: 0} 48 | m_PrefabAsset: {fileID: 0} 49 | m_GameObject: {fileID: 7712123161586065370} 50 | m_Enabled: 1 51 | m_CastShadows: 1 52 | m_ReceiveShadows: 1 53 | m_DynamicOccludee: 1 54 | m_MotionVectors: 1 55 | m_LightProbeUsage: 1 56 | m_ReflectionProbeUsage: 1 57 | m_RenderingLayerMask: 1 58 | m_RendererPriority: 0 59 | m_Materials: 60 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 61 | m_StaticBatchInfo: 62 | firstSubMesh: 0 63 | subMeshCount: 0 64 | m_StaticBatchRoot: {fileID: 0} 65 | m_ProbeAnchor: {fileID: 0} 66 | m_LightProbeVolumeOverride: {fileID: 0} 67 | m_ScaleInLightmap: 1 68 | m_PreserveUVs: 0 69 | m_IgnoreNormalsForChartDetection: 0 70 | m_ImportantGI: 0 71 | m_StitchLightmapSeams: 0 72 | m_SelectedEditorRenderState: 3 73 | m_MinimumChartSize: 4 74 | m_AutoUVMaxDistance: 0.5 75 | m_AutoUVMaxAngle: 89 76 | m_LightmapParameters: {fileID: 0} 77 | m_SortingLayerID: 0 78 | m_SortingLayer: 0 79 | m_SortingOrder: 0 80 | --- !u!1 &7712123162017742752 81 | GameObject: 82 | m_ObjectHideFlags: 0 83 | m_CorrespondingSourceObject: {fileID: 0} 84 | m_PrefabInstance: {fileID: 0} 85 | m_PrefabAsset: {fileID: 0} 86 | serializedVersion: 6 87 | m_Component: 88 | - component: {fileID: 7712123162017742753} 89 | m_Layer: 0 90 | m_Name: Parent 91 | m_TagString: Untagged 92 | m_Icon: {fileID: 0} 93 | m_NavMeshLayer: 0 94 | m_StaticEditorFlags: 0 95 | m_IsActive: 1 96 | --- !u!4 &7712123162017742753 97 | Transform: 98 | m_ObjectHideFlags: 0 99 | m_CorrespondingSourceObject: {fileID: 0} 100 | m_PrefabInstance: {fileID: 0} 101 | m_PrefabAsset: {fileID: 0} 102 | m_GameObject: {fileID: 7712123162017742752} 103 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 104 | m_LocalPosition: {x: 0, y: 0, z: 0} 105 | m_LocalScale: {x: 1, y: 1, z: 1} 106 | m_Children: 107 | - {fileID: 7712123161586065371} 108 | m_Father: {fileID: 7712123162742338732} 109 | m_RootOrder: 2 110 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 111 | --- !u!1 &7712123162521338105 112 | GameObject: 113 | m_ObjectHideFlags: 0 114 | m_CorrespondingSourceObject: {fileID: 0} 115 | m_PrefabInstance: {fileID: 0} 116 | m_PrefabAsset: {fileID: 0} 117 | serializedVersion: 6 118 | m_Component: 119 | - component: {fileID: 7712123162521338106} 120 | - component: {fileID: 7712123162521338108} 121 | - component: {fileID: 7712123162521338107} 122 | m_Layer: 0 123 | m_Name: Cube 124 | m_TagString: Untagged 125 | m_Icon: {fileID: 0} 126 | m_NavMeshLayer: 0 127 | m_StaticEditorFlags: 0 128 | m_IsActive: 1 129 | --- !u!4 &7712123162521338106 130 | Transform: 131 | m_ObjectHideFlags: 0 132 | m_CorrespondingSourceObject: {fileID: 0} 133 | m_PrefabInstance: {fileID: 0} 134 | m_PrefabAsset: {fileID: 0} 135 | m_GameObject: {fileID: 7712123162521338105} 136 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 137 | m_LocalPosition: {x: 0, y: 0, z: 0} 138 | m_LocalScale: {x: 1, y: 1, z: 1} 139 | m_Children: [] 140 | m_Father: {fileID: 7712123162742338732} 141 | m_RootOrder: 0 142 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 143 | --- !u!33 &7712123162521338108 144 | MeshFilter: 145 | m_ObjectHideFlags: 0 146 | m_CorrespondingSourceObject: {fileID: 0} 147 | m_PrefabInstance: {fileID: 0} 148 | m_PrefabAsset: {fileID: 0} 149 | m_GameObject: {fileID: 7712123162521338105} 150 | m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} 151 | --- !u!23 &7712123162521338107 152 | MeshRenderer: 153 | m_ObjectHideFlags: 0 154 | m_CorrespondingSourceObject: {fileID: 0} 155 | m_PrefabInstance: {fileID: 0} 156 | m_PrefabAsset: {fileID: 0} 157 | m_GameObject: {fileID: 7712123162521338105} 158 | m_Enabled: 1 159 | m_CastShadows: 1 160 | m_ReceiveShadows: 1 161 | m_DynamicOccludee: 1 162 | m_MotionVectors: 1 163 | m_LightProbeUsage: 1 164 | m_ReflectionProbeUsage: 1 165 | m_RenderingLayerMask: 1 166 | m_RendererPriority: 0 167 | m_Materials: 168 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 169 | m_StaticBatchInfo: 170 | firstSubMesh: 0 171 | subMeshCount: 0 172 | m_StaticBatchRoot: {fileID: 0} 173 | m_ProbeAnchor: {fileID: 0} 174 | m_LightProbeVolumeOverride: {fileID: 0} 175 | m_ScaleInLightmap: 1 176 | m_PreserveUVs: 0 177 | m_IgnoreNormalsForChartDetection: 0 178 | m_ImportantGI: 0 179 | m_StitchLightmapSeams: 0 180 | m_SelectedEditorRenderState: 3 181 | m_MinimumChartSize: 4 182 | m_AutoUVMaxDistance: 0.5 183 | m_AutoUVMaxAngle: 89 184 | m_LightmapParameters: {fileID: 0} 185 | m_SortingLayerID: 0 186 | m_SortingLayer: 0 187 | m_SortingOrder: 0 188 | --- !u!1 &7712123162742338731 189 | GameObject: 190 | m_ObjectHideFlags: 0 191 | m_CorrespondingSourceObject: {fileID: 0} 192 | m_PrefabInstance: {fileID: 0} 193 | m_PrefabAsset: {fileID: 0} 194 | serializedVersion: 6 195 | m_Component: 196 | - component: {fileID: 7712123162742338732} 197 | - component: {fileID: 7712123162742338734} 198 | - component: {fileID: 7712123162742338733} 199 | - component: {fileID: 7712123162742338735} 200 | m_Layer: 0 201 | m_Name: AvatarRoot 202 | m_TagString: Untagged 203 | m_Icon: {fileID: 0} 204 | m_NavMeshLayer: 0 205 | m_StaticEditorFlags: 0 206 | m_IsActive: 1 207 | --- !u!4 &7712123162742338732 208 | Transform: 209 | m_ObjectHideFlags: 0 210 | m_CorrespondingSourceObject: {fileID: 0} 211 | m_PrefabInstance: {fileID: 0} 212 | m_PrefabAsset: {fileID: 0} 213 | m_GameObject: {fileID: 7712123162742338731} 214 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 215 | m_LocalPosition: {x: 0, y: 0, z: 0} 216 | m_LocalScale: {x: 1, y: 1, z: 1} 217 | m_Children: 218 | - {fileID: 7712123162521338106} 219 | - {fileID: 7712123163029138693} 220 | - {fileID: 7712123162017742753} 221 | m_Father: {fileID: 0} 222 | m_RootOrder: 0 223 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 224 | --- !u!114 &7712123162742338734 225 | MonoBehaviour: 226 | m_ObjectHideFlags: 0 227 | m_CorrespondingSourceObject: {fileID: 0} 228 | m_PrefabInstance: {fileID: 0} 229 | m_PrefabAsset: {fileID: 0} 230 | m_GameObject: {fileID: 7712123162742338731} 231 | m_Enabled: 1 232 | m_EditorHideFlags: 0 233 | m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3} 234 | m_Name: 235 | m_EditorClassIdentifier: 236 | Name: 237 | ViewPosition: {x: 0, y: 1.6, z: 0.2} 238 | Animations: 0 239 | ScaleIPD: 1 240 | lipSync: 0 241 | lipSyncJawBone: {fileID: 0} 242 | lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1} 243 | lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1} 244 | VisemeSkinnedMesh: {fileID: 0} 245 | MouthOpenBlendShapeName: Facial_Blends.Jaw_Down 246 | VisemeBlendShapes: [] 247 | unityVersion: 248 | portraitCameraPositionOffset: {x: 0, y: 0, z: 0} 249 | portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} 250 | customExpressions: 0 251 | expressionsMenu: {fileID: 0} 252 | expressionParameters: {fileID: 0} 253 | enableEyeLook: 0 254 | customEyeLookSettings: 255 | eyeMovement: 256 | confidence: 0.5 257 | excitement: 0.5 258 | leftEye: {fileID: 0} 259 | rightEye: {fileID: 0} 260 | eyesLookingStraight: 261 | linked: 1 262 | left: {x: 0, y: 0, z: 0, w: 0} 263 | right: {x: 0, y: 0, z: 0, w: 0} 264 | eyesLookingUp: 265 | linked: 1 266 | left: {x: 0, y: 0, z: 0, w: 0} 267 | right: {x: 0, y: 0, z: 0, w: 0} 268 | eyesLookingDown: 269 | linked: 1 270 | left: {x: 0, y: 0, z: 0, w: 0} 271 | right: {x: 0, y: 0, z: 0, w: 0} 272 | eyesLookingLeft: 273 | linked: 1 274 | left: {x: 0, y: 0, z: 0, w: 0} 275 | right: {x: 0, y: 0, z: 0, w: 0} 276 | eyesLookingRight: 277 | linked: 1 278 | left: {x: 0, y: 0, z: 0, w: 0} 279 | right: {x: 0, y: 0, z: 0, w: 0} 280 | eyelidType: 0 281 | upperLeftEyelid: {fileID: 0} 282 | upperRightEyelid: {fileID: 0} 283 | lowerLeftEyelid: {fileID: 0} 284 | lowerRightEyelid: {fileID: 0} 285 | eyelidsDefault: 286 | upper: 287 | linked: 1 288 | left: {x: 0, y: 0, z: 0, w: 0} 289 | right: {x: 0, y: 0, z: 0, w: 0} 290 | lower: 291 | linked: 1 292 | left: {x: 0, y: 0, z: 0, w: 0} 293 | right: {x: 0, y: 0, z: 0, w: 0} 294 | eyelidsClosed: 295 | upper: 296 | linked: 1 297 | left: {x: 0, y: 0, z: 0, w: 0} 298 | right: {x: 0, y: 0, z: 0, w: 0} 299 | lower: 300 | linked: 1 301 | left: {x: 0, y: 0, z: 0, w: 0} 302 | right: {x: 0, y: 0, z: 0, w: 0} 303 | eyelidsLookingUp: 304 | upper: 305 | linked: 1 306 | left: {x: 0, y: 0, z: 0, w: 0} 307 | right: {x: 0, y: 0, z: 0, w: 0} 308 | lower: 309 | linked: 1 310 | left: {x: 0, y: 0, z: 0, w: 0} 311 | right: {x: 0, y: 0, z: 0, w: 0} 312 | eyelidsLookingDown: 313 | upper: 314 | linked: 1 315 | left: {x: 0, y: 0, z: 0, w: 0} 316 | right: {x: 0, y: 0, z: 0, w: 0} 317 | lower: 318 | linked: 1 319 | left: {x: 0, y: 0, z: 0, w: 0} 320 | right: {x: 0, y: 0, z: 0, w: 0} 321 | eyelidsSkinnedMesh: {fileID: 0} 322 | eyelidsBlendshapes: 323 | customizeAnimationLayers: 1 324 | baseAnimationLayers: 325 | - isEnabled: 0 326 | type: 0 327 | animatorController: {fileID: 0} 328 | mask: {fileID: 0} 329 | isDefault: 1 330 | - isEnabled: 0 331 | type: 4 332 | animatorController: {fileID: 0} 333 | mask: {fileID: 0} 334 | isDefault: 1 335 | - isEnabled: 0 336 | type: 5 337 | animatorController: {fileID: 9100000, guid: 39da2c23fc38aa640829bf155bcb8d88, 338 | type: 2} 339 | mask: {fileID: 0} 340 | isDefault: 0 341 | specialAnimationLayers: 342 | - isEnabled: 0 343 | type: 6 344 | animatorController: {fileID: 0} 345 | mask: {fileID: 0} 346 | isDefault: 1 347 | - isEnabled: 0 348 | type: 7 349 | animatorController: {fileID: 0} 350 | mask: {fileID: 0} 351 | isDefault: 1 352 | - isEnabled: 0 353 | type: 8 354 | animatorController: {fileID: 0} 355 | mask: {fileID: 0} 356 | isDefault: 1 357 | AnimationPreset: {fileID: 0} 358 | animationHashSet: [] 359 | autoFootsteps: 1 360 | autoLocomotion: 1 361 | --- !u!114 &7712123162742338733 362 | MonoBehaviour: 363 | m_ObjectHideFlags: 0 364 | m_CorrespondingSourceObject: {fileID: 0} 365 | m_PrefabInstance: {fileID: 0} 366 | m_PrefabAsset: {fileID: 0} 367 | m_GameObject: {fileID: 7712123162742338731} 368 | m_Enabled: 1 369 | m_EditorHideFlags: 0 370 | m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3} 371 | m_Name: 372 | m_EditorClassIdentifier: 373 | launchedFromSDKPipeline: 0 374 | completedSDKPipeline: 0 375 | blueprintId: 376 | contentType: 0 377 | assetBundleUnityVersion: 378 | --- !u!95 &7712123162742338735 379 | Animator: 380 | serializedVersion: 3 381 | m_ObjectHideFlags: 0 382 | m_CorrespondingSourceObject: {fileID: 0} 383 | m_PrefabInstance: {fileID: 0} 384 | m_PrefabAsset: {fileID: 0} 385 | m_GameObject: {fileID: 7712123162742338731} 386 | m_Enabled: 1 387 | m_Avatar: {fileID: 0} 388 | m_Controller: {fileID: 9100000, guid: 39da2c23fc38aa640829bf155bcb8d88, type: 2} 389 | m_CullingMode: 0 390 | m_UpdateMode: 0 391 | m_ApplyRootMotion: 0 392 | m_LinearVelocityBlending: 0 393 | m_WarningMessage: 394 | m_HasTransformHierarchy: 1 395 | m_AllowConstantClipSamplingOptimization: 1 396 | m_KeepAnimatorControllerStateOnDisable: 0 397 | --- !u!1 &7712123163029138692 398 | GameObject: 399 | m_ObjectHideFlags: 0 400 | m_CorrespondingSourceObject: {fileID: 0} 401 | m_PrefabInstance: {fileID: 0} 402 | m_PrefabAsset: {fileID: 0} 403 | serializedVersion: 6 404 | m_Component: 405 | - component: {fileID: 7712123163029138693} 406 | - component: {fileID: 7712123163029138695} 407 | - component: {fileID: 7712123163029138694} 408 | m_Layer: 0 409 | m_Name: Sphere 410 | m_TagString: Untagged 411 | m_Icon: {fileID: 0} 412 | m_NavMeshLayer: 0 413 | m_StaticEditorFlags: 0 414 | m_IsActive: 1 415 | --- !u!4 &7712123163029138693 416 | Transform: 417 | m_ObjectHideFlags: 0 418 | m_CorrespondingSourceObject: {fileID: 0} 419 | m_PrefabInstance: {fileID: 0} 420 | m_PrefabAsset: {fileID: 0} 421 | m_GameObject: {fileID: 7712123163029138692} 422 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 423 | m_LocalPosition: {x: 0, y: 0, z: 0} 424 | m_LocalScale: {x: 1, y: 1, z: 1} 425 | m_Children: [] 426 | m_Father: {fileID: 7712123162742338732} 427 | m_RootOrder: 1 428 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 429 | --- !u!33 &7712123163029138695 430 | MeshFilter: 431 | m_ObjectHideFlags: 0 432 | m_CorrespondingSourceObject: {fileID: 0} 433 | m_PrefabInstance: {fileID: 0} 434 | m_PrefabAsset: {fileID: 0} 435 | m_GameObject: {fileID: 7712123163029138692} 436 | m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} 437 | --- !u!23 &7712123163029138694 438 | MeshRenderer: 439 | m_ObjectHideFlags: 0 440 | m_CorrespondingSourceObject: {fileID: 0} 441 | m_PrefabInstance: {fileID: 0} 442 | m_PrefabAsset: {fileID: 0} 443 | m_GameObject: {fileID: 7712123163029138692} 444 | m_Enabled: 1 445 | m_CastShadows: 1 446 | m_ReceiveShadows: 1 447 | m_DynamicOccludee: 1 448 | m_MotionVectors: 1 449 | m_LightProbeUsage: 1 450 | m_ReflectionProbeUsage: 1 451 | m_RenderingLayerMask: 1 452 | m_RendererPriority: 0 453 | m_Materials: 454 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 455 | m_StaticBatchInfo: 456 | firstSubMesh: 0 457 | subMeshCount: 0 458 | m_StaticBatchRoot: {fileID: 0} 459 | m_ProbeAnchor: {fileID: 0} 460 | m_LightProbeVolumeOverride: {fileID: 0} 461 | m_ScaleInLightmap: 1 462 | m_PreserveUVs: 0 463 | m_IgnoreNormalsForChartDetection: 0 464 | m_ImportantGI: 0 465 | m_StitchLightmapSeams: 0 466 | m_SelectedEditorRenderState: 3 467 | m_MinimumChartSize: 4 468 | m_AutoUVMaxDistance: 0.5 469 | m_AutoUVMaxAngle: 89 470 | m_LightmapParameters: {fileID: 0} 471 | m_SortingLayerID: 0 472 | m_SortingLayer: 0 473 | m_SortingOrder: 0 474 | --------------------------------------------------------------------------------