Пример #1
0
        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
        }