public void Unload() { if (_asset != null) { _asset = null; } }
public override void OnInspectorGUI() { bool dirty = false; UdonProgramAsset programAsset = (UdonProgramAsset)target; programAsset.RunProgramSourceEditor(null, ref dirty); if (dirty) { EditorUtility.SetDirty(target); } }
public ControlledBehaviourAttribute(Type T) { var assets = Resources.FindObjectsOfTypeAll(typeof(UdonSharpProgramAsset)) .Select(a => a as UdonSharpProgramAsset).ToArray(); foreach (var asset in assets) { try { if (asset != null && asset.sourceCsScript.GetClass() == T) { uB = asset; } } catch { // ignored } } }
public void LoadAsset(UdonGraphProgramAsset asset) { _asset = asset; }
public override void OnInspectorGUI() { t = (UTController)target; // Copy current values if (!copiedValues) { t.SyncBack(); copiedValues = true; } // Header var customNameAttr = t.GetType().GetCustomAttributes(typeof(CustomNameAttribute)) .Select(i => i as CustomNameAttribute).ToArray(); var customName = customNameAttr.Length != 0 ? customNameAttr[0].name : t.GetType().Name.Replace("Controller", ""); UTStyles.RenderHeader(customName); EditorGUI.BeginChangeCheck(); serializedObject.Update(); EditorGUILayout.HelpBox("Controllers are Deprecated since UdonToolkit v0.4.0 in favor of a more streamlined system", MessageType.Warning); if (GUILayout.Button("Learn more")) { Application.OpenURL("https://l.vrchat.sh/utV4Migrate"); } // Extra pre-gui actions t.SetupController(); // Auto UB Addition if (t.GetComponent <UdonBehaviour>() == null) { if (uB) { var comp = t.gameObject.AddComponent <UdonBehaviour>(); comp.programSource = uB; } else { var controlledBehAttr = t.GetType().GetCustomAttributes(typeof(ControlledBehaviourAttribute)) .Select(i => i as ControlledBehaviourAttribute).ToArray(); if (controlledBehAttr.Any()) { var comp = t.gameObject.AddComponent <UdonBehaviour>(); uB = controlledBehAttr[0].uB; comp.programSource = uB; } } } // Help Box var helpBoxAttr = t.GetType().GetCustomAttributes(typeof(HelpMessageAttribute)) .Select(i => i as HelpMessageAttribute).ToArray(); if (helpBoxAttr.Any()) { UTStyles.RenderNote(helpBoxAttr[0]?.helpMessage); } // Check prefabs if (PrefabUtility.IsPartOfAnyPrefab(t.gameObject)) { EditorGUILayout.HelpBox( "Udon doesn't play well with Prefabs. " + "It is recommended to unpack your prefabs when modifying any values.\n" + "Right click the prefab and choose \"Unpack Prefab\"", MessageType.Warning); } // Actual GUI DrawGUI(t); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(t, undoString); serializedObject.ApplyModifiedProperties(); t.SyncValues(); } // Sync Toggles UTStyles.RenderSectionHeader("Udon Sync"); if (t.uB != null) { var uBo = new SerializedObject(t.uB); uBo.Update(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(uBo.FindProperty("SynchronizePosition")); var col = t.gameObject.GetComponent <Collider>(); if (col != null) { EditorGUILayout.PropertyField(uBo.FindProperty("AllowCollisionOwnershipTransfer"), new GUIContent("Collision Owner Transfer")); } if (EditorGUI.EndChangeCheck()) { uBo.ApplyModifiedProperties(); } } // Extra Methods var methods = t.GetType().GetMethods().Where(i => i.GetCustomAttribute <ButtonAttribute>() != null) .ToArray(); var buttons = t.GetType().GetMethods().Select(i => i.GetCustomAttribute <ButtonAttribute>()).Where(i => i != null) .ToArray(); if (buttons.Any()) { UTStyles.RenderSectionHeader("Methods"); var rowBreak = Mathf.Max(1, Mathf.Min(3, buttons.Length - 1)); var rowEndI = -100; foreach (var(button, i) in buttons.WithIndex()) { if (i == rowEndI && i != buttons.Length - 1) { EditorGUILayout.EndHorizontal(); } if (i % rowBreak == 0 && i != buttons.Length - 1) { EditorGUILayout.BeginHorizontal(); rowEndI = Math.Min(i + rowBreak, buttons.Length - 1); } EditorGUI.BeginDisabledGroup(!Application.isPlaying && !button.activeInEditMode); if (GUILayout.Button(button.text)) { t.Invoke(methods[i].Name, 0); } EditorGUI.EndDisabledGroup(); if (i == buttons.Length - 1 && rowEndI != -100) { EditorGUILayout.EndHorizontal(); } } } UTStyles.RenderSectionHeader("Manual Value Sync"); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Copy to Udon")) { t.SyncValues(); } if (GUILayout.Button("Copy from Udon")) { t.SyncBack(); } EditorGUILayout.EndHorizontal(); }