From 095646e0312a81c245fe1f671a5071a0d424da40 Mon Sep 17 00:00:00 2001 From: Guribo Date: Tue, 5 Jan 2021 15:54:52 +0100 Subject: [PATCH 1/5] chore: change file structure --- {Assets/Guribo/Scripts => Scripts}/GuriboUdonUtils.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {Assets/Guribo/Scripts => Scripts}/GuriboUdonUtils.cs (100%) diff --git a/Assets/Guribo/Scripts/GuriboUdonUtils.cs b/Scripts/GuriboUdonUtils.cs similarity index 100% rename from Assets/Guribo/Scripts/GuriboUdonUtils.cs rename to Scripts/GuriboUdonUtils.cs From 46f29978073f355e9703f69b05eb9b46e7d6505f Mon Sep 17 00:00:00 2001 From: Guribo Date: Thu, 7 Jan 2021 16:52:32 +0100 Subject: [PATCH 2/5] refactor: cleanup and add meta files --- LICENSE.meta | 7 ++ README.md.meta | 7 ++ README.meta | 8 +++ README/conclusion.png.meta | 88 ++++++++++++++++++++++++ README/errorLocation.png.meta | 88 ++++++++++++++++++++++++ README/errorMessage.png.meta | 88 ++++++++++++++++++++++++ README/errorNavigationInConsole.png.meta | 88 ++++++++++++++++++++++++ README/menu.png.meta | 88 ++++++++++++++++++++++++ Scripts.meta | 8 +++ Scripts/GuriboUdonUtils.cs | 35 +++++----- Scripts/GuriboUdonUtils.cs.meta | 11 +++ 11 files changed, 498 insertions(+), 18 deletions(-) create mode 100644 LICENSE.meta create mode 100644 README.md.meta create mode 100644 README.meta create mode 100644 README/conclusion.png.meta create mode 100644 README/errorLocation.png.meta create mode 100644 README/errorMessage.png.meta create mode 100644 README/errorNavigationInConsole.png.meta create mode 100644 README/menu.png.meta create mode 100644 Scripts.meta create mode 100644 Scripts/GuriboUdonUtils.cs.meta diff --git a/LICENSE.meta b/LICENSE.meta new file mode 100644 index 0000000..0403145 --- /dev/null +++ b/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a875f4555ad48d14ba2114090bbbeac2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..4fcdfc0 --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b1c8baae57a510d4a87bf27586924dcd +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.meta b/README.meta new file mode 100644 index 0000000..bd7248b --- /dev/null +++ b/README.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9bc5484a16077e4bb23256ea2cd3c10 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README/conclusion.png.meta b/README/conclusion.png.meta new file mode 100644 index 0000000..f7ec1b3 --- /dev/null +++ b/README/conclusion.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: dc9f0269d03d56d449f1df362b7f277b +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/README/errorLocation.png.meta b/README/errorLocation.png.meta new file mode 100644 index 0000000..11aed7a --- /dev/null +++ b/README/errorLocation.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: aa3f2ff93b684394a808b18fa63ab521 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/README/errorMessage.png.meta b/README/errorMessage.png.meta new file mode 100644 index 0000000..7e38b03 --- /dev/null +++ b/README/errorMessage.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 9fc8bace10af67d458d4b0bc83385694 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/README/errorNavigationInConsole.png.meta b/README/errorNavigationInConsole.png.meta new file mode 100644 index 0000000..dadc0f4 --- /dev/null +++ b/README/errorNavigationInConsole.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: d2b7c6cb4a9e298419bb755795008b3f +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/README/menu.png.meta b/README/menu.png.meta new file mode 100644 index 0000000..2e9a0b2 --- /dev/null +++ b/README/menu.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: ea7011410be28b740998bd549b526439 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts.meta b/Scripts.meta new file mode 100644 index 0000000..ab44a4c --- /dev/null +++ b/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e93f6d216ff6ebd4a9175779e27c212a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/GuriboUdonUtils.cs b/Scripts/GuriboUdonUtils.cs index f89ff1e..d027937 100644 --- a/Scripts/GuriboUdonUtils.cs +++ b/Scripts/GuriboUdonUtils.cs @@ -1,11 +1,12 @@ using System; -#if UNITY_EDITOR using UnityEditor; -#endif using UnityEngine; using VRC.Udon; -namespace Guribo.Scripts +#if UNITY_EDITOR +#endif + +namespace Guribo.UdonUtils.Scripts { public class GuriboUdonUtils : MonoBehaviour { @@ -13,7 +14,7 @@ public class GuriboUdonUtils : MonoBehaviour #if UNITY_EDITOR public class AutoValidator : UnityEditor.AssetModificationProcessor { - static string[] OnWillSaveAssets(string[] paths) + private static string[] OnWillSaveAssets(string[] paths) { // disable interactive mode _interactiveMode = false; @@ -35,14 +36,12 @@ static string[] OnWillSaveAssets(string[] paths) } /// - /// checks all UdonBehaviours in the scene for unset public variables. Displays a dialog to skip or show the error. + /// checks all UdonBehaviours in the scene for unset public variables. Displays a dialog to skip or show the error. /// [MenuItem("Guribo/UDON/Validate UdonBehaviour References")] public static void ValidateUdonBehaviours() { - - - int errorCount = 0; + var errorCount = 0; var udonBehaviours = FindObjectsOfType(); if (udonBehaviours.Length == 0) { @@ -56,8 +55,8 @@ public static void ValidateUdonBehaviours() foreach (var udonBehaviour in udonBehaviours) { - var udonBehaviourProgramSource = udonBehaviour.programSource; - if (udonBehaviourProgramSource == null) + var programSource = udonBehaviour.programSource; + if (programSource == null) { Debug.LogWarning("UdonBehaviour on " + udonBehaviour.gameObject.name + " has no Udon program attached", udonBehaviour); @@ -74,22 +73,23 @@ public static void ValidateUdonBehaviours() continue; } - var udonBehaviourPublicVariables = udonBehaviour.publicVariables; - if (udonBehaviourPublicVariables == null) continue; - - var variableSymbols = udonBehaviourPublicVariables.VariableSymbols; - if (variableSymbols == null) continue; + var publicVariables = udonBehaviour.publicVariables; + var variableSymbols = publicVariables?.VariableSymbols; + if (variableSymbols == null) + { + continue; + } foreach (var symbols in variableSymbols) { - if (!udonBehaviourPublicVariables.TryGetVariableValue(symbols, out var variableValue) || + if (!publicVariables.TryGetVariableValue(symbols, out var variableValue) || variableValue == null) { Debug.LogWarning(symbols + " is not set", udonBehaviour); if (_interactiveMode && EditorUtility.DisplayDialog("Empty public variable found", "A public variable called '" + symbols + "' is not set on the UdonBehaviour with the program '" + - udonBehaviourProgramSource.name + "'. You may want to fix this.", "Show me", "Skip")) + programSource.name + "'. You may want to fix this.", "Show me", "Skip")) { Selection.SetActiveObjectWithContext(udonBehaviour.gameObject, udonBehaviour); EditorGUIUtility.PingObject(udonBehaviour.gameObject); @@ -121,7 +121,6 @@ public static void ValidateUdonBehaviours() { EditorUtility.DisplayDialog("Conclusion", conclusion, "Ok"); } - } #endif } diff --git a/Scripts/GuriboUdonUtils.cs.meta b/Scripts/GuriboUdonUtils.cs.meta new file mode 100644 index 0000000..2b2d292 --- /dev/null +++ b/Scripts/GuriboUdonUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec184f223ef43f34cb1bf4e2e45b3654 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From e5f98973f76dd45c6effec6ee68c1bb29dbd3b7c Mon Sep 17 00:00:00 2001 From: Guribo Date: Thu, 7 Jan 2021 20:03:28 +0100 Subject: [PATCH 3/5] feature: improved scene checking, added editor udonbehaviour extensions --- Scenes.meta | 8 + Scenes/Examples.meta | 8 + Scenes/Examples/EditorTesting.unity | 334 ++++++++++++++++ Scenes/Examples/EditorTesting.unity.meta | 7 + Scripts/Examples.meta | 8 + Scripts/Examples/Editor.meta | 3 + .../Editor/InspectorValueChangerEditor.cs | 37 ++ .../InspectorValueChangerEditor.cs.meta | 3 + Scripts/Examples/EditorTesting.asset | 367 ++++++++++++++++++ Scripts/Examples/EditorTesting.asset.meta | 8 + Scripts/Examples/EditorTesting.cs | 14 + Scripts/Examples/EditorTesting.cs.meta | 11 + .../Examples/InspectorValueChangerExample.cs | 41 ++ .../InspectorValueChangerExample.cs.meta | 3 + Scripts/GuriboUdonUtils.cs | 8 +- Scripts/UdonBehaviourExtensions.cs | 150 +++++++ Scripts/UdonBehaviourExtensions.cs.meta | 3 + 17 files changed, 1007 insertions(+), 6 deletions(-) create mode 100644 Scenes.meta create mode 100644 Scenes/Examples.meta create mode 100644 Scenes/Examples/EditorTesting.unity create mode 100644 Scenes/Examples/EditorTesting.unity.meta create mode 100644 Scripts/Examples.meta create mode 100644 Scripts/Examples/Editor.meta create mode 100644 Scripts/Examples/Editor/InspectorValueChangerEditor.cs create mode 100644 Scripts/Examples/Editor/InspectorValueChangerEditor.cs.meta create mode 100644 Scripts/Examples/EditorTesting.asset create mode 100644 Scripts/Examples/EditorTesting.asset.meta create mode 100644 Scripts/Examples/EditorTesting.cs create mode 100644 Scripts/Examples/EditorTesting.cs.meta create mode 100644 Scripts/Examples/InspectorValueChangerExample.cs create mode 100644 Scripts/Examples/InspectorValueChangerExample.cs.meta create mode 100644 Scripts/UdonBehaviourExtensions.cs create mode 100644 Scripts/UdonBehaviourExtensions.cs.meta diff --git a/Scenes.meta b/Scenes.meta new file mode 100644 index 0000000..29f2ee1 --- /dev/null +++ b/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c60c4baa668df094899576a833cd1438 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scenes/Examples.meta b/Scenes/Examples.meta new file mode 100644 index 0000000..c5f0213 --- /dev/null +++ b/Scenes/Examples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3a2f17b414483cf41a4b8fc1c0700502 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scenes/Examples/EditorTesting.unity b/Scenes/Examples/EditorTesting.unity new file mode 100644 index 0000000..6c02f2d --- /dev/null +++ b/Scenes/Examples/EditorTesting.unity @@ -0,0 +1,334 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &1244135264 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1244135267} + - component: {fileID: 1244135266} + - component: {fileID: 1244135265} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1244135265 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1244135264} + m_Enabled: 1 +--- !u!20 &1244135266 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1244135264} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1244135267 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1244135264} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1695130163 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1695130166} + - component: {fileID: 1695130165} + - component: {fileID: 1695130164} + m_Layer: 0 + m_Name: TestSetVariableFromUnityScriptInEditMode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1695130164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1695130163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1e0c616f4e5d4d2780ffa49f2c92b335, type: 3} + m_Name: + m_EditorClassIdentifier: + editorTestingBehaviour: {fileID: 1695130165} +--- !u!114 &1695130165 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1695130163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + serializedProgramAsset: {fileID: 11400000, guid: 12b3ab89a2110a54b8004b7c1e2587f7, + type: 2} + programSource: {fileID: 11400000, guid: c29d80bdbf2e26c4d8e2ba2e675781ed, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgIAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAQcAAAB0AGUAcwB0AEkAbgB0ACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQAAAAAABwUCLwMAAAABSgAAAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAC4AVQBkAG8AbgBWAGEAcgBpAGEAYgBsAGUAYAAxAFsAWwBTAHkAcwB0AGUAbQAuAFMAdAByAGkAbgBnACwAIABtAHMAYwBvAHIAbABpAGIAXQBdACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgADAAAABgIAAAAAAAAAJwEEAAAAdAB5AHAAZQABFwAAAFMAeQBzAHQAZQBtAC4AUwB0AHIAaQBuAGcALAAgAG0AcwBjAG8AcgBsAGkAYgAnAQoAAABTAHkAbQBiAG8AbABOAGEAbQBlAAEKAAAAdABlAHMAdABTAHQAcgBpAG4AZwAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBBQAAAFYAYQBsAHUAZQABAAAAAAcFBwUHBQ== + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!4 &1695130166 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1695130163} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1710814302 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1710814304} + - component: {fileID: 1710814303} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1710814303 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1710814302} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1710814304 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1710814302} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} diff --git a/Scenes/Examples/EditorTesting.unity.meta b/Scenes/Examples/EditorTesting.unity.meta new file mode 100644 index 0000000..d59062c --- /dev/null +++ b/Scenes/Examples/EditorTesting.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 65e0e9d8ca8a6404d9e4c420d28ff660 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Examples.meta b/Scripts/Examples.meta new file mode 100644 index 0000000..7b2ca53 --- /dev/null +++ b/Scripts/Examples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4feef0aa5ac16e34e99cf4ed1ea4ae6c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Examples/Editor.meta b/Scripts/Examples/Editor.meta new file mode 100644 index 0000000..bcd7f5b --- /dev/null +++ b/Scripts/Examples/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: baa9b3b7e069441d9795fdae5ddee720 +timeCreated: 1610045037 \ No newline at end of file diff --git a/Scripts/Examples/Editor/InspectorValueChangerEditor.cs b/Scripts/Examples/Editor/InspectorValueChangerEditor.cs new file mode 100644 index 0000000..529c949 --- /dev/null +++ b/Scripts/Examples/Editor/InspectorValueChangerEditor.cs @@ -0,0 +1,37 @@ +using UnityEditor; +using UnityEngine; + +namespace Guribo.UdonUtils.Scripts.Examples.Editor +{ + [CustomEditor(typeof(InspectorValueChangerExample))] + public class InspectorValueChangerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + var inspectorValueChanger = (InspectorValueChangerExample) target; + try + { + GUILayout.BeginHorizontal(); + if (GUILayout.Button("Set Values")) + { + inspectorValueChanger.TrySetVariables(); + } + + if (GUILayout.Button("Set Null")) + { + inspectorValueChanger.TrySetNull(); + } + + if (GUILayout.Button("Default")) + { + inspectorValueChanger.TrySetDefaultValues(); + } + } + finally + { + GUILayout.EndHorizontal(); + } + } + } +} \ No newline at end of file diff --git a/Scripts/Examples/Editor/InspectorValueChangerEditor.cs.meta b/Scripts/Examples/Editor/InspectorValueChangerEditor.cs.meta new file mode 100644 index 0000000..36a23b2 --- /dev/null +++ b/Scripts/Examples/Editor/InspectorValueChangerEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8c1791ba73f94550b7458f8bb1fb0553 +timeCreated: 1610044773 \ No newline at end of file diff --git a/Scripts/Examples/EditorTesting.asset b/Scripts/Examples/EditorTesting.asset new file mode 100644 index 0000000..4276077 --- /dev/null +++ b/Scripts/Examples/EditorTesting.asset @@ -0,0 +1,367 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: EditorTesting + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 12b3ab89a2110a54b8004b7c1e2587f7, + type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: e87d0ed9bfd89644ea800390e7337b74, type: 3} + behaviourIDHeapVarName: __refl_const_intnl_udonTypeID + compileErrors: [] + hasInteractEvent: 0 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: + - {fileID: 11500000, guid: e87d0ed9bfd89644ea800390e7337b74, type: 3} + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 5 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: testInt + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 3|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 4|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Int32, mscorlib + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 1 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: SystemInt32 + - Name: symbolOriginalName + Entry: 1 + Data: testInt + - Name: symbolUniqueName + Entry: 1 + Data: testInt + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 5|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: testString + - Name: $v + Entry: 7 + Data: 6|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 7|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 8|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.String, mscorlib + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 1 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: SystemString + - Name: symbolOriginalName + Entry: 1 + Data: testString + - Name: symbolUniqueName + Entry: 1 + Data: testString + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 9|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: testTransform + - Name: $v + Entry: 7 + Data: 10|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 11|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 12|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.Transform, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 1 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: UnityEngineTransform + - Name: symbolOriginalName + Entry: 1 + Data: testTransform + - Name: symbolUniqueName + Entry: 1 + Data: testTransform + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 13|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: testGameObject + - Name: $v + Entry: 7 + Data: 14|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 15|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 16|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.GameObject, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 1 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: UnityEngineGameObject + - Name: symbolOriginalName + Entry: 1 + Data: testGameObject + - Name: symbolUniqueName + Entry: 1 + Data: testGameObject + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 17|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: testScriptReference + - Name: $v + Entry: 7 + Data: 18|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 19|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 20|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: Guribo.UdonUtils.Scripts.Examples.EditorTesting, Assembly-CSharp + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 1 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: VRCUdonUdonBehaviour + - Name: symbolOriginalName + Entry: 1 + Data: testScriptReference + - Name: symbolUniqueName + Entry: 1 + Data: testScriptReference + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 21|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 10 + Data: 0 + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Scripts/Examples/EditorTesting.asset.meta b/Scripts/Examples/EditorTesting.asset.meta new file mode 100644 index 0000000..2b8cce1 --- /dev/null +++ b/Scripts/Examples/EditorTesting.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c29d80bdbf2e26c4d8e2ba2e675781ed +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Examples/EditorTesting.cs b/Scripts/Examples/EditorTesting.cs new file mode 100644 index 0000000..955f554 --- /dev/null +++ b/Scripts/Examples/EditorTesting.cs @@ -0,0 +1,14 @@ +using UdonSharp; +using UnityEngine; + +namespace Guribo.UdonUtils.Scripts.Examples +{ + public class EditorTesting : UdonSharpBehaviour + { + public int testInt; + public string testString; + public Transform testTransform; + public GameObject testGameObject; + public EditorTesting testScriptReference; + } +} diff --git a/Scripts/Examples/EditorTesting.cs.meta b/Scripts/Examples/EditorTesting.cs.meta new file mode 100644 index 0000000..15ca4a3 --- /dev/null +++ b/Scripts/Examples/EditorTesting.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e87d0ed9bfd89644ea800390e7337b74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Examples/InspectorValueChangerExample.cs b/Scripts/Examples/InspectorValueChangerExample.cs new file mode 100644 index 0000000..115acd4 --- /dev/null +++ b/Scripts/Examples/InspectorValueChangerExample.cs @@ -0,0 +1,41 @@ +using UnityEngine; +using VRC.Udon; + +namespace Guribo.UdonUtils.Scripts.Examples +{ + public class InspectorValueChangerExample : MonoBehaviour + { + public UdonBehaviour editorTestingBehaviour; + + + [ContextMenu("TrySetVariables")] + public void TrySetVariables() + { + editorTestingBehaviour.SetInspectorVariable("testInt", 100); + editorTestingBehaviour.SetInspectorVariable("testString", "Hello World"); + editorTestingBehaviour.SetInspectorVariable("testTransform", gameObject.transform); + editorTestingBehaviour.SetInspectorVariable("testGameObject", gameObject); + editorTestingBehaviour.SetInspectorVariable("testScriptReference", editorTestingBehaviour); + } + + [ContextMenu("TrySetNull")] + public void TrySetNull() + { + editorTestingBehaviour.SetInspectorVariable("testInt", 0); + editorTestingBehaviour.SetInspectorVariable("testString", null); + editorTestingBehaviour.SetInspectorVariable("testTransform", null); + editorTestingBehaviour.SetInspectorVariable("testGameObject", null); + editorTestingBehaviour.SetInspectorVariable("testScriptReference", null); + } + + [ContextMenu("TrySetDefaultVariables")] + public void TrySetDefaultValues() + { + editorTestingBehaviour.ResetInspectorVariable("testInt"); + editorTestingBehaviour.ResetInspectorVariable("testString"); + editorTestingBehaviour.ResetInspectorVariable("testTransform"); + editorTestingBehaviour.ResetInspectorVariable("testGameObject"); + editorTestingBehaviour.ResetInspectorVariable("testScriptReference"); + } + } +} \ No newline at end of file diff --git a/Scripts/Examples/InspectorValueChangerExample.cs.meta b/Scripts/Examples/InspectorValueChangerExample.cs.meta new file mode 100644 index 0000000..2585a70 --- /dev/null +++ b/Scripts/Examples/InspectorValueChangerExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1e0c616f4e5d4d2780ffa49f2c92b335 +timeCreated: 1610043861 \ No newline at end of file diff --git a/Scripts/GuriboUdonUtils.cs b/Scripts/GuriboUdonUtils.cs index d027937..54ef430 100644 --- a/Scripts/GuriboUdonUtils.cs +++ b/Scripts/GuriboUdonUtils.cs @@ -73,14 +73,10 @@ public static void ValidateUdonBehaviours() continue; } + var symbolNames = udonBehaviour.GetExportedSymbolNames(); var publicVariables = udonBehaviour.publicVariables; - var variableSymbols = publicVariables?.VariableSymbols; - if (variableSymbols == null) - { - continue; - } - foreach (var symbols in variableSymbols) + foreach (var symbols in symbolNames) { if (!publicVariables.TryGetVariableValue(symbols, out var variableValue) || variableValue == null) diff --git a/Scripts/UdonBehaviourExtensions.cs b/Scripts/UdonBehaviourExtensions.cs new file mode 100644 index 0000000..692b669 --- /dev/null +++ b/Scripts/UdonBehaviourExtensions.cs @@ -0,0 +1,150 @@ +#if UNITY_EDITOR +using System; +using UdonSharp; +using UnityEditor; +using UnityEngine; +using VRC.Udon; +using VRC.Udon.Common; +using VRC.Udon.Common.Interfaces; + +namespace Guribo.UdonUtils.Scripts +{ + public static class UdonBehaviourExtensions + { + /// + /// modified version of Merlin's code for drawing UdonBehaviour inspectors used to set variables from any other + /// C# script while in Editmode + /// + /// + /// + /// + public static void SetInspectorVariable(this UdonBehaviour udonBehaviour, string symbolName, object newValue) + { + if (!udonBehaviour) + { + throw new ArgumentException("Invalid UdonBehaviour"); + } + + if (Application.IsPlaying(udonBehaviour)) + { + throw new Exception("Only edit mode is supported"); + } + + var symbolTable = GetSymbolTable(udonBehaviour); + var publicVariables = udonBehaviour.publicVariables; + if (publicVariables == null) + { + throw new Exception("UdonBehaviour has no public Variables"); + } + + Undo.RecordObject(udonBehaviour, "Modify variable"); + if (!publicVariables.TrySetVariableValue(symbolName, newValue)) + { + var symbolType = symbolTable.GetSymbolType(symbolName); + if (!publicVariables.TryAddVariable(CreateUdonVariable(symbolName, newValue, + symbolType))) + { + throw new Exception($"Failed to set public variable '{symbolName}' value"); + } + } + + var foundValue = publicVariables.TryGetVariableValue(symbolName, out var variableValue); + var foundType = publicVariables.TryGetVariableType(symbolName, out var variableType); + + // Remove this variable from the publicVariable list since UdonBehaviours set all null GameObjects, UdonBehaviours, and Transforms to the current behavior's equivalent object regardless of if it's marked as a `null` heap variable or `this` + // This default behavior is not the same as Unity, where the references are just left null. And more importantly, it assumes that the user has interacted with the inspector on that object at some point which cannot be guaranteed. + // Specifically, if the user adds some public variable to a class, and multiple objects in the scene reference the program asset, + // the user will need to go through each of the objects' inspectors to make sure each UdonBehavior has its `publicVariables` variable populated by the inspector + if (foundValue + && foundType + && variableValue.IsUnityObjectNull() + && (variableType == typeof(GameObject) + || variableType == typeof(UdonBehaviour) + || variableType == typeof(Transform))) + { + udonBehaviour.publicVariables.RemoveVariable(symbolName); + } + + GUI.changed = true; + + if (PrefabUtility.IsPartOfPrefabInstance(udonBehaviour)) + PrefabUtility.RecordPrefabInstancePropertyModifications(udonBehaviour); + } + + public static void ResetInspectorVariable(this UdonBehaviour udonBehaviour, string symbolName) + { + if (!udonBehaviour) + { + throw new ArgumentException("Invalid UdonBehaviour"); + } + + if (Application.IsPlaying(udonBehaviour)) + { + throw new Exception("Only edit mode is supported"); + } + + var programAsset = (UdonSharpProgramAsset) udonBehaviour.programSource; + if (!programAsset) + { + throw new Exception("UdonBehaviour has no UdonSharpProgramAsset"); + } + + udonBehaviour.SetInspectorVariable(symbolName, programAsset.GetPublicVariableDefaultValue(symbolName)); + } + + /// + /// + /// + /// + /// + /// if the UdonBehaviour has no public variables + private static IUdonSymbolTable GetSymbolTable(this UdonBehaviour udonBehaviour) + { + var programAsset = (UdonSharpProgramAsset) udonBehaviour.programSource; + if (!programAsset) + { + throw new Exception("UdonBehaviour has no UdonSharpProgramAsset"); + } + + programAsset.UpdateProgram(); + var program = programAsset.GetRealProgram(); + if (program?.SymbolTable == null) + { + throw new Exception("UdonBehaviour has no public variables"); + } + + return program.SymbolTable; + } + + public static string[] GetExportedSymbolNames(this UdonBehaviour udonBehaviour) + { + if (!udonBehaviour) + { + throw new ArgumentException("Invalid UdonBehaviour"); + } + + try + { + return udonBehaviour.GetSymbolTable().GetExportedSymbols(); + } + catch (Exception e) + { + Debug.LogWarning(e.Message, udonBehaviour); + return new string[0]; + } + } + + private static IUdonVariable CreateUdonVariable(string symbolName, object value, Type type) + { + Type udonVariableType = typeof(UdonVariable<>).MakeGenericType(type); + return (IUdonVariable) Activator.CreateInstance(udonVariableType, symbolName, value); + } + + private static bool IsUnityObjectNull(this object value) + { + return value == null || value is UnityEngine.Object unityEngineObject && unityEngineObject == null; + } + } +} + +#endif \ No newline at end of file diff --git a/Scripts/UdonBehaviourExtensions.cs.meta b/Scripts/UdonBehaviourExtensions.cs.meta new file mode 100644 index 0000000..6941b1c --- /dev/null +++ b/Scripts/UdonBehaviourExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9bea236e68214624982e06115a179a2b +timeCreated: 1610041694 \ No newline at end of file From 58957a9595c400b83065b6b953aee3b9f463b05f Mon Sep 17 00:00:00 2001 From: Guribo Date: Fri, 8 Jan 2021 15:03:02 +0100 Subject: [PATCH 4/5] fix: prevent detecting default values as null, fix build error --- .../Examples/InspectorValueChangerExample.cs | 4 +- Scripts/GuriboUdonUtils.cs | 14 +- Scripts/UdonBehaviourExtensions.cs | 207 ++++++++++++++++-- 3 files changed, 193 insertions(+), 32 deletions(-) diff --git a/Scripts/Examples/InspectorValueChangerExample.cs b/Scripts/Examples/InspectorValueChangerExample.cs index 115acd4..44f0202 100644 --- a/Scripts/Examples/InspectorValueChangerExample.cs +++ b/Scripts/Examples/InspectorValueChangerExample.cs @@ -1,3 +1,4 @@ +#if UNITY_EDITOR using UnityEngine; using VRC.Udon; @@ -38,4 +39,5 @@ public void TrySetDefaultValues() editorTestingBehaviour.ResetInspectorVariable("testScriptReference"); } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Scripts/GuriboUdonUtils.cs b/Scripts/GuriboUdonUtils.cs index 54ef430..9e86e33 100644 --- a/Scripts/GuriboUdonUtils.cs +++ b/Scripts/GuriboUdonUtils.cs @@ -73,17 +73,15 @@ public static void ValidateUdonBehaviours() continue; } - var symbolNames = udonBehaviour.GetExportedSymbolNames(); - var publicVariables = udonBehaviour.publicVariables; - - foreach (var symbols in symbolNames) + var symbolNames = udonBehaviour.GetInspectorVariableNames(); + foreach (var symbolName in symbolNames) { - if (!publicVariables.TryGetVariableValue(symbols, out var variableValue) || - variableValue == null) + if (udonBehaviour.IsInspectorVariableNull(symbolName, out var variableType)) { - Debug.LogWarning(symbols + " is not set", udonBehaviour); + Debug.LogWarning($"{udonBehaviour}.{symbolName} is null [{variableType}]", udonBehaviour); + if (_interactiveMode && EditorUtility.DisplayDialog("Empty public variable found", - "A public variable called '" + symbols + + "A public variable called '" + symbolName + "' is not set on the UdonBehaviour with the program '" + programSource.name + "'. You may want to fix this.", "Show me", "Skip")) { diff --git a/Scripts/UdonBehaviourExtensions.cs b/Scripts/UdonBehaviourExtensions.cs index 692b669..48f214b 100644 --- a/Scripts/UdonBehaviourExtensions.cs +++ b/Scripts/UdonBehaviourExtensions.cs @@ -1,19 +1,128 @@ #if UNITY_EDITOR using System; +using System.Collections.Generic; using UdonSharp; using UnityEditor; using UnityEngine; using VRC.Udon; using VRC.Udon.Common; using VRC.Udon.Common.Interfaces; +using VRC.Udon.Serialization.OdinSerializer.Utilities; +using Object = UnityEngine.Object; namespace Guribo.UdonUtils.Scripts { public static class UdonBehaviourExtensions { + #region public + + #region GetVariable + + public static object GetInspectorVariableDefaultValue(this UdonBehaviour udonBehaviour, string symbolName, + out Type variableType) + { + if (!udonBehaviour) + { + throw new ArgumentException("Invalid UdonBehaviour"); + } + + if (Application.IsPlaying(udonBehaviour)) + { + throw new Exception("Only edit mode is supported"); + } + + var programAsset = (UdonSharpProgramAsset) udonBehaviour.programSource; + if (!programAsset) + { + throw new Exception("UdonBehaviour has no UdonSharpProgramAsset"); + } + + programAsset.UpdateProgram(); + + var publicVariables = udonBehaviour.publicVariables; + if (publicVariables == null) + { + throw new Exception("UdonBehaviour has no public Variables"); + } + + GetVariableType(udonBehaviour, symbolName, out variableType, publicVariables, programAsset); + + var defaultValue = programAsset.GetPublicVariableDefaultValue(symbolName); + if (variableType == null) + { + variableType = defaultValue?.GetType(); + } + + return defaultValue; + } + /// - /// modified version of Merlin's code for drawing UdonBehaviour inspectors used to set variables from any other - /// C# script while in Editmode + /// + /// + /// + /// + /// + /// True if the value was read and it is not a default value, false if it is the default value + /// + /// + public static bool GetInspectorVariable(this UdonBehaviour udonBehaviour, string symbolName, + out object variableValue, out Type variableType) + { + if (!udonBehaviour) + { + throw new ArgumentException("Invalid UdonBehaviour"); + } + + if (Application.IsPlaying(udonBehaviour)) + { + throw new Exception("Only edit mode is supported"); + } + + var programAsset = (UdonSharpProgramAsset) udonBehaviour.programSource; + if (!programAsset) + { + throw new Exception("UdonBehaviour has no UdonSharpProgramAsset"); + } + + programAsset.UpdateProgram(); + + var publicVariables = udonBehaviour.publicVariables; + if (publicVariables == null) + { + throw new Exception("UdonBehaviour has no public Variables"); + } + + variableValue = null; + var defaultValue = programAsset.GetPublicVariableDefaultValue(symbolName); + + GetVariableType(udonBehaviour, symbolName, out variableType, publicVariables, programAsset); + + try + { + if (publicVariables.TryGetVariableValue(symbolName, out variableValue)) + { + return defaultValue != variableValue; + } + + variableValue = defaultValue; + return false; + } + finally + { + if (variableType == null) + { + variableType = variableValue?.GetType(); + } + } + } + + #endregion + + #region SetVariable + + /// + /// modified version of Merlin's code for drawing UdonBehaviour inspectors used to set variables from any other + /// C# script while in Edit mode /// /// /// @@ -30,7 +139,6 @@ public static void SetInspectorVariable(this UdonBehaviour udonBehaviour, string throw new Exception("Only edit mode is supported"); } - var symbolTable = GetSymbolTable(udonBehaviour); var publicVariables = udonBehaviour.publicVariables; if (publicVariables == null) { @@ -40,6 +148,7 @@ public static void SetInspectorVariable(this UdonBehaviour udonBehaviour, string Undo.RecordObject(udonBehaviour, "Modify variable"); if (!publicVariables.TrySetVariableValue(symbolName, newValue)) { + var symbolTable = GetSymbolTable(udonBehaviour); var symbolType = symbolTable.GetSymbolType(symbolName); if (!publicVariables.TryAddVariable(CreateUdonVariable(symbolName, newValue, symbolType))) @@ -68,7 +177,9 @@ public static void SetInspectorVariable(this UdonBehaviour udonBehaviour, string GUI.changed = true; if (PrefabUtility.IsPartOfPrefabInstance(udonBehaviour)) + { PrefabUtility.RecordPrefabInstancePropertyModifications(udonBehaviour); + } } public static void ResetInspectorVariable(this UdonBehaviour udonBehaviour, string symbolName) @@ -89,17 +200,76 @@ public static void ResetInspectorVariable(this UdonBehaviour udonBehaviour, stri throw new Exception("UdonBehaviour has no UdonSharpProgramAsset"); } + programAsset.UpdateProgram(); + udonBehaviour.SetInspectorVariable(symbolName, programAsset.GetPublicVariableDefaultValue(symbolName)); } + #endregion + + + public static List GetInspectorVariableNames(this UdonBehaviour udonBehaviour) + { + if (!udonBehaviour) + { + throw new ArgumentException("Invalid UdonBehaviour"); + } + + try + { + return new List(udonBehaviour.GetSymbolTable().GetExportedSymbols()); + } + catch (Exception e) + { + Debug.Log(e.Message + " (skipping)", udonBehaviour); + return new List(); + } + } + + + public static bool IsInspectorVariableNull(this UdonBehaviour udonBehaviour, string symbolName, + out Type variableType) + { + udonBehaviour.GetInspectorVariable(symbolName, out var variableValue, out variableType); + return variableType.IsNullable() && variableValue.IsUnityObjectNull(); + } + + #endregion + + #region private + + private static void GetVariableType(UdonBehaviour udonBehaviour, string symbolName, out Type variableType, + IUdonVariableTable publicVariables, UdonSharpProgramAsset programAsset) + { + if (!publicVariables.TryGetVariableType(symbolName, out variableType)) + { + var symbolTable = udonBehaviour.GetSymbolTable(); + if (symbolTable.HasAddressForSymbol(symbolName)) + { + var symbolAddress = symbolTable.GetAddressFromSymbol(symbolName); + var program = programAsset.GetRealProgram(); + variableType = program.Heap.GetHeapVariableType(symbolAddress); + } + else + { + variableType = null; + } + } + } + + /// - /// /// /// /// /// if the UdonBehaviour has no public variables private static IUdonSymbolTable GetSymbolTable(this UdonBehaviour udonBehaviour) { + if (!udonBehaviour || !(udonBehaviour.programSource is UdonSharpProgramAsset)) + { + throw new Exception("ProgramSource is not an UdonSharpProgramAsset"); + } + var programAsset = (UdonSharpProgramAsset) udonBehaviour.programSource; if (!programAsset) { @@ -107,6 +277,7 @@ private static IUdonSymbolTable GetSymbolTable(this UdonBehaviour udonBehaviour) } programAsset.UpdateProgram(); + var program = programAsset.GetRealProgram(); if (program?.SymbolTable == null) { @@ -116,34 +287,24 @@ private static IUdonSymbolTable GetSymbolTable(this UdonBehaviour udonBehaviour) return program.SymbolTable; } - public static string[] GetExportedSymbolNames(this UdonBehaviour udonBehaviour) - { - if (!udonBehaviour) - { - throw new ArgumentException("Invalid UdonBehaviour"); - } - - try - { - return udonBehaviour.GetSymbolTable().GetExportedSymbols(); - } - catch (Exception e) - { - Debug.LogWarning(e.Message, udonBehaviour); - return new string[0]; - } - } private static IUdonVariable CreateUdonVariable(string symbolName, object value, Type type) { - Type udonVariableType = typeof(UdonVariable<>).MakeGenericType(type); + var udonVariableType = typeof(UdonVariable<>).MakeGenericType(type); return (IUdonVariable) Activator.CreateInstance(udonVariableType, symbolName, value); } private static bool IsUnityObjectNull(this object value) { - return value == null || value is UnityEngine.Object unityEngineObject && unityEngineObject == null; + return value == null || value is Object unityEngineObject && unityEngineObject == null; } + + private static bool IsNullable(this Type type) + { + return type.IsNullableType(); + } + + #endregion } } From 14b3c95e77da613af9dc6487f75002e7d194e387 Mon Sep 17 00:00:00 2001 From: Guribo Date: Fri, 8 Jan 2021 15:48:30 +0100 Subject: [PATCH 5/5] doc: add documentation, refactoring --- README.md | 44 +++++++-- README/inspectorValueChangerExample.gif | Bin 0 -> 135076 bytes README/inspectorValueChangerExample.gif.meta | 88 ++++++++++++++++++ Scenes/Examples/EditorTesting.unity | 7 +- .../Examples/InspectorValueChangerExample.cs | 1 - Scripts/UdonBehaviourExtensions.cs | 62 +++++++++--- 6 files changed, 178 insertions(+), 24 deletions(-) create mode 100644 README/inspectorValueChangerExample.gif create mode 100644 README/inspectorValueChangerExample.gif.meta diff --git a/README.md b/README.md index 6572597..2dfbb31 100644 --- a/README.md +++ b/README.md @@ -2,24 +2,54 @@ Scripts that make developing with UDON for VRChat safer and more fun :) +# Requirements + + - [UdonSharp](https://github.com/MerlinVR/UdonSharp#requirements) as described by [Merlin](https://github.com/MerlinVR) + ## Features +#### Scene Checking * automatically checks the scene for empty public variables (*null*) and logs to the console (every time assets get saved) * allows checking manually via menu entry to allow instant navigation to errors -## Usage +#### Editor Scripting +* UdonBehaviour Extension methods for changing and reading UdonBehaviour variables in Edit mode have been added. -Use via menu or silently by saving the scene (Ctrl+s): +## Usage and Examples + +### Scene Checking +Use via menu or silently by saving the scene (Ctrl+s): ![Menu](README/menu.png) -Skip or show errors: +Skip or show errors: ![Error Dialog](README/errorMessage.png) -Locate empty variable by name and allow easy fixing of variable (optionally (¬‿¬) ): +Locate empty variable by name and allow easy fixing of variable (optionally (¬‿¬) ): ![Error Location](README/errorLocation.png) -Warns about potential errors is the console and clicking on the message will alos highlight the affected gameobject in the hierarchy: +Warns about potential errors is the console and clicking on the message will alos highlight the affected gameobject in the hierarchy: ![Error Navigation in Console](README/errorNavigationInConsole.png) -In case all errors get skipped a conclusion will be presented: -![Conclusion on Skipping](README/conclusion.png) \ No newline at end of file +In case all errors get skipped a conclusion will be presented: +![Conclusion on Skipping](README/conclusion.png) + +### Editor Scripting +> [Example script](Scripts/Examples/InspectorValueChangerExample.cs) +````c# +public UdonBehaviour editorTestingBehaviour; + +public void TrySetVariables() +{ + editorTestingBehaviour.SetInspectorVariable("testInt", 100); + editorTestingBehaviour.SetInspectorVariable("testString", "Hello World"); + editorTestingBehaviour.SetInspectorVariable("testTransform", gameObject.transform); + editorTestingBehaviour.SetInspectorVariable("testGameObject", gameObject); + editorTestingBehaviour.SetInspectorVariable("testScriptReference", editorTestingBehaviour); +} + +... +```` + +![Conclusion on Skipping](README/inspectorValueChangerExample.gif) +*Example scene and scripts are included* + diff --git a/README/inspectorValueChangerExample.gif b/README/inspectorValueChangerExample.gif new file mode 100644 index 0000000000000000000000000000000000000000..965cb2524b93c21d13cd5d6e7eee0dfa47c53b56 GIT binary patch literal 135076 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

