mvaganov

Trigger.cs

Feb 15th, 2018
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.92 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5.  
  6. // license: Copyfree, public domain. This is free code! Great artists, steal this code!
  7. // latest version at: https://pastebin.com/raw/8cZ5yKSd
  8. // requires Timer at: https://pastebin.com/raw/h61nAC3E
  9. namespace NS {
  10.     public class Trigger : TriggerBase {
  11.         public float delayInSeconds = 0;
  12.         [Tooltip("* Transform: teleport triggering object to the Transform\n"+
  13.             "* SceneAsset: load the scene\n"+
  14.             "* AudioClip: play audio here\n"+
  15.             "* GameObject: SetActivate(true)\n"+
  16.             "* Material: set this Renderer's .material property, make a note of what the previous material was\n"+
  17.             "* <any other>: activate a \'DoActivateTrigger()\' method (if available)\n"+
  18.             "* IEnumerable: trigger each element in the list")]
  19.         public Object whatToTrigger;
  20.         [Tooltip("If false, *deactivate* whatToTrigger instead")]
  21.         public bool activate = true;
  22.  
  23.         void Start () { AddTriggers (gameObject, whatToTrigger, kind, triggerTag, activate, delayInSeconds); }
  24.  
  25.         public void DoActivateTrigger (){ DoActivateTrigger (gameObject, whatToTrigger, gameObject, activate, delayInSeconds); }
  26.     }
  27.     [RequireComponent(typeof(Collider))]
  28.     public class TriggerBase : MonoBehaviour {
  29.  
  30.         public enum TKind {
  31.             scriptedOnly,
  32.             onTriggerEnter, onTriggerExit, onTriggerStay,
  33.             onCollisionEnter, onCollisionExit, onCollisionStay,
  34.             onControllerColliderHit,
  35.             onStart, onDestroy, onEnable, onDisable, onApplicationPause, onApplicationUnpause, onApplicationQuit,
  36.             onMouseEnter, onMouseOver, onMouseExit,
  37.             onMouseDown, onMouseDrag, onMouseUp, onMouseUpAsButton,
  38.             onBecameInvisible, onBecameVisible,
  39.             // TODO add: onVREnter (can be hands or head), onVRExit, onVRPress (can be any hand control button), onVRRelease, onVRPointStart, onVRPointStop, onVRSwipe
  40.         }
  41.         [Tooltip("What triggers the object above")]
  42.         public TKind kind = TKind.onTriggerEnter;
  43.         [Tooltip("For colliders, if not empty, only trigger if the triggering collider is tagged with this value")]
  44.         public string triggerTag;
  45.  
  46.         public static void DoActivateTrigger(object triggeringObject, object whatToTrigger, GameObject triggeredGameObject, bool activate, float delayInSeconds) {
  47.             if (delayInSeconds <= 0) {
  48.                 DoActivateTrigger (triggeringObject, whatToTrigger, triggeredGameObject, activate);
  49.             } else {
  50.                 NS.Timer.setTimeout (() => {
  51.                     DoActivateTrigger (triggeringObject, whatToTrigger, triggeredGameObject, activate);
  52.                 }, (long)(delayInSeconds * 1000));
  53.             }
  54.         }
  55.         public static void DoActivateTrigger(object triggeringObject, object whatToTrigger, GameObject triggeredGameObject, bool activate) {
  56.             if (whatToTrigger == null) { Debug.LogError ("Don't know how to trigger null"); return; }
  57.             System.Type type = whatToTrigger.GetType ();
  58.             if (typeof(System.Action).IsAssignableFrom (type)) {
  59.                 System.Action a = whatToTrigger as System.Action;
  60.                 a.Invoke ();
  61.             } else if (typeof(UnityEngine.Events.UnityEvent).IsAssignableFrom (type)) {
  62.                 UnityEngine.Events.UnityEvent a = whatToTrigger as UnityEngine.Events.UnityEvent;
  63.                 a.Invoke ();
  64.             } else if (type == typeof(Transform)) {
  65.                 Transform t = whatToTrigger as Transform;
  66.                 Transform toMove = triggeringObject as Transform;
  67.                 if (toMove == null) {
  68.                     GameObject go = triggeringObject as GameObject;
  69.                     if (go != null) {
  70.                         toMove = go.transform;
  71.                     }
  72.                 }
  73.                 if (toMove != null) {
  74.                     toMove.position = t.position;
  75.                 }
  76.             } else if (type == typeof(UnityEditor.SceneAsset)) {
  77.                 UnityEditor.SceneAsset scene = whatToTrigger as UnityEditor.SceneAsset;
  78.                 LoadLevel (scene.name, activate);
  79.             } else if (type == typeof(AudioClip) || type == typeof(AudioSource)) {
  80.                 AudioSource asource = null;
  81.                 if (type == typeof(AudioSource)) {
  82.                     asource = whatToTrigger as AudioSource;
  83.                 }
  84.                 if (asource == null) {
  85.                     asource = triggeredGameObject.AddComponent<AudioSource> ();
  86.                 }
  87.                 if (type == typeof(AudioClip)) {
  88.                     asource.clip = whatToTrigger as AudioClip;
  89.                 }
  90.                 if (activate) {
  91.                     asource.Play ();
  92.                 } else {
  93.                     asource.Stop ();
  94.                 }
  95.             } else if (type == typeof(ParticleSystem)) {
  96.                 ParticleSystem ps = whatToTrigger as ParticleSystem;
  97.                 if (activate) {
  98.                     Transform t = ps.transform;
  99.                     t.position = triggeredGameObject.transform.position;
  100.                     t.rotation = triggeredGameObject.transform.rotation;
  101.                     ParticleSystem.ShapeModule sm = ps.shape;
  102.                     if (sm.shapeType == ParticleSystemShapeType.Mesh) {
  103.                         sm.mesh = triggeredGameObject.GetComponent<MeshFilter> ().mesh;
  104.                         sm.scale = triggeredGameObject.transform.lossyScale;
  105.                     } else if (sm.shapeType == ParticleSystemShapeType.MeshRenderer) {
  106.                         sm.meshRenderer = triggeredGameObject.GetComponent<MeshRenderer> ();
  107.                     }
  108.                     ps.Play ();
  109.                 } else {
  110.                     ps.Stop ();
  111.                 }
  112.             } else if (type == typeof(GameObject)) {
  113.                 (whatToTrigger as GameObject).SetActive (activate);
  114.             } else if (type == typeof(UnityEngine.Material)) {
  115.                 RememberedOriginalMaterial r = triggeredGameObject.GetComponent<RememberedOriginalMaterial> ();
  116.                 if (activate) {
  117.                     Material m = whatToTrigger as Material;
  118.                     if (r == null) {
  119.                         r = triggeredGameObject.AddComponent<RememberedOriginalMaterial> ();
  120.                         r.oldMaterial = triggeredGameObject.GetComponent<Renderer> ().material;
  121.                         triggeredGameObject.GetComponent<Renderer> ().material = m;
  122.                     }
  123.                 } else {
  124.                     if (r != null) {
  125.                         triggeredGameObject.GetComponent<Renderer> ().material = r.oldMaterial;
  126.                         Destroy (r);
  127.                     }
  128.                 }
  129.             } else if (typeof(IEnumerable).IsAssignableFrom (type)) {
  130.                 IEnumerable ienum = whatToTrigger as IEnumerable;
  131.                 IEnumerator iter = ienum.GetEnumerator ();
  132.                 while (iter.MoveNext ()) {
  133.                     DoActivateTrigger (triggeringObject, iter.Current, triggeredGameObject, activate);
  134.                 }
  135.             } else if (type == typeof(Animation)) {
  136.                 if (activate) {
  137.                     (whatToTrigger as Animation).Play ();
  138.                 } else {
  139.                     (whatToTrigger as Animation).Stop();
  140.                 }
  141.             } else {
  142.                 System.Reflection.MethodInfo[] m = type.GetMethods ();
  143.                 bool invoked = false;
  144.                 for (int i = 0; i < m.Length; ++i) {
  145.                     if (m[i].Name == "DoActivateTrigger" && m[i].GetParameters().Length == 0) {
  146.                         m[i].Invoke (whatToTrigger, new object[]{ });
  147.                         invoked = true;
  148.                         break;
  149.                     }
  150.                 }
  151.                 if(!invoked) {
  152.                     Debug.LogError ("Don't know how to "+((activate)?"activate":"deactivate")+" a \'" + type + "\'");
  153.                 }
  154.             }
  155.         }
  156.         /// <summary>Loads or unloads the level.</summary>
  157.         /// <param name="sceneName">scene name.</param>
  158.         /// <param name="load">If set to <c>true</c> load (or unload current and reload), otherwise unload (if there are multiple levels)</param>
  159.         public static void LoadLevel(string sceneName, bool load = true) {
  160.             if (load) {
  161.                 int currentSceneIndex = -1;
  162.                 for (int i = 0; i < SceneManager.sceneCount; ++i) {
  163.                     if (SceneManager.GetSceneAt (i).name == sceneName) {
  164.                         currentSceneIndex = i; break;
  165.                     }
  166.                 }
  167.                 if (SceneManager.sceneCount > 1 && currentSceneIndex >= 0) {
  168.                     // if the scene is already loaded, unload it. then load it once it is unloaded
  169.                     AsyncOperation op = SceneManager.UnloadSceneAsync(sceneName);
  170.                     op.completed += (AsyncOperation o)=>{ SceneManager.LoadScene (sceneName, LoadSceneMode.Additive); };
  171.                 } else {
  172.                     SceneManager.LoadScene (sceneName);
  173.                 }
  174.             } else {
  175.                 SceneManager.UnloadSceneAsync (sceneName);
  176.             }
  177.         }
  178.         public class RememberedOriginalMaterial : MonoBehaviour { public Material oldMaterial; }
  179.  
  180.         private static void ColToTrig(GameObject g) {
  181.             Collider c = g.GetComponent<Collider> ();      if (c) { c.isTrigger = true; }
  182.             Collider2D c2 = g.GetComponent<Collider2D> (); if (c2) { c2.isTrigger = true; }
  183.         }
  184.  
  185.         public static void AddTriggers(GameObject g, object w, TKind kind, string triggerTag, bool a, float s) {
  186.             bool is2D = false;
  187.             switch(kind){
  188.             case TKind.onTriggerEnter: case TKind.onTriggerExit: case TKind.onTriggerStay:
  189.                 is2D = g.GetComponent<Collider2D> () != null;
  190.                 break;
  191.             }
  192.             switch (kind) {
  193.             case TKind.onTriggerEnter:if(is2D) AddTaggedTrigger<OnTriggerEnter2D_> (g,w,triggerTag,a,s);
  194.                                       else     AddTaggedTrigger<OnTriggerEnter_>   (g,w,triggerTag,a,s); ColToTrig (g); break;
  195.             case TKind.onTriggerExit: if(is2D) AddTaggedTrigger<OnTriggerExit2D_>  (g,w,triggerTag,a,s);
  196.                                       else     AddTaggedTrigger<OnTriggerExit_>    (g,w,triggerTag,a,s); ColToTrig (g); break;
  197.             case TKind.onTriggerStay: if(is2D) AddTaggedTrigger<OnTriggerStay2D_>  (g,w,triggerTag,a,s);
  198.                                       else     AddTaggedTrigger<OnTriggerStay_>    (g,w,triggerTag,a,s); ColToTrig (g); break;
  199.             case TKind.onCollisionEnter:if(is2D) AddTaggedTrigger<OnCollisionEnter2D_> (g,w,triggerTag,a,s);
  200.                                         else     AddTaggedTrigger<OnCollisionEnter_>   (g,w,triggerTag,a,s); ColToTrig (g); break;
  201.             case TKind.onCollisionExit: if(is2D) AddTaggedTrigger<OnCollisionExit2D_>  (g,w,triggerTag,a,s);
  202.                                         else     AddTaggedTrigger<OnCollisionExit_>    (g,w,triggerTag,a,s); ColToTrig (g); break;
  203.             case TKind.onCollisionStay: if(is2D) AddTaggedTrigger<OnCollisionStay2D_>  (g,w,triggerTag,a,s);
  204.                                         else     AddTaggedTrigger<OnCollisionStay_>    (g,w,triggerTag,a,s); ColToTrig (g); break;
  205.             case TKind.onControllerColliderHit:AddTaggedTrigger<OnControllerColliderHit_> (g,w,triggerTag,a,s); break;
  206.             case TKind.onStart:             AddTrigger<OnStart_>    (g,w,a,s); break;
  207.             case TKind.onDestroy:           AddTrigger<OnDestroy_>  (g,w,a,s); break;
  208.             case TKind.onEnable:            AddTrigger<OnEnable_>   (g,w,a,s); break;
  209.             case TKind.onDisable:           AddTrigger<OnDisable_>  (g,w,a,s); break;
  210.             case TKind.onApplicationPause:  AddTrigger<OnApplicationPause_>   (g,w,a,s); break;
  211.             case TKind.onApplicationUnpause:AddTrigger<OnApplicationUnpause_> (g,w,a,s); break;
  212.             case TKind.onApplicationQuit:   AddTrigger<OnApplicationQuit_>    (g,w,a,s); break;
  213.             case TKind.onMouseEnter:        AddTrigger<OnMouseEnter_>(g,w,a,s); break;
  214.             case TKind.onMouseOver:         AddTrigger<OnMouseOver_> (g,w,a,s); break;
  215.             case TKind.onMouseExit:         AddTrigger<OnMouseExit_> (g,w,a,s); break;
  216.             case TKind.onMouseDown:         AddTrigger<OnMouseDown_> (g,w,a,s); break;
  217.             case TKind.onMouseDrag:         AddTrigger<OnMouseDrag_> (g,w,a,s); break;
  218.             case TKind.onMouseUp:           AddTrigger<OnMouseUp_>   (g,w,a,s); break;
  219.             case TKind.onMouseUpAsButton:   AddTrigger<OnMouseUpAsButton_> (g,w,a,s); break;
  220.             case TKind.onBecameInvisible:   AddTrigger<OnBecameInvisible_> (g,w,a,s); break;
  221.             case TKind.onBecameVisible:     AddTrigger<OnBecameVisible_> (g,w,a,s); break;
  222.             }
  223.         }
  224.  
  225.         public class _TriggerBase : MonoBehaviour {
  226.             public object whatToTrigger;
  227.             public float delayInSeconds = 0;
  228.             public bool activate = true;
  229.             public void DoActivateTrigger () {
  230.                 Trigger.DoActivateTrigger (gameObject, whatToTrigger, gameObject, activate, delayInSeconds);
  231.             }
  232.             public void DoTriggerMouse() { Trigger.DoActivateTrigger (Input.mousePosition, whatToTrigger, gameObject, activate); }
  233.         }
  234.         private static void AddTrigger<T>(GameObject gameObject, object whatToTrigger, bool activate, float s) where T : _TriggerBase {
  235.             T t = gameObject.AddComponent<T> ();
  236.             t.whatToTrigger = whatToTrigger;
  237.             t.activate = activate;
  238.             t.delayInSeconds = s;
  239.         }
  240.  
  241.         public class OnStart_ : _TriggerBase { void Start() { DoActivateTrigger(); }}
  242.         public class OnDestroy_ : _TriggerBase { void OnDestroy() { DoActivateTrigger(); }}
  243.         public class OnEnable_ : _TriggerBase { void OnEnable() { DoActivateTrigger(); }}
  244.         public class OnDisable_ : _TriggerBase { void OnDisable() { DoActivateTrigger(); }}
  245.         public class OnBecameInvisible_ : _TriggerBase { void OnBecameInvisible() { DoActivateTrigger(); }}
  246.         public class OnBecameVisible_ : _TriggerBase { void OnBecameVisible() { DoActivateTrigger(); }}
  247.         public class OnMouseEnter_ : _TriggerBase { void OnMouseEnter() { DoTriggerMouse (); }}
  248.         public class OnMouseOver_ : _TriggerBase { void OnMouseOver() { DoTriggerMouse (); }}
  249.         public class OnMouseExit_ : _TriggerBase { void OnMouseExit() { DoTriggerMouse (); }}
  250.         public class OnMouseDown_ : _TriggerBase { void OnMouseDown() { DoTriggerMouse (); }}
  251.         public class OnMouseDrag_ : _TriggerBase { void OnMouseDrag() { DoTriggerMouse (); }}
  252.         public class OnMouseUp_ : _TriggerBase { void OnMouseUp() { DoTriggerMouse (); }}
  253.         public class OnMouseUpAsButton_ : _TriggerBase { void OnMouseMouseUpAsButton() { DoTriggerMouse (); }}
  254.  
  255.         public delegate void BooleanAction(bool b);
  256.         public static void EquateUnityEditorPauseWithApplicationPause(BooleanAction b) {
  257.             #if UNITY_EDITOR
  258.             // This method is run whenever the playmode state is changed.
  259.             UnityEditor.EditorApplication.pauseStateChanged += (UnityEditor.PauseState ps) => {
  260.                 b(ps == UnityEditor.PauseState.Paused);
  261.             };
  262.             #endif
  263.         }
  264.         public class OnApplicationPause_ : _TriggerBase { void OnApplicationPause(bool pauseStatus) {
  265.             if (pauseStatus == true) { DoActivateTrigger (); }
  266.         } void Start() { EquateUnityEditorPauseWithApplicationPause (OnApplicationPause); }}
  267.         public class OnApplicationUnpause_ : _TriggerBase { void OnApplicationPause(bool pauseStatus) {
  268.             if (pauseStatus == false) { DoActivateTrigger (); }
  269.         } void Start() { EquateUnityEditorPauseWithApplicationPause (OnApplicationPause); }}
  270.  
  271.         public class OnApplicationQuit_ : _TriggerBase { void OnApplicationQuit() { DoActivateTrigger(); }}
  272.         //onTriggerEnter, onTriggerExit, onTriggerStay,
  273.         public class _TriggerAreaBase : _TriggerBase {
  274.             public string triggerTag;
  275.             public bool IsTriggeringObject(GameObject o){ return triggerTag == "" || o.tag == triggerTag || o.tag == ""; }
  276.             public void DoActivateTrigger (GameObject tobj) {
  277.                 if (IsTriggeringObject(tobj)) {
  278.                     Trigger.DoActivateTrigger (tobj, whatToTrigger, gameObject, activate, delayInSeconds); }
  279.             }
  280.         }
  281.         private static void AddTaggedTrigger<T>(GameObject gameObject, object whatToTrigger, string triggerTag, bool activate, float s) where T : _TriggerAreaBase {
  282.             T t = gameObject.AddComponent<T> ();
  283.             t.whatToTrigger = whatToTrigger;
  284.             t.triggerTag = triggerTag;
  285.             t.activate = activate;
  286.             t.delayInSeconds = s;
  287.         }
  288.  
  289.         public class OnTriggerEnter_ : _TriggerAreaBase { void OnTriggerEnter (Collider col) { DoActivateTrigger (col.gameObject); }}
  290.         public class OnTriggerExit_ : _TriggerAreaBase { void OnTriggerExit (Collider col) { DoActivateTrigger (col.gameObject); }}
  291.         public class OnTriggerStay_ : _TriggerAreaBase { void OnTriggerStay (Collider col) { DoActivateTrigger (col.gameObject); }}
  292.         public class OnTriggerEnter2D_ : _TriggerAreaBase { void OnTriggerEnter2D (Collider2D col) { DoActivateTrigger (col.gameObject); }}
  293.         public class OnTriggerExit2D_ : _TriggerAreaBase { void OnTriggerExit2D (Collider2D col) { DoActivateTrigger (col.gameObject); }}
  294.         public class OnTriggerStay2D_ : _TriggerAreaBase { void OnTriggerStay2D (Collider2D col) { DoActivateTrigger (col.gameObject); }}
  295.         public class OnCollisionEnter_ : _TriggerAreaBase { void OnCollisionEnter (Collider col) { DoActivateTrigger (col.gameObject); }}
  296.         public class OnCollisionExit_ : _TriggerAreaBase { void OnCollisionExit (Collider col) { DoActivateTrigger (col.gameObject); }}
  297.         public class OnCollisionStay_ : _TriggerAreaBase { void OnCollisionStay (Collider col) { DoActivateTrigger (col.gameObject); }}
  298.         public class OnCollisionEnter2D_ : _TriggerAreaBase { void OnCollisionEnter2D (Collider2D col) { DoActivateTrigger (col.gameObject); }}
  299.         public class OnCollisionExit2D_ : _TriggerAreaBase { void OnCollisionExit2D (Collider2D col) { DoActivateTrigger (col.gameObject); }}
  300.         public class OnCollisionStay2D_ : _TriggerAreaBase { void OnCollisionStay2D (Collider2D col) { DoActivateTrigger (col.gameObject); }}
  301.         public class OnControllerColliderHit_ : _TriggerAreaBase { void OnControllerColliderHit(CharacterController col) { DoActivateTrigger (col.gameObject); }}
  302.     }
  303. }
Advertisement
Add Comment
Please, Sign In to add comment