juwambo

PlayFromHereInitData.cs

Dec 20th, 2018
681
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.92 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEditor;
  3.  
  4. [CreateAssetMenu(fileName = "PlayFromHereData")]
  5. public class PlayFromHereInitData : ScriptableObject
  6. {
  7.     public GameObject[] m_arOriginPrefabs;
  8.     public GameObject[] m_arPositionPrefabs;
  9.     public LayerMask m_layerMask = ~0;
  10.  
  11.     public void SpawnMissingObjects(Vector3 _v3Position)
  12.     {
  13.         for (int i = 0; i < m_arOriginPrefabs.Length; i++)
  14.         {
  15.             if(m_arOriginPrefabs[i] != null)
  16.             {
  17.                 if (GameObject.Find(m_arOriginPrefabs[i].name) == null)
  18.                 {
  19.                     Instantiate(m_arOriginPrefabs[i]);
  20.  
  21.                 }
  22.             }
  23.         }
  24.  
  25.         for (int i = 0; i < m_arPositionPrefabs.Length; i++)
  26.         {
  27.             if (m_arPositionPrefabs[i] != null)
  28.             {
  29.                 GameObject goInScene = GameObject.Find(m_arPositionPrefabs[i].name);
  30.                 if (goInScene == null)
  31.                 {
  32.                     Instantiate(m_arPositionPrefabs[i], _v3Position, Quaternion.identity);
  33.                 }
  34.                 else
  35.                 {
  36.                     goInScene.transform.position = _v3Position;
  37.                 }
  38.             }
  39.         }
  40.     }
  41. }
  42.  
  43. [InitializeOnLoad]
  44. public class PlayFromHere
  45. {
  46.     private const string c_strPlayFromHereObjectPath = "Assets/ScriptableObjects/Editor/PlayFromHereData.asset";
  47.  
  48.     private static double s_startClickTime;
  49.     private static GameObject s_goHackObject;
  50.     private static Vector3 s_v3Position;
  51.  
  52.     private static PlayFromHereInitData s_initDataObject;
  53.  
  54.     private const string c_strHackName = "Play From Here Hack Object";
  55.  
  56.     static PlayFromHere()
  57.     {
  58.         SceneView.onSceneGUIDelegate -= OnSceneGUI;
  59.         SceneView.onSceneGUIDelegate += OnSceneGUI;
  60.  
  61.         s_goHackObject = GameObject.Find(c_strHackName);
  62.         if (s_goHackObject != null)
  63.         {
  64.             EditorApplication.playModeStateChanged -= OnPlayModeChanged;
  65.             EditorApplication.playModeStateChanged += OnPlayModeChanged;
  66.         }
  67.     }
  68.  
  69.     private static void OnPlayModeChanged(PlayModeStateChange _eStateChange)
  70.     {
  71.         switch (_eStateChange)
  72.         {
  73.             case PlayModeStateChange.EnteredEditMode:
  74.                 //If we are coming back from PlayMode which was started via PlayFromHere, we delete the helper game object
  75.                 if (s_goHackObject != null)
  76.                 {
  77.                     GameObject.DestroyImmediate(s_goHackObject);
  78.                 }
  79.                 break;
  80.             case PlayModeStateChange.ExitingEditMode:
  81.                 break;
  82.             case PlayModeStateChange.EnteredPlayMode:
  83.                 //If we entered PlayMode and a Helper Object exists, we should use its position to initialize the PlayFromHere-Objects
  84.                 if (s_goHackObject != null)
  85.                 {
  86.                     RefreshPlayFromHereDataObject();
  87.  
  88.                     if (s_initDataObject != null)
  89.                     {
  90.                         s_initDataObject.SpawnMissingObjects(s_goHackObject.transform.position);
  91.                     }
  92.                 }
  93.                 break;
  94.             case PlayModeStateChange.ExitingPlayMode:
  95.                 break;
  96.             default:
  97.                 break;
  98.         }
  99.     }
  100.  
  101.     private static void RefreshPlayFromHereDataObject()
  102.     {
  103.         if (s_initDataObject == null)
  104.         {
  105.             s_initDataObject = AssetDatabase.LoadAssetAtPath<PlayFromHereInitData>(c_strPlayFromHereObjectPath);
  106.         }
  107.     }
  108.  
  109.     private static void OnSceneGUI(SceneView sceneView)
  110.     {
  111.         //Check for right mouse button
  112.         if (Event.current.isMouse && Event.current.button == 1  && !EditorApplication.isPlaying)
  113.         {
  114.             if (Event.current.type == EventType.MouseDown)
  115.             {
  116.                 //Save time of mouse down Event to later check for click duration
  117.                 s_startClickTime = EditorApplication.timeSinceStartup;
  118.             }
  119.             else if (Event.current.type == EventType.MouseUp)
  120.             {
  121.                 //Check time since mouse down and open menu for short click
  122.                 if (EditorApplication.timeSinceStartup - s_startClickTime < .25f)
  123.                 {
  124.                     Camera camera = sceneView.camera;
  125.                     Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
  126.                     RaycastHit rayhit;
  127.  
  128.                     //Default layermask is "Everything"
  129.                     LayerMask layerMask = ~0;
  130.  
  131.                     //Try to get layermask from DataObject
  132.                     RefreshPlayFromHereDataObject();
  133.                     if (s_initDataObject != null)
  134.                     {
  135.                         layerMask = s_initDataObject.m_layerMask;
  136.                     }
  137.  
  138.                     //Get world position for click
  139.                     if (Physics.Raycast(ray, out rayhit, float.MaxValue, layerMask, QueryTriggerInteraction.Ignore))
  140.                     {
  141.                         s_v3Position = rayhit.point + Vector3.up * .1f;
  142.  
  143.                         //Show confirmation window
  144.                         GenericMenu menu = new GenericMenu();
  145.                         menu.AddItem(new GUIContent("Play From Here"), false, OnConfirmPlayFromHere);
  146.  
  147.                         menu.ShowAsContext();
  148.  
  149.                         Event.current.Use();
  150.                     }
  151.                 }
  152.             }
  153.         }
  154.     }
  155.  
  156.     private static void OnConfirmPlayFromHere()
  157.     {
  158.         //Start PlayMode
  159.         EditorApplication.isPlaying = true;
  160.  
  161.         //Unity reinitializes all scripts when starting PlayMode so we can't save any variables regularly
  162.         //Create a GameObject with "DontSave"-Flag to "save" Position for start of PlayMode
  163.         GameObject goPlayFromHere = new GameObject(c_strHackName);
  164.         goPlayFromHere.transform.position = s_v3Position;
  165.         goPlayFromHere.hideFlags = HideFlags.DontSave;
  166.     }
  167. }
Add Comment
Please, Sign In to add comment