public static UdonSharpBehaviour GetUdonBehaviour(Type udonSharpType, GameObject gameObject) { UdonBehaviour adapter = gameObject.GetComponents <UdonBehaviour>().Where(udon => udon.programSource != null && udon.programSource.GetType() == typeof(UdonSharpProgramAsset) && (udon.programSource as UdonSharpProgramAsset).sourceCsScript.GetClass() == udonSharpType).FirstOrDefault(); if (adapter != null) { return(UdonSharpEditorUtility.GetProxyBehaviour(adapter)); } adapter = gameObject.GetComponents <UdonBehaviour>().Where(udon => udon.programSource == null).FirstOrDefault(); if (adapter == null) { adapter = gameObject.AddComponent <UdonBehaviour>(); } string[] guids = AssetDatabase.FindAssets(udonSharpType.Name + " t:UdonSharpProgramAsset"); if (guids.Length > 0) { UdonSharpProgramAsset udonProgram = (UdonSharpProgramAsset)AssetDatabase.LoadMainAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); if (udonProgram != null && udonProgram.GetSerializedUdonProgramAsset() != null) { adapter.AssignProgramAndVariables(udonProgram.GetSerializedUdonProgramAsset(), new VRC.Udon.Common.UdonVariableTable()); adapter.programSource = udonProgram; UdonSharpEditorUtility.GetProxyBehaviour(adapter); } } return(UdonSharpEditorUtility.GetProxyBehaviour(adapter)); }
private void CheckForMissingComponents() { Collider stationCollider = GetComponent <Collider>(); if (stationCollider == null) { gameObject.AddComponent <BoxCollider>().isTrigger = true; } #if UDON && UNITY_EDITOR UdonBehaviour udon = GetComponent <UdonBehaviour>(); if (udon == null) { udon = gameObject.AddComponent <UdonBehaviour>(); udon.interactText = "Sit"; AbstractUdonProgramSource program = UnityEditor.AssetDatabase.LoadAssetAtPath <AbstractUdonProgramSource>("Assets/VRChat Examples/Prefabs/VRCChair/StationGraph.asset"); if (program != null) { udon.AssignProgramAndVariables(program.SerializedProgramAsset, new UdonVariableTable()); } } #endif #if VRC_SDK_VRCSDK2 // Auto add a Interact Trigger to use the station VRC_Trigger trigger = GetComponent <VRC_Trigger>(); if (trigger == null) { trigger = gameObject.AddComponent <VRCSDK2.VRC_Trigger>(); trigger.Triggers = new List <VRC_Trigger.TriggerEvent>(); trigger.interactText = "Sit"; VRC_Trigger.TriggerEvent onInteract = new VRC_Trigger.TriggerEvent { BroadcastType = VRC_EventHandler.VrcBroadcastType.Local, TriggerType = VRC_Trigger.TriggerType.OnInteract, Events = new List <VRC_EventHandler.VrcEvent>() }; VRC_EventHandler.VrcEvent useStationEvent = new VRC_EventHandler.VrcEvent { EventType = VRC_EventHandler.VrcEventType.SendRPC, ParameterString = "UseStation", ParameterObjects = new[] { gameObject }, ParameterInt = 6, }; onInteract.Events.Add(useStationEvent); trigger.Triggers.Add(onInteract); // Reinitialize the trigger now that it has the proper events added. // Note that this only works as there were no vrc triggers on this object before. CyanEmuTriggerHelper helper = GetComponent <CyanEmuTriggerHelper>(); if (helper != null) { DestroyImmediate(helper); } CyanEmuTriggerHelper.InitializeTrigger(trigger); } #endif }