private static List <UdonBehaviour> ShouldShowPrimitivesWarning() { if (_primitiveMeshes == null) { PrimitiveType[] primitiveTypes = (PrimitiveType[])Enum.GetValues(typeof(PrimitiveType)); _primitiveMeshes = new Mesh[primitiveTypes.Length]; for (int i = 0; i < primitiveTypes.Length; i++) { PrimitiveType primitiveType = primitiveTypes[i]; GameObject go = GameObject.CreatePrimitive(primitiveType); _primitiveMeshes[i] = go.GetComponent <MeshFilter>().sharedMesh; Object.DestroyImmediate(go); } } UdonBehaviour[] allBehaviours = Object.FindObjectsOfType <UdonBehaviour>(); List <UdonBehaviour> failedBehaviours = new List <UdonBehaviour>(allBehaviours.Length); foreach (UdonBehaviour behaviour in allBehaviours) { IUdonVariableTable publicVariables = behaviour.publicVariables; foreach (string symbol in publicVariables.VariableSymbols) { if (!publicVariables.TryGetVariableValue(symbol, out Mesh mesh)) { continue; } if (mesh == null) { continue; } bool all = true; foreach (Mesh primitiveMesh in _primitiveMeshes) { if (mesh != primitiveMesh) { continue; } all = false; break; } if (all) { continue; } failedBehaviours.Add(behaviour); } } return(failedBehaviours); }
private void FixPrimitivesWarning() { UdonBehaviour[] allObjects = Object.FindObjectsOfType <UdonBehaviour>(); foreach (UdonBehaviour behaviour in allObjects) { IUdonVariableTable publicVariables = behaviour.publicVariables; foreach (string symbol in publicVariables.VariableSymbols) { if (!publicVariables.TryGetVariableValue(symbol, out Mesh mesh)) { continue; } if (mesh == null) { continue; } bool all = true; foreach (Mesh primitiveMesh in _primitiveMeshes) { if (mesh != primitiveMesh) { continue; } all = false; break; } if (all) { continue; } Mesh clone = Object.Instantiate(mesh); Scene scene = behaviour.gameObject.scene; string scenePath = Path.GetDirectoryName(scene.path) ?? "Assets"; string folderName = $"{scene.name}_MeshClones"; string folderPath = Path.Combine(scenePath, folderName); if (!AssetDatabase.IsValidFolder(folderPath)) { AssetDatabase.CreateFolder(scenePath, folderName); } string assetPath = Path.Combine(folderPath, $"{clone.name}.asset"); Mesh existingClone = AssetDatabase.LoadAssetAtPath <Mesh>(assetPath); if (existingClone == null) { AssetDatabase.CreateAsset(clone, assetPath); AssetDatabase.Refresh(); } else { clone = existingClone; } publicVariables.TrySetVariableValue(symbol, clone); EditorSceneManager.MarkSceneDirty(behaviour.gameObject.scene); } } }
protected void DrawPublicVariables(UdonBehaviour udonBehaviour, ref bool dirty) { IUdonVariableTable publicVariables = null; if (udonBehaviour != null) { publicVariables = udonBehaviour.publicVariables; } EditorGUILayout.LabelField("Public Variables", EditorStyles.boldLabel); EditorGUI.indentLevel++; if (program?.SymbolTable == null) { EditorGUILayout.LabelField("No public variables."); EditorGUI.indentLevel--; return; } IUdonSymbolTable symbolTable = program.SymbolTable; string[] exportedSymbolNames = symbolTable.GetExportedSymbols(); if (publicVariables != null) { foreach (string publicVariableSymbol in publicVariables.VariableSymbols.ToArray()) { if (!exportedSymbolNames.Contains(publicVariableSymbol)) { publicVariables.RemoveVariable(publicVariableSymbol); } } } if (exportedSymbolNames.Length <= 0) { EditorGUILayout.LabelField("No public variables."); EditorGUI.indentLevel--; return; } foreach (string exportedSymbol in exportedSymbolNames) { Type symbolType = symbolTable.GetSymbolType(exportedSymbol); if (publicVariables == null) { DrawPublicVariableField(exportedSymbol, GetPublicVariableDefaultValue(exportedSymbol, symbolType), symbolType, ref dirty, false); continue; } if (!publicVariables.TryGetVariableType(exportedSymbol, out Type declaredType) || declaredType != symbolType) { publicVariables.RemoveVariable(exportedSymbol); if (!publicVariables.TryAddVariable(CreateUdonVariable(exportedSymbol, GetPublicVariableDefaultValue(exportedSymbol, declaredType), symbolType))) { EditorGUILayout.LabelField($"Error drawing field for symbol '{exportedSymbol}'."); continue; } } if (!publicVariables.TryGetVariableValue(exportedSymbol, out object variableValue)) { variableValue = GetPublicVariableDefaultValue(exportedSymbol, declaredType); } variableValue = DrawPublicVariableField(exportedSymbol, variableValue, symbolType, ref dirty, true); if (!dirty) { continue; } Undo.RecordObject(udonBehaviour, "Modify Public Variable"); if (!publicVariables.TrySetVariableValue(exportedSymbol, variableValue)) { if (!publicVariables.TryAddVariable(CreateUdonVariable(exportedSymbol, variableValue, symbolType))) { Debug.LogError($"Failed to set public variable '{exportedSymbol}' value."); } } EditorSceneManager.MarkSceneDirty(udonBehaviour.gameObject.scene); if (PrefabUtility.IsPartOfPrefabInstance(udonBehaviour)) { PrefabUtility.RecordPrefabInstancePropertyModifications(udonBehaviour); } } EditorGUI.indentLevel--; }