RNMT^m zxIQWMdf&k#9d$?U&(^1{Z_wS*(4+JrWZbr1_Ija4^w20D$CG;DUi7iOA8xBQp}MYP z^Cw?e**(*H2N4-atljPBmm2$DeAaEe_2b>>(6y(B8x@pr-Kp=x=m;T_x~1v#(+!QM zgQh2Hri99-zpv~MqakuxNNx54!W;VVIVmp1p-C_Mqk(nv=enkiZt;}4CO^sMr>Enc z+T({8wunp|d~BY8zulZT%J-{3!PlC*)i_bHKbEf&FYvP2?G1Nk<}-$z6lC-2bHMGS zWQV4!4lBPn{7S#Q-s`=n4w6c`y>jBLF#+bwxOKQ))$6QH_-mF?wR>3LyoR^Y zhNsGReO(_2;mFgKU8);!@RWthjw82zlq>xdI@URVuCu3kw%QxZVe@gipT?cNw{kqa z@uq+C@${Ci^c!AX7R1xXin=@FES6|q?)l!Dg%hDNcKOy5} z!=yu|nX#6z>v>2=81bb2S0PUoFEy3ly#Z-%aHH# z!J}5ofTNrzI_Y)2Fxn9q@nTc&R*KQlANiMdK3dk`_72S5B z+ETVIj)1@@vS_jVYud?iLXO?SDN?=}W_M)IY`@acq{Jbh!xxIK*r=ODreLv3*6PPa zEU|Bit55CUdva~Qxvri52~)C|1PHW9RCvQ$D3(z-jI>EaNs?>?6)d~YG0`=6O0sl< z%;_%4Vz=<}bd$r*_pJ*;DG>JBVKOA8qespXebDQdBpXN{ydOHXrUJFiwV)+&!wG&f zBqb<}98XHJadsen@;FvCp_18&f^l}8N5Xu_{JrIo3^o&7P!)(f8s8uA=&sbS;6nZFj zg1W2D!QrRReOI33=ieI_%Y_n8=sZ^wMv@fx6y%K#-aKBFfL9C9$MM7MYB@#B`;7aH z070>_b8*V)YO&Z|5j!?RJ!#W6eX-pKg%(LbS1&9^5n38 zg^H#c5+&MOb3)EUhrtY2HDbf$W7GZP=qq~_h^kuFTxjFPumC=O^f|_{a0eP2I;Z{& zejK5QQ};s1uoQ+26i?KAsC%md!pZm3LVK%j?>5_e=iwKb3HI@_UM74l{UucYOV}j* z+&&}kBsnAzTK`Zs#_KcEpYA#H@{vpb^b^-AFGwa{hs=-`4hxvP{;g{zy+uI^nya1O z9e{?Bn@F(L21G??&Etc97)cYDhni-C(!10Z$P+CbJn|>c);yrP2rIkKtv0#x%bQ#% zo`HZ72}A)LG`#S@0_nGRD+1no7V>(A7Qli!8tx@aq_6RF;CX2%bn+97Zb$oSKwFWYO7Sz<3;D$S1Q`h2xW2IQT=iH;l%aqYR6v-Iwcsj?j>+-Z zD7y7o2j^}`q6Q{dC(|jFO+`|kveB{XaIpy~abobT&|IUqr<{`7a%A_ZG*bdX3yNoj zP#_G}27XAn-XPgAFgrb6$LEz6(T1 zvtC#*t#erGaFlHmmztOc58Q0+p6)8S!^51!MXJykiaf_NHvyG4yAQ2B({q|_>!)Vr zp7Hnqg=o)uIxdIn#0w|n;`K&Vb$b)Fx`oYzdMPLdD^7Ml6Rn#K<4U89(m$|wcQW(OCA%2 zBO&C7v^W||Lv0z`F=>OegVj7C3f1So@9BGd7On4ibB&6_iR)VrX9?!L(1S!G-#M`p zA75+;$=vEv+y%H)HVq>fcDv#v zfr+x_VJmd_@%y+iMQjSlY=Vg!;c69nA#^xvdn#E*A`QM1qq@OW!j=FDAcx^_DpN9% z+sKb)BRS&ABYN!=m@}ioOpOT>rpB(}r(x~)=Wh-t#akB`)Lzu=#3H#&B|+FZO2Xit zg3dFxjg0yu+LuEgx?Sm)OhdxS{`;AE55`lnYEItM+LwCpCR>kzwvS{&z0Y4fKX;{~ zXk}Q)Q?-7BZbpjKJ}!p9fUmwxLn;wqm{7>==u-wiSc@VzxR0GKjAu#^SG|_IM46(`G`xt&b|ZkYZ{-f z34m~BaFmu0G`@AvTuRgz0HTOS6ajFr(*eMQnnLd)J4{x&u+`-E(Ew!uv}*IJ)^!#y z6irHwe8hIQW9jRB`p6vBN1laI4Br%OYS7KlqWwoMYO6%#1e@L9*D3`+zSyN1N>LsS zcGhunQ3(KTt+QG;elVKb*FP*6VYWG)7T~EPfOet)tqYaooO$2}%@D?RNQlxEVY23o zaEnP+}O9F3D%`s9Sr2G7LNVpb6dqQGUDQS%?!nNA>+SsS(ud=!^&;( zKt2XSk&u16b_rc`I77t4zyrI)Cfz-4_xSx8agWlDd_vpPAB{h^*=2&=>31TYViEx+ zU#D`kq&zZO8KI+nAZ-zldg~9u&ieERQRn9S{!bpR)gmM7%4|}tk4gHEJe=8V;P}7t zaAxa<%QLKFxj1jYrG3kP<>5xIr(f)?kG=k1dHAak#}k<~B*MTXGpYKt>>c({@0(T6 zNKD87mxtG%%-*=7{!ad{JbeGaSd{SeDJ1G2VE@4VEY z;p6S^$HK_(579YQU+VA{R9zysWd6m3bjc&f(xKn-?qA{@?P*uVCcJYDYqfd^)>hP{ zj_{)E^!;bN1J6pHDIs=(gt@}~zh`>=WtEYki6c~}nVzD>%8iW}XNaxArJ_6a4$pl! zZ#UQYeZJ>zH`blOR`T=yoyDVfxO{b%bB9ocNrT-Zy8CdUbe8f-Q_S*w-N)VB!4vkE z$c~@vY7~W_G8OEYVC&FeB?PW31C@PX!-Z-a2v%CiD^6o;Qb9E;t1Hcp3OK0a*mYg( zr3tjA1TO9aHEA`#>nS&4R`{w6p9xCp9uG*DqW($yW4f z)VHtK09cOgFn&?GX^lOo71^{VfUXTVDT|sEbA`l7NA2LInXZ~yJ+3mnLEz0&rf^9V zSiK6KzX-FGYHe^ZiIKPX2{aeN!9+Sp651?Om-upM?Hof0?Lre`Jn3r@wk{1WHiZol zHc3*W!$WH`;Nmn`rwXkX02ki`wW-P)jHWU+NaCSMB~6Nh4~k7$UX$#V6P5>|l&hTF zBAs^XZ}C{)Jd(EA{oNM-$fhF&&1&VaEss@AY}sknVtA{?P`~ku2W;pK(rB%9rmc!& z@V3pZii4ZIChHk;Ti1I&E70RE61h$%QQACEMQ|%#liPg4^_*^*lm6xhxOzt^6=lp| z>5x(8%;qWI7Do}gItW%*K-rGf+fv|SYq-m!$&m_gqSHM%?KBP7@-DRUw5>AF-W&l@ zk7};{Y~e1ZUepJ_c+?mBwijD(yEa*$(d-uO>2}?o%JFP3*J3GYIAq#CSMuJLSYUUn z!0y7N@^}#y96$C0ks!cb~JaRNO!({jhX`M z>yMUap0DnEwkz@3t)4Y6cRT7*K=VoTi#?v4lP@_19zjS1<^hJ*5W9Uk=*PLdU7Q;IJj%8Z{ zYEH84QrOhNdNmAd(*jD<9$YEfeYemg@0PoZ)dm5e8rh2*jIt%O?vpxbV{moXjw!!4 z6Kr%rSxe`7c;S{;=VYTcpAEk5(2{gajd)f>uvKGFG>+Hb<*zz1Dih5+7Wa5BdA_dk z-7dc7@ZOq+zUgu*oNdAcm8hU#(A{AVtjGY96j2z{4rlvjdOOEif=Q&gy^HYhHUp{s zc4~YVek5Ci3aav(93iwO6;>I89Vt?j%p}{A=0pWvIl93r^ctN2x)#mdasx%x6{BH6`G!qO%qA6SVGUzlX;ZSOP~eHHPlqrIT1Sa~-!s*6JcbrV3oS(p7c z@6`r73LovvCkuzt>g$yowp6^U?_%rnTRqY}cZAffUXnj|_T7VkT1N$T>IqNxxp#ZN z*(v*U%?Iy2oU*q&^4-q8SE5mg?xOBPquu^<-G{N_09A3If%wP_GVV} z-fZc;)!lo0wD-1 z;!_^0&K4pda1{m7gn&yco6i8bB5YsXp$n}gDXrSRr3-x+Tz}&sxu?wj$GO)F1`b{m z0Ex81Qfi+xi~k3n3#M!%Ac61eaK=yO?rYI=?lTU}3VdrW9V}kxuiz171Hen~Ks?#c zi;ThG*eo0yL*}&1`E}H#v^x-=&tX1d{fA!nKacw`v<1KN(bHfWL#3N^Y9HuIhgK`2 z@NS1Hw7L4Z8V^#h_n*F|%Y>qz*@7!LwS{$a+yBJV02v`Hh=H**VD+Z57$x}i@n<-1 z?Z7p9e{#WJz5ntZ+H3Lz24p=%{QKd@d4s^;Er;`~266|u&ThEL zIgGr!mJS8y-~CrgVyiES@D4Gs~5C7aNFMkUSxQ|1ZN?>VEGGUMH%>Y zk9_51dy7D&=+QK%x|?GGVRgn( z+XIFM%n^zXCMExqE}yMT4^mrMBhx``$1fUgVVk5=?@3IE#e^L8A?{=pb`Vj+;mu?i za4Vu&#a5;DXVSysLPubWF+2sfBg3K=oZ3n|Pl41VV_0f%hKR9$TTr4mxM~`+$_Hja zVW+dhyhM>Dtvewf8$sqvwpqVcj-gdc{-4j)IIbcW`Oj)wa~N))%l zfe@4~;WP#8TkPrj7IF5YY3dpw&>o|ee zEO0X3pi#g$Z^w-4v6)N+%@Rc`^&EUjhis|1HO0}TTcEG?BX_5ckNv{nV_>`j(TX9B z9*qm^yo}}~`L8#eWzhf!!PGZZ_IGi#_MbSD8{@Jzhku4lWHDFZrNssQz$6b+fLN;o z{>YBw;|C$9&f*mnyteoB`aeRHEKX1$ICY33TjyzAhs$*$^VB< z*dNxREEQlf$^z#?=Bz~u)@albHwF{PpzRpTwKBSFatbSu^I}3{1!z?UW2aHv?)`Cz z3MknaNXHw&kXd%3wd(Uz{>yPG0WA6gKqUJfu#8i9BF7c8FJ7PR?0{TU(dv|8C&Rvj zcLOoGU?O9V#+*y41k`aD<0{~b8ZbKoomgSfwVk@ZwO@5Qu2U-hrDcf=OFrcV0eOzQ z9+XC=IQ6Y%UXaxd)R?v^h(Kg>KXxBFOrQfYh;Q?N7AQM^7|AeLmTEEOTcSj{B zFSr~-t4%-VD-d)kPyum>(`KvgQ>sw)Gq389j|k&4##L*b_Q=M`#K5dv07E}=RRc+6 zAjt^sb}@2i9+T;ITti#}s)#C?q z_XZBA_O&H1wy!2W!TCP7?3;;G!cqW-B1LJAfgG}3?xp(D+hn=tK5^{^OHZk1Q@dBa z6<+E|UXt8c>djet|0F>yl7AJpG}R7HOfP+ul@6*)hm54d@v8%l?ET2MpqZ>Op zHlx>`q-=WdRh5;VVwoxKMXr=ZHk|r{QASl>!_AR>M^_J3=yDMi`y75m`ZNb4OvEQWQbEcA#BWkm`Sj3bN9p1}^FO{XlVwaR zRji!OqsCl4QTHT9?x>dOuz>T5?lhf5C5w2cM9rg=*XO}iK7;2_eq?rnLXyvLlJP-} zJ6!YeFtSyAi9o2iq&=OIBvr^9)4lR*E?ti2M6lJrx@FC2ebfmBygL@RzGU;d&lwv> zWT*iCnT*rA03m84U@W}h#LAFM+u@ucw~9#SHC~OX{`)gey~)<-wzJ{W;54rlUNjF? z{+MpQGs$+0A0$4Vd-JYNb?((9Lu)jaemyVeT2OTFs9*(DZG8WB>uJz3i@V7r?_uU& zCi#|TD?!p|B-2U$k-`u?7sWSeMrS!vn{zA8vgn141mdHD@>v$7EGU6Y%3g2s7*BlT zZuc!WzjXX)ZgYo;SzhJQL6l`>l4*X`=&mzUWp}e`rt*f9ObDpn*6MFnb}FXj{dIgmTM<eQ9L0lirC z=XM@))V8(i13$VwBbJUG&S5TXkOW?Iu;~q9Z*K$r^~kOg6z_E-!8B%i1KRXt;Dx@N z5pyBM|4ZE|39sE7Mu%#hqYdZy@oAqfC10w1AIZKQ-{*e}YWk2c@onRm%V(m0h26bq zVKbW3Om!MbKXYh)AS1qhe(Z7bfI6k3@0{J#(}{Y!@2dyNvTIH0-e<7-qM1aQ3QIa? z%7r#46)IF3(J^bSao)e@1Si8?iJz^)?Pn`)1h^{Vrq4P4^YzoYtbe}MoUi#VBzoB| zJdb!|Kh+!bnEtCT{)z+e(Mb3+ArzA7ADANyVN@uCxSw`+mP%#0U-uTD-#F<1>!0KX zbnNu0gyR^T3#CahbtM&PABbNY0AcnB2;@a)tdbB?gLpD{H#%NZ2q-oUCTS}GICu=v zpwK~mo|0UMn~UrEZJ-rRN98`HMbV$Z-B)`Lx4WuIt)7}>T`(l?O4;lhNk=xXzo*cJ zv~1WhV;y<+K0ZDhAgbtawk_V%Yn431EGlrq?2jlkA}%zgU7Q3>jIMHC`<8Xm(yN!x z>g($nZ`-!-XzKOa5d%xk^X;*vX?GU&DY7#e-l?V6vh5A@ejiERTUwf4bk@Ku$oS=f z&eH1@Dgfp|@XJH9u{YGm4XAA6SAj}p{8I}lR%v;!Le~9ASC`OLK9FCB?<&g_*BaWC z<-LxIJ#iC-&@m6*y*{3rc5|o3i{1AQbi|dG-JUv|WA`Rw2eY&6&ac`qn>Tp0I(0}+ zx@bg4n}}ega)FEk#aZ42z*G0Q;}a;G(gHimP1t&=-#$=Ex*8dQhiwG`8+aPPGI zcMsQ9Hq)$ literal 0 HcmV?d00001 diff --git a/README/inspectorValueChangerExample.gif.meta b/README/inspectorValueChangerExample.gif.meta new file mode 100644 index 0000000..66e635a --- /dev/null +++ b/README/inspectorValueChangerExample.gif.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 8e562fe3d4f2a1f43bfba5a71b1be4ae +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scenes/Examples/EditorTesting.unity b/Scenes/Examples/EditorTesting.unity index 6c02f2d..f3672e0 100644 --- a/Scenes/Examples/EditorTesting.unity +++ b/Scenes/Examples/EditorTesting.unity @@ -246,8 +246,11 @@ MonoBehaviour: serializedProgramAsset: {fileID: 11400000, guid: 12b3ab89a2110a54b8004b7c1e2587f7, type: 2} programSource: {fileID: 11400000, guid: c29d80bdbf2e26c4d8e2ba2e675781ed, type: 2} - serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgIAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAQcAAAB0AGUAcwB0AEkAbgB0ACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQAAAAAABwUCLwMAAAABSgAAAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAC4AVQBkAG8AbgBWAGEAcgBpAGEAYgBsAGUAYAAxAFsAWwBTAHkAcwB0AGUAbQAuAFMAdAByAGkAbgBnACwAIABtAHMAYwBvAHIAbABpAGIAXQBdACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgADAAAABgIAAAAAAAAAJwEEAAAAdAB5AHAAZQABFwAAAFMAeQBzAHQAZQBtAC4AUwB0AHIAaQBuAGcALAAgAG0AcwBjAG8AcgBsAGkAYgAnAQoAAABTAHkAbQBiAG8AbABOAGEAbQBlAAEKAAAAdABlAHMAdABTAHQAcgBpAG4AZwAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBBQAAAFYAYQBsAHUAZQABAAAAAAcFBwUHBQ== - publicVariablesUnityEngineObjects: [] + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgUAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAQcAAAB0AGUAcwB0AEkAbgB0ACcBBAAAAHQAeQBwAGUA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 + publicVariablesUnityEngineObjects: + - {fileID: 1695130166} + - {fileID: 1695130163} + - {fileID: 1695130165} publicVariablesSerializationDataFormat: 0 --- !u!4 &1695130166 Transform: diff --git a/Scripts/Examples/InspectorValueChangerExample.cs b/Scripts/Examples/InspectorValueChangerExample.cs index 44f0202..057b2ec 100644 --- a/Scripts/Examples/InspectorValueChangerExample.cs +++ b/Scripts/Examples/InspectorValueChangerExample.cs @@ -8,7 +8,6 @@ public class InspectorValueChangerExample : MonoBehaviour { public UdonBehaviour editorTestingBehaviour; - [ContextMenu("TrySetVariables")] public void TrySetVariables() { diff --git a/Scripts/UdonBehaviourExtensions.cs b/Scripts/UdonBehaviourExtensions.cs index 48f214b..3583e6a 100644 --- a/Scripts/UdonBehaviourExtensions.cs +++ b/Scripts/UdonBehaviourExtensions.cs @@ -12,13 +12,26 @@ namespace Guribo.UdonUtils.Scripts { + ///

