public override void OnInspectorGUI() { switch (errorState) { case BehaviourInspectorErrorState.Success: #if UDONSHARP_DEBUG EditorGUILayout.HelpBox("UDONSHARP_DEBUG is defined; backing UdonBehaviour is shown", MessageType.Info); #else EditorGUILayout.HelpBox("Something probably went wrong, you should not be able to see the underlying UdonBehaviour for UdonSharpBehaviours", MessageType.Warning); #endif EditorGUI.BeginDisabledGroup(true); EditorGUILayout.ObjectField("Linked U# Behaviour", UdonSharpEditorUtility.GetProxyBehaviour((UdonBehaviour)target), typeof(UdonSharpBehaviour), true); EditorGUILayout.ObjectField("Program Source", ((UdonBehaviour)target).programSource, typeof(AbstractUdonProgramSource), false); EditorGUI.EndDisabledGroup(); break; case BehaviourInspectorErrorState.PrefabNeedsUpgrade: EditorGUILayout.HelpBox("U# behaviour needs upgrade on prefab, make sure you didn't have any issues during importing the prefab.", MessageType.Error); break; case BehaviourInspectorErrorState.NoValidUSharpProgram: EditorGUILayout.HelpBox("U# behaviour is not pointing to a valid U# program asset.", MessageType.Error); UdonSharpProgramAsset programAsset = ((UdonBehaviour)target).programSource as UdonSharpProgramAsset; if (programAsset && programAsset.sourceCsScript == null) { UdonSharpGUI.DrawCreateScriptButton(programAsset); } break; } }
public static UdonSharpBehaviour AddUdonSharpComponent(this GameObject gameObject, System.Type type) { if (type == typeof(UdonSharpBehaviour)) { throw new System.ArgumentException("Cannot add components of type 'UdonSharpBehaviour', you can only add subclasses of this type"); } if (!typeof(UdonSharpBehaviour).IsAssignableFrom(type)) { throw new System.ArgumentException("Type for AddUdonSharpComponent must be a subclass of UdonSharpBehaviour"); } UdonBehaviour udonBehaviour = gameObject.AddComponent <UdonBehaviour>(); UdonSharpProgramAsset programAsset = UdonSharpProgramAsset.GetProgramAssetForClass(type); udonBehaviour.programSource = programAsset; udonBehaviour.AllowCollisionOwnershipTransfer = false; SerializedObject componentAsset = new SerializedObject(udonBehaviour); SerializedProperty serializedProgramAssetProperty = componentAsset.FindProperty("serializedProgramAsset"); serializedProgramAssetProperty.objectReferenceValue = programAsset.SerializedProgramAsset; componentAsset.ApplyModifiedPropertiesWithoutUndo(); UdonSharpBehaviour proxyComponent = UdonSharpEditorUtility.GetProxyBehaviour(udonBehaviour); if (EditorApplication.isPlaying) { udonBehaviour.InitializeUdonContent(); } return(proxyComponent); }
public static UdonSharpBehaviour AddUdonSharpComponent(this GameObject gameObject, System.Type type) { if (type == typeof(UdonSharpBehaviour)) { throw new System.ArgumentException("Cannot add components of type 'UdonSharpBehaviour', you can only add subclasses of this type"); } if (!typeof(UdonSharpBehaviour).IsAssignableFrom(type)) { throw new System.ArgumentException("Type for AddUdonSharpComponent must be a subclass of UdonSharpBehaviour"); } UdonBehaviour udonBehaviour = gameObject.AddComponent <UdonBehaviour>(); UdonSharpProgramAsset programAsset = UdonSharpProgramAsset.GetProgramAssetForClass(type); udonBehaviour.programSource = programAsset; #pragma warning disable CS0618 // Type or member is obsolete udonBehaviour.SynchronizePosition = false; udonBehaviour.AllowCollisionOwnershipTransfer = false; #pragma warning restore CS0618 // Type or member is obsolete switch (programAsset.behaviourSyncMode) { case BehaviourSyncMode.Continuous: udonBehaviour.SyncMethod = Networking.SyncType.Continuous; break; case BehaviourSyncMode.Manual: udonBehaviour.SyncMethod = Networking.SyncType.Manual; break; case BehaviourSyncMode.None: udonBehaviour.SyncMethod = Networking.SyncType.None; break; } SerializedObject componentAsset = new SerializedObject(udonBehaviour); SerializedProperty serializedProgramAssetProperty = componentAsset.FindProperty("serializedProgramAsset"); serializedProgramAssetProperty.objectReferenceValue = programAsset.SerializedProgramAsset; componentAsset.ApplyModifiedPropertiesWithoutUndo(); UdonSharpBehaviour proxyComponent = UdonSharpEditorUtility.GetProxyBehaviour(udonBehaviour); if (EditorApplication.isPlaying) { udonBehaviour.InitializeUdonContent(); } return(proxyComponent); }
private static UdonSharpBehaviour ConvertToUdonSharpComponentIntnl(UdonBehaviour behaviour, System.Type type, ProxySerializationPolicy proxySerializationPolicy) { if (behaviour == null) { return(null); } if (!UdonSharpEditorUtility.IsUdonSharpBehaviour(behaviour)) { return(null); } UdonSharpBehaviour udonSharpBehaviour = UdonSharpEditorUtility.GetProxyBehaviour(behaviour, ProxySerializationPolicy.NoSerialization); System.Type uSharpBehaviourType = udonSharpBehaviour.GetType(); if (udonSharpBehaviour && (uSharpBehaviourType == type || uSharpBehaviourType.IsSubclassOf(type))) { UdonSharpEditorUtility.CopyUdonToProxy(udonSharpBehaviour, proxySerializationPolicy); return(udonSharpBehaviour); } return(null); }
public static UnityEngine.Object ValidateObjectReference(UnityEngine.Object[] references, System.Type objType, SerializedProperty property, Enum options = null) { if (references.Length == 0) { return(null); } if (property != null) { if (references[0] != null) { if (EditorSceneManager.preventCrossSceneReferences && crossSceneRefCheckMethod(references[0], property.serializedObject.targetObject)) { return(null); } if (references[0] is GameObject gameObject) { references = gameObject.GetComponents <UdonSharpBehaviour>(); } foreach (UnityEngine.Object reference in references) { System.Type refType = reference.GetType(); if (objType.IsAssignableFrom(reference.GetType())) { return(reference); } else if (reference is UdonBehaviour udonBehaviour && UdonSharpEditorUtility.IsUdonSharpBehaviour(udonBehaviour)) { UdonSharpBehaviour proxy = UdonSharpEditorUtility.GetProxyBehaviour(udonBehaviour); if (proxy && objType.IsAssignableFrom(proxy.GetType())) { return(proxy); } } } } } else { if (objType == typeof(UdonSharpBehaviour) || objType.IsSubclassOf(typeof(UdonSharpBehaviour))) { foreach (UnityEngine.Object reference in references) { System.Type refType = reference.GetType(); if (objType.IsAssignableFrom(refType)) { return(reference); } else if (reference is GameObject referenceObject) { UnityEngine.Object foundRef = ValidateObjectReference(referenceObject.GetComponents <UdonSharpBehaviour>(), objType, null); if (foundRef) { return(foundRef); } } else if (reference is UdonBehaviour referenceBehaviour && UdonSharpEditorUtility.IsUdonSharpBehaviour(referenceBehaviour)) { UdonSharpBehaviour proxy = UdonSharpEditorUtility.GetProxyBehaviour(referenceBehaviour); if (proxy && objType.IsAssignableFrom(proxy.GetType())) { return(proxy); } } } } } return(null); }
public void OnEnable() { errorState = BehaviourInspectorErrorState.Success; bool needsUpgradePass = false; foreach (Object target in targets) { UdonBehaviour targetBehaviour = (UdonBehaviour)target; if (!UdonSharpEditorUtility.IsUdonSharpBehaviour(targetBehaviour)) { UdonSharpUtils.LogWarning($"UdonBehaviour '{targetBehaviour}' is not using a valid U# program asset", targetBehaviour); errorState = BehaviourInspectorErrorState.NoValidUSharpProgram; break; } if (UdonSharpEditorUtility.GetProxyBehaviour(targetBehaviour) != null) { continue; } needsUpgradePass = true; if (PrefabUtility.IsPartOfPrefabInstance(targetBehaviour) && !PrefabUtility.IsAddedComponentOverride(targetBehaviour)) { UdonSharpUtils.LogWarning($"UdonBehaviour '{targetBehaviour}' needs upgrade on source prefab asset.", targetBehaviour); errorState = BehaviourInspectorErrorState.PrefabNeedsUpgrade; break; } } if (!needsUpgradePass || errorState != BehaviourInspectorErrorState.Success) { return; } foreach (Object target in targets) { UdonBehaviour targetBehaviour = (UdonBehaviour)target; UdonSharpBehaviour udonSharpBehaviour = UdonSharpEditorUtility.GetProxyBehaviour(targetBehaviour); // Needs setup if (udonSharpBehaviour == null) { UdonSharpEditorUtility.SetIgnoreEvents(true); try { udonSharpBehaviour = (UdonSharpBehaviour)Undo.AddComponent(targetBehaviour.gameObject, UdonSharpEditorUtility.GetUdonSharpBehaviourType(targetBehaviour)); UdonSharpEditorUtility.SetBackingUdonBehaviour(udonSharpBehaviour, targetBehaviour); UdonSharpEditorUtility.MoveComponentRelativeToComponent(udonSharpBehaviour, targetBehaviour, true); UdonSharpEditorUtility.SetBehaviourVersion(targetBehaviour, UdonSharpBehaviourVersion.CurrentVersion); UdonSharpEditorUtility.SetSceneBehaviourUpgraded(targetBehaviour); } finally { UdonSharpEditorUtility.SetIgnoreEvents(false); } } udonSharpBehaviour.enabled = targetBehaviour.enabled; #if !UDONSHARP_DEBUG targetBehaviour.hideFlags = HideFlags.HideInInspector; #else targetBehaviour.hideFlags = HideFlags.None; #endif } }