+ /// contains functions to access and modify UdonBehaviour variables in Edit mode + /// public static class UdonBehaviourExtensions { #region public #region GetVariable - public static object GetInspectorVariableDefaultValue(this UdonBehaviour udonBehaviour, string symbolName, + /// + /// read the default value of a variable that is visible in the UdonBehaviour inspector + /// + /// + /// name of the variable visible in the inspector on the UdonBehaviour + /// type of the value, can potentially be null! + /// the default value + /// if udonBehaviour is invalid + /// e.g. if the symbolName doesn't exist + public static object GetInspectorVariableDefaultValue(this UdonBehaviour udonBehaviour, + string symbolName, out Type variableType) { if (!udonBehaviour) @@ -57,14 +70,15 @@ public static object GetInspectorVariableDefaultValue(this UdonBehaviour udonBeh } /// + /// read the value of a variable that is visible in the UdonBehaviour inspector /// /// - /// - /// - /// - /// True if the value was read and it is not a default value, false if it is the default value - /// - /// + /// name of the variable visible in the inspector on the UdonBehaviour + /// the current value or the default value if it has not been changed + /// type of the value, can potentially be null! + /// True if the value was read and it is not the default value, false if it is the default value + /// if udonBehaviour is invalid + /// e.g. if the symbolName doesn't exist public static bool GetInspectorVariable(this UdonBehaviour udonBehaviour, string symbolName, out object variableValue, out Type variableType) { @@ -125,8 +139,10 @@ public static bool GetInspectorVariable(this UdonBehaviour udonBehaviour, string /// C# script while in Edit mode /// /// - /// + /// name of the variable visible in the inspector on the UdonBehaviour /// + /// if udonBehaviour is invalid + /// e.g. if the symbolName doesn't exist public static void SetInspectorVariable(this UdonBehaviour udonBehaviour, string symbolName, object newValue) { if (!udonBehaviour) @@ -160,10 +176,7 @@ public static void SetInspectorVariable(this UdonBehaviour udonBehaviour, string var foundValue = publicVariables.TryGetVariableValue(symbolName, out var variableValue); var foundType = publicVariables.TryGetVariableType(symbolName, out var variableType); - // Remove this variable from the publicVariable list since UdonBehaviours set all null GameObjects, UdonBehaviours, and Transforms to the current behavior's equivalent object regardless of if it's marked as a `null` heap variable or `this` - // This default behavior is not the same as Unity, where the references are just left null. And more importantly, it assumes that the user has interacted with the inspector on that object at some point which cannot be guaranteed. - // Specifically, if the user adds some public variable to a class, and multiple objects in the scene reference the program asset, - // the user will need to go through each of the objects' inspectors to make sure each UdonBehavior has its `publicVariables` variable populated by the inspector + // copied from Merlin's code, see UdonSharpProgramAsset.cs for reference if (foundValue && foundType && variableValue.IsUnityObjectNull() @@ -182,6 +195,13 @@ public static void SetInspectorVariable(this UdonBehaviour udonBehaviour, string } } + /// + /// resets a value to the prefab or original script value + /// + /// + /// name of the variable visible in the inspector on the UdonBehaviour + /// if udonBehaviour is invalid + /// e.g. if the symbolName doesn't exist public static void ResetInspectorVariable(this UdonBehaviour udonBehaviour, string symbolName) { if (!udonBehaviour) @@ -208,6 +228,12 @@ public static void ResetInspectorVariable(this UdonBehaviour udonBehaviour, stri #endregion + /// + /// returns a List if names of the variables visible in the inspector on the UdonBehaviour + /// + /// + /// + /// if udonBehaviour is invalid public static List GetInspectorVariableNames(this UdonBehaviour udonBehaviour) { if (!udonBehaviour) @@ -226,8 +252,16 @@ public static List GetInspectorVariableNames(this UdonBehaviour udonBeha } } - - public static bool IsInspectorVariableNull(this UdonBehaviour udonBehaviour, string symbolName, + /// + /// checks whether the current value of a variable is null (not nullable types return false) + /// + /// + /// + /// + /// + /// if udonBehaviour is invalid + public static bool IsInspectorVariableNull(this UdonBehaviour udonBehaviour, + string symbolName, out Type variableType) { udonBehaviour.GetInspectorVariable(symbolName, out var variableValue, out variableType);