using System; using System.Collections.Generic; using BitStrap; using LE_LevelEditor.Commands; using LE_LevelEditor.Core; using LE_LevelEditor.Events; using LE_LevelEditor.Logic; using S_SnapTools; using UndoRedo; using UnityEngine; namespace LE_LevelEditor.UI { public class LE_GUI3dObject : LE_GUI3dBase { private const float MIN_FOCUS_DISTANCE = 3f; private const float SELECTION_MAX_OVERSIZE = 10f; [ReadOnly] public LE_Object m_object; private string m_objectResourcePath; [ReadOnly] public bool m_isObjectPlaceable; [ReadOnly] public bool m_isSceneInstanceFound; private string m_dragMessage = string.Empty; [ReadOnly] public LE_Object m_previewInstance; [ReadOnly] public LE_Object m_selectedObject; private LE_Object m_cursorActionOnObject; private bool m_isSelectionPossible; private bool m_isCursorAction; private bool m_isCursorActionInThisFrame; private Vector3 m_lastCursorActionStartPos = -100f * Vector3.one; private Dictionary m_snapPointUIDsToSnapPoints = new Dictionary(); private Dictionary m_snapPointUIDsToObjUIDs = new Dictionary(); private int m_snapPointUIDToSnapPointsInvalidatedFrame = -1; private bool m_isSnapToObjectActive = true; public int TERRAIN_LAYER = 28; public Action OnFocused; private LE_EObjectEditSpace m_objectEditSpace; private LE_EObjectEditMode m_objectEditMode; private bool m_isKeyComboDuplicate = true; private bool m_isKeyComboFocus = true; private bool m_isKeyComboDelete = true; public LE_Object SelectedPrefab { get { return m_object; } } public bool IsSceneInstanceFound { get { return m_isSceneInstanceFound; } } public LE_Object SelectedObject { get { return m_selectedObject; } } public bool IsSelectedObjectSmartMoved { get { return m_selectedObject != null && m_selectedObject.EditHandle != null && m_selectedObject.EditHandle.EditMode == LE_EObjectEditMode.SMART && m_selectedObject.EditHandle.IsDrag; } } public Dictionary SnapPointUIDsToObjUIDs { get { return m_snapPointUIDsToObjUIDs; } } public bool IsSnapToObjectActive { get { return m_isSnapToObjectActive; } } public override LE_EEditMode ActiveEditMode { get { return LE_EEditMode.OBJECT; } } public LE_EObjectEditSpace ObjectEditSpace { get { return m_objectEditSpace; } set { m_objectEditSpace = value; } } public LE_EObjectEditMode ObjectEditMode { get { return m_objectEditMode; } set { m_objectEditMode = value; } } public bool IsKeyComboDuplicate { get { return m_isKeyComboDuplicate; } set { m_isKeyComboDuplicate = value; } } public bool IsKeyComboFocus { get { return m_isKeyComboFocus; } set { m_isKeyComboFocus = value; } } public bool IsKeyComboDelete { get { return m_isKeyComboDelete; } set { m_isKeyComboDelete = value; } } public override void SetCursorPosition(Vector3 p_cursorScreenCoords) { if (m_object != null && (m_object.SnapType == LE_Object.ESnapType.SNAP_TO_TERRAIN || m_object.SnapType == LE_Object.ESnapType.SNAP_TO_2D_GRID_AND_TERRAIN)) { m_cursorScreenCoords = p_cursorScreenCoords; m_cursorRay = Camera.main.ScreenPointToRay(p_cursorScreenCoords); SetIsCursorOverSomething(Physics.Raycast(m_cursorRay, out m_cursorHitInfo, float.MaxValue, 1 << TERRAIN_LAYER)); return; } if (IsSelectedObjectSmartMoved) { int layer = LayerMask.NameToLayer("Ignore Raycast"); Dictionary dictionary = new Dictionary(); MoveToLayer(m_selectedObject.transform, layer, dictionary); base.SetCursorPosition(p_cursorScreenCoords); { foreach (KeyValuePair item in dictionary) { if (item.Key != null) { item.Key.layer = item.Value; } } return; } } base.SetCursorPosition(p_cursorScreenCoords); } public override void SetIsCursorAction(bool p_isCursorAction) { if (base.IsInteractable) { m_isCursorActionInThisFrame |= p_isCursorAction; } } public void SetDraggableObject(LE_Object p_object, string p_objectResourcePath) { if (m_object != p_object) { m_isSceneInstanceFound = false; m_dragMessage = string.Empty; SetDragMessageInUI(); m_object = p_object; m_objectResourcePath = p_objectResourcePath; m_isObjectPlaceable = IsObjectPlaceable(); } } public void SelectObject(LE_Object p_object) { LE_Object p_priorSelectedObject = null; if (m_selectedObject != null && m_selectedObject != p_object) { m_selectedObject.EditMode = LE_EObjectEditMode.NO_EDIT; m_selectedObject.IsSelected = false; p_priorSelectedObject = m_selectedObject; } if (LE_LevelEditorMain.Instance != null && LE_LevelEditorMain.Instance.EditMode != LE_EEditMode.OBJECT) { p_object = null; } m_selectedObject = p_object; if (m_selectedObject != null) { m_selectedObject.IsSelected = true; } if (LE_EventInterface.OnObjectSelectedInScene != null) { LE_EventInterface.OnObjectSelectedInScene(this, new LE_ObjectSelectedEvent(m_selectedObject, p_priorSelectedObject)); } if ((bool)p_object && (bool)p_object.GetComponent()) { FisheryEditor.Instance.ShowFishSpeciesWindow(p_object); } else { FisheryEditor.Instance.ShowFishSpeciesWindow(null); } } public void Focus() { if (!(m_selectedObject != null)) { return; } Renderer[] componentsInChildren = m_selectedObject.GetComponentsInChildren(); Vector3 vector = Vector3.zero; Vector3 vector2 = Vector3.zero; float num = 0f; Renderer[] array = componentsInChildren; foreach (Renderer renderer in array) { if (renderer.GetComponentInParent() == null) { vector += renderer.bounds.center; vector2 += renderer.bounds.size; num += 1f; } } if (num != 0f) { vector *= 1f / num; vector2 *= 1f / num; } else { vector = m_selectedObject.transform.position; vector2 = Vector3.one * 3f; } Vector3 vector3 = Camera.main.transform.position - vector; float num2 = Mathf.Max(vector2.x, vector2.y, vector2.z) * 3f; Camera.main.transform.position = vector + vector3.normalized * num2; if (Camera.main.transform.position.y < vector.y) { Vector3 position = Camera.main.transform.position; position.y = vector.y; Camera.main.transform.position = position; } Camera.main.transform.LookAt(vector, Vector3.up); if (OnFocused != null) { OnFocused(vector, num2); } } public void SelectNFocusPrefabInstanceInScene() { bool flag = m_selectedObject != null && m_object != null && m_selectedObject.name == m_objectResourcePath; LE_Object lE_Object = null; LE_Object[] array = UnityEngine.Object.FindObjectsOfType(); for (int i = 0; i < array.Length; i++) { if (array[i].name == m_objectResourcePath) { if (!flag) { SelectObject(array[i]); Focus(); return; } if (lE_Object == null) { lE_Object = array[i]; } if (m_selectedObject == array[i]) { flag = false; } } } if (lE_Object != null) { SelectObject(lE_Object); Focus(); } } public void Delete() { if (m_selectedObject != null) { UR_CommandMgr.Instance.Execute(new LE_CmdDeleteObject(this, m_selectedObject)); FisheryEditor.Instance.ShowFishSpeciesWindow(null); SelectObject(null); m_object = null; m_previewInstance = null; } } public void RemoveSelection() { SelectObject(null); } public void CloneObject() { string text = m_selectedObject.name; if (m_selectedObject != null && IsObjectPlaceable(m_selectedObject, text)) { m_selectedObject.EditMode = LE_EObjectEditMode.NO_EDIT; m_selectedObject.IsSelected = false; m_selectedObject.ApplySelectionState(); UR_CommandMgr.Instance.Execute(new LE_CmdCloneObject(this, m_selectedObject.UID, m_selectedObject.transform, text)); } } public bool IsObjectPlaceable(LE_Object p_object, string p_resourcePath) { m_isSceneInstanceFound = false; if (p_object.MaxInstancesInLevel != 0) { int num = 0; LE_Object[] array = UnityEngine.Object.FindObjectsOfType(); for (int i = 0; i < array.Length; i++) { if (array[i].name == p_resourcePath) { m_isSceneInstanceFound = true; num++; if (p_object.MaxInstancesInLevel <= num) { return false; } } } if (p_object.gameObject.HasTag("ICE_EDITOR") && (bool)FisheryEditor.Instance.GetIceOnLevel(p_object)) { m_isSceneInstanceFound = true; return false; } } else { m_isSceneInstanceFound = GameObject.Find(m_objectResourcePath); } return true; } public void UpdateIsObjectPlaceable() { m_isObjectPlaceable = IsObjectPlaceable(); } public void SetSnapPointUIDsToObjUIDs(Dictionary p_snapPointUIDsToObjUIDs) { foreach (KeyValuePair p_snapPointUIDsToObjUID in p_snapPointUIDsToObjUIDs) { if (!m_snapPointUIDsToObjUIDs.ContainsKey(p_snapPointUIDsToObjUID.Key)) { m_snapPointUIDsToObjUIDs.Add(p_snapPointUIDsToObjUID.Key, p_snapPointUIDsToObjUID.Value); continue; } Debug.LogError("LE_GUI3dObject: SetSnapPointUIDsToObjUIDs: snap point with UID '" + p_snapPointUIDsToObjUID.Key + "' is already snapped to object with UID '" + m_snapPointUIDsToObjUIDs[p_snapPointUIDsToObjUID.Key] + "'! This call tried to snap it to object with UID '" + p_snapPointUIDsToObjUID.Value + "'"); } } public void SetSnapPointUIDsToObjUIDsAndApplyChanges(Dictionary p_snapPointUIDsToObjUIDs) { SetSnapPointUIDsToObjUIDs(p_snapPointUIDsToObjUIDs); foreach (string key in p_snapPointUIDsToObjUIDs.Keys) { S_SnapToObject value; if (m_snapPointUIDsToSnapPoints.TryGetValue(key, out value)) { if (value.SnapCounter == 0) { value.IncSnapCounter(); } else { Debug.LogWarning("LE_GUI3dObject: SetSnapPointUIDsToObjUIDsAndApplyChanges: snap point with UID '" + key + "' already was snapped!"); } } } } public void AddSnapPoint(string p_snapPointUID, S_SnapToObject p_snapInstance) { if (!m_snapPointUIDsToSnapPoints.ContainsKey(p_snapPointUID)) { m_snapPointUIDsToSnapPoints.Add(p_snapPointUID, p_snapInstance); } else { Debug.LogError("LE_GUI3dObject: AddSnapPoint: a snap point instance with the UID '" + p_snapPointUID + "' already exists!"); } } public void LoadSnapCounter(string snapPointUID, S_SnapToObject snapInstance) { if (m_snapPointUIDsToObjUIDs.ContainsKey(snapPointUID)) { snapInstance.IncSnapCounter(); } } public List> GetSnapPointsToReactivate(int p_deletedObjectUID, int p_deletedObjectSnapPointCount) { List> list = new List>(); for (int i = 0; i < p_deletedObjectSnapPointCount; i++) { string snapPointUID = LE_LogicObjects.GetSnapPointUID(p_deletedObjectUID, i); if (m_snapPointUIDsToObjUIDs.ContainsKey(snapPointUID)) { list.Add(new KeyValuePair(snapPointUID, m_snapPointUIDsToObjUIDs[snapPointUID])); } } foreach (KeyValuePair snapPointUIDsToObjUID in m_snapPointUIDsToObjUIDs) { if (snapPointUIDsToObjUID.Value == p_deletedObjectUID) { list.Add(new KeyValuePair(snapPointUIDsToObjUID.Key, p_deletedObjectUID)); } } return list; } public void ReactivateSnapPoints(int p_deletedObjectUID, int p_deletedObjectSnapPointCount) { List> snapPointsToReactivate = GetSnapPointsToReactivate(p_deletedObjectUID, p_deletedObjectSnapPointCount); foreach (KeyValuePair item in snapPointsToReactivate) { if (m_snapPointUIDsToSnapPoints.ContainsKey(item.Key)) { m_snapPointUIDsToSnapPoints[item.Key].DecSnapCounter(); } m_snapPointUIDsToObjUIDs.Remove(item.Key); } m_snapPointUIDToSnapPointsInvalidatedFrame = Time.frameCount; } public void MarkSnapPointAsUsed(LE_Object p_sourceObj, LE_Object p_destinationObj, S_SnapToObject p_snapScript) { if (p_sourceObj != null) { int snapPointIndex = GetSnapPointIndex(p_sourceObj, p_snapScript); MarkSnapPointAsUsed(p_sourceObj, p_destinationObj, snapPointIndex); } else { Debug.LogError("LE_GUI3dObject: MarkSnapPointAsUsed: could not find LE_Object of snap source!"); } } public void MarkSnapPointAsUsed(LE_Object p_sourceObj, LE_Object p_destinationObj, int snapPointIndex) { if (p_sourceObj != null) { if (snapPointIndex != -1) { string text = p_sourceObj.UID + "_" + snapPointIndex; if (!m_snapPointUIDsToObjUIDs.ContainsKey(text)) { m_snapPointUIDsToObjUIDs.Add(text, p_destinationObj.UID); return; } Debug.LogError("LE_GUI3dObject: MarkSnapPointAsUsed: duplicate snapping on snapPointUID(" + text + ") new (ignored) objID(" + p_destinationObj.UID + ") and old objID(" + m_snapPointUIDsToObjUIDs[text] + ")"); } else { Debug.LogError("LE_GUI3dObject: MarkSnapPointAsUsed: could not find LE_ObjectSnapPoint of snap source!"); } } else { Debug.LogError("LE_GUI3dObject: MarkSnapPointAsUsed: could not find LE_Object of snap source!"); } } public void ClearLevelData() { m_snapPointUIDsToSnapPoints.Clear(); m_snapPointUIDsToObjUIDs.Clear(); m_isSnapToObjectActive = true; } private void Start() { if (LE_GUIInterface.Instance.delegates.IsObjectDragged == null) { Debug.LogError("LE_GUI3dObject: you must provide the LE_GUIInterface.delegates.IsObjectDragged to make the object drag&drop working!"); } if (LE_GUIInterface.Instance.delegates.SetDraggableObjectMessage == null) { Debug.LogWarning("LE_GUI3dObject: LE_GUIInterface.delegates.SetDraggableObjectMessage is not set. Set it if you want to visualize the 'max. # reached!' message or messages generated via LE_ObjectDragEvent."); } if (LE_GUIInterface.Instance.delegates.SetDraggableObjectState == null) { Debug.LogWarning("LE_GUI3dObject: LE_GUIInterface.delegates.SetDraggableObjectState is not set. Set it if you want to hide your UI when a 3d preview is shown or show different UI if the object is not placeable."); } S_SnapToObject.OnGlobalBeforeObjectSnapped = (EventHandler)Delegate.Combine(S_SnapToObject.OnGlobalBeforeObjectSnapped, new EventHandler(OnBeforeObjectSnapped)); S_SnapToObject.OnGlobalPreviewObjectInstantiated = (EventHandler)Delegate.Combine(S_SnapToObject.OnGlobalPreviewObjectInstantiated, new EventHandler(OnPreviewObjectInstantiated)); } private void OnDestroy() { S_SnapToObject.OnGlobalBeforeObjectSnapped = (EventHandler)Delegate.Remove(S_SnapToObject.OnGlobalBeforeObjectSnapped, new EventHandler(OnBeforeObjectSnapped)); S_SnapToObject.OnGlobalPreviewObjectInstantiated = (EventHandler)Delegate.Remove(S_SnapToObject.OnGlobalPreviewObjectInstantiated, new EventHandler(OnPreviewObjectInstantiated)); } private void OnPreviewObjectInstantiated(object p_sender, S_SnapToObjectEventArgs p_args) { LE_Object component = p_args.NewInstance.GetComponent(); if (component != null) { UnityEngine.Object.Destroy(component); } } private void OnBeforeObjectSnapped(object p_sender, S_SnapToObjectBeforePlacementEventArgs p_args) { p_args.IsDelayedPlacePrefab = true; LE_Object componentInParent = p_args.Source.GetComponentInParent(); int snapPointIndex = GetSnapPointIndex(componentInParent, p_args.Source); if (snapPointIndex >= 0) { UR_CommandMgr.Instance.Execute(new LE_CmdSnapObjectToObject(this, componentInParent.UID, snapPointIndex, p_args.SnapPrefab)); } } private int GetSnapPointIndex(LE_Object p_obj, S_SnapToObject p_snapScript) { if (p_obj != null) { for (int i = 0; i < p_obj.ObjectSnapPoints.Length; i++) { if (p_obj.ObjectSnapPoints[i].SnapSystemInstance == p_snapScript) { return i; } } Debug.LogError("LE_GUI3dObject: GetSnapPointIndex: p_snapScript is not a SnapSystemInstance of p_obj!"); return -1; } Debug.LogError("LE_GUI3dObject: GetSnapPointIndex: p_obj is null!"); return -1; } private bool IsObjectPlaceable() { if (m_object != null) { if (!IsObjectPlaceable(m_object, m_objectResourcePath)) { m_dragMessage = "max. # reached!"; SetDragMessageInUI(); return false; } m_dragMessage = string.Empty; SetDragMessageInUI(); return true; } m_isSceneInstanceFound = false; return false; } private void Update() { UpdateObjectSelection(); UpdateNewObjectDragAndDrop(); UpdateSmartMove(); UpdateSnapToObjectInstances(); if (FisheryEditor.Instance.allowKeyboardInput) { if (m_isKeyComboFocus && Input.GetKeyDown(KeyCode.F)) { Focus(); } if (m_isKeyComboDelete && Input.GetKeyDown(KeyCode.Delete)) { Delete(); } } m_isCursorActionInThisFrame = false; } private void OnGUI() { if (FisheryEditor.Instance.allowKeyboardInput && m_isKeyComboDuplicate) { Event current = Event.current; if (current.type == EventType.KeyUp && current.control && current.keyCode == KeyCode.D) { CloneObject(); } } } private void UpdateObjectSelection() { bool isCursorOverSomething = base.IsCursorOverSomething; if (m_previewInstance == null && !IsObjectDraggedInUI()) { if (!base.IsInteractable) { m_isCursorAction = isCursorOverSomething; m_isSelectionPossible = false; } else if (!m_isCursorAction && m_isCursorActionInThisFrame) { if (isCursorOverSomething) { m_cursorActionOnObject = m_cursorHitInfo.collider.GetComponentInParent(); } else { m_cursorActionOnObject = null; } m_lastCursorActionStartPos = m_cursorScreenCoords; m_isSelectionPossible = true; m_isCursorAction = true; } else if (m_isCursorAction && m_isCursorActionInThisFrame) { if ((!isCursorOverSomething && m_cursorActionOnObject != null) || (isCursorOverSomething && m_cursorActionOnObject != m_cursorHitInfo.collider.GetComponentInParent()) || (double)(m_lastCursorActionStartPos - m_cursorScreenCoords).magnitude > (double)Screen.height * 0.025) { m_isSelectionPossible = false; m_cursorActionOnObject = null; } } else if (m_isCursorAction && !m_isCursorActionInThisFrame) { if (m_isSelectionPossible) { if (m_cursorActionOnObject == null) { m_cursorActionOnObject = TrySelectByOversizedBoundingVolume(); } SelectObject(m_cursorActionOnObject); } m_isSelectionPossible = false; m_cursorActionOnObject = null; m_isCursorAction = false; } else { m_cursorActionOnObject = null; m_isCursorAction = false; } } if (m_selectedObject != null) { m_selectedObject.EditSpace = m_objectEditSpace; m_selectedObject.EditMode = m_objectEditMode; } } private void UpdateNewObjectDragAndDrop() { FisheryEditor.Instance.fakeDragCollisionObject.SetActive(Input.GetKey(KeyCode.Mouse0) && m_object != null && m_objectResourcePath != null && IsObjectDraggedInUI()); Vector3 position = FisheryEditor.Instance.fakeDragCollisionObject.transform.position; position.y = Camera.main.transform.position.y - 3f; if (position.y > FisheryEditor.Instance.waterObject.transform.position.y - 1f) { position.y = FisheryEditor.Instance.waterObject.transform.position.y - 1f; } FisheryEditor.Instance.fakeDragCollisionObject.transform.position = position; if (!(m_object != null) || m_objectResourcePath == null) { return; } SetDragMessageInUI(); if (!base.IsInteractable) { if (m_previewInstance != null) { UnityEngine.Object.Destroy(m_previewInstance.gameObject); } } else if (base.IsCursorOverSomething) { if (IsObjectDraggedInUI()) { if (OnObjectDrag() && ((m_object.SnapType != LE_Object.ESnapType.SNAP_TO_TERRAIN && m_object.SnapType != LE_Object.ESnapType.SNAP_TO_2D_GRID_AND_TERRAIN) || (m_cursorHitInfo.collider != null && m_cursorHitInfo.collider.gameObject.layer == TERRAIN_LAYER))) { if (m_previewInstance == null) { m_previewInstance = UnityEngine.Object.Instantiate(m_object); m_previewInstance.name = "LE_GUI3dObject Preview Instance"; MoveToLayer(m_previewInstance.transform, LayerMask.NameToLayer("Ignore Raycast")); Rigidbody[] componentsInChildren = m_previewInstance.GetComponentsInChildren(); for (int i = 0; i < componentsInChildren.Length; i++) { UnityEngine.Object.Destroy(componentsInChildren[i]); } if (m_previewInstance.SnapType == LE_Object.ESnapType.SNAP_TO_3D_GRID || m_previewInstance.SnapType == LE_Object.ESnapType.SNAP_TO_2D_GRID_AND_TERRAIN) { LE_LogicObjects.AddGridSnapping(this, m_previewInstance, true); } } SmartMove(m_previewInstance); } } else if (m_isObjectPlaceable) { PlaceObject(); } else if (m_previewInstance != null) { UnityEngine.Object.Destroy(m_previewInstance.gameObject); } } else if (m_previewInstance != null) { UnityEngine.Object.Destroy(m_previewInstance.gameObject); } if (LE_GUIInterface.Instance.delegates.SetDraggableObjectState != null) { if (!base.IsInteractable || !IsObjectDraggedInUI()) { LE_GUIInterface.Instance.delegates.SetDraggableObjectState(LE_GUIInterface.Delegates.EDraggedObjectState.NONE); } else if (m_previewInstance != null) { LE_GUIInterface.Instance.delegates.SetDraggableObjectState(LE_GUIInterface.Delegates.EDraggedObjectState.IN_3D_PREVIEW); } else { LE_GUIInterface.Instance.delegates.SetDraggableObjectState(LE_GUIInterface.Delegates.EDraggedObjectState.NOT_PLACEABLE); } } } private void UpdateSmartMove() { if (base.IsCursorOverSomething && IsSelectedObjectSmartMoved && ((m_selectedObject.SnapType != LE_Object.ESnapType.SNAP_TO_TERRAIN && m_selectedObject.SnapType != LE_Object.ESnapType.SNAP_TO_2D_GRID_AND_TERRAIN) || (m_cursorHitInfo.collider != null && m_cursorHitInfo.collider.gameObject.layer == TERRAIN_LAYER))) { SmartMove(m_selectedObject); } } private void SmartMove(LE_Object p_obj) { p_obj.transform.position = m_cursorHitInfo.point; if (p_obj.SnapType == LE_Object.ESnapType.SNAP_TO_3D_GRID || p_obj.SnapType == LE_Object.ESnapType.SNAP_TO_2D_GRID_AND_TERRAIN) { p_obj.transform.position += m_cursorHitInfo.normal * 0.005f; } if (p_obj.IsPlacementRotationByNormal) { p_obj.transform.up = m_cursorHitInfo.normal; } } private void UpdateSnapToObjectInstances() { bool flag = !m_isSnapToObjectActive && base.IsInteractable; if (!flag && (!m_isSnapToObjectActive || base.IsInteractable) && m_snapPointUIDToSnapPointsInvalidatedFrame != Time.frameCount - 1) { return; } m_isSnapToObjectActive = flag; List list = new List(); Dictionary.KeyCollection keys = m_snapPointUIDsToSnapPoints.Keys; foreach (string item in keys) { if (m_snapPointUIDsToSnapPoints[item] != null) { if (!flag || m_snapPointUIDsToSnapPoints[item].SnapCounter == 0) { m_snapPointUIDsToSnapPoints[item].gameObject.SetActive(flag); } } else { list.Add(item); } } foreach (string item2 in list) { m_snapPointUIDsToSnapPoints.Remove(item2); } } private LE_Object TrySelectByOversizedBoundingVolume() { List list = new List(); List list2 = new List(); LE_Object[] array = UnityEngine.Object.FindObjectsOfType(); for (int i = 0; i < array.Length; i++) { Vector3 o_min; Vector3 o_max; if (GetMinMaxBounds(array[i], out o_min, out o_max)) { float num = 1f; float magnitude = (array[i].transform.position - Camera.main.transform.position).magnitude; Vector3 vector = new Vector3 { x = Mathf.Abs(o_max.x - o_min.x), y = Mathf.Abs(o_max.y - o_min.y), z = Mathf.Abs(o_max.z - o_min.z) }; float magnitude2 = vector.magnitude; Vector3 rhs = Vector3.one * 10f + vector; if (magnitude > 50f) { num = 2.25f; vector = Vector3.Max(vector, Vector3.one * 1.5f); } else if (magnitude > 25f) { num = 1.85f; vector = Vector3.Max(vector, Vector3.one); } else if (magnitude > 15f) { num = 1.5f; vector = Vector3.Max(vector, Vector3.one * 0.5f); } vector = Vector3.Min(vector * num, rhs); if (new Bounds((o_max + o_min) * 0.5f, vector).IntersectRay(m_cursorRay)) { list.Add(array[i]); list2.Add(magnitude2); } } } if (list.Count > 0) { LE_Object result = list[0]; float num2 = list2[0]; for (int j = 1; j < list.Count; j++) { if (list2[j] < num2) { result = list[j]; num2 = list2[j]; } } float num3 = 9999999f; for (int k = 0; k < list.Count; k++) { if (list2[k] <= num2 * 1.25f) { float magnitude3 = Vector3.Cross(m_cursorRay.direction, list[k].transform.position - m_cursorRay.origin).magnitude; if (num3 > magnitude3) { num3 = magnitude3; result = list[k]; } } } return result; } return null; } private bool GetMinMaxBounds(LE_Object p_object, out Vector3 o_min, out Vector3 o_max) { o_min = Vector3.one * 9999999f; o_max = -Vector3.one * 9999999f; Collider[] componentsInChildren = p_object.GetComponentsInChildren(); if (componentsInChildren.Length > 0) { bool result = false; for (int i = 0; i < componentsInChildren.Length; i++) { if (componentsInChildren[i].GetComponent() == null) { result = true; Bounds bounds = componentsInChildren[i].bounds; o_min = Vector3.Min(o_min, bounds.min); o_max = Vector3.Max(o_max, bounds.max); } } return result; } return false; } private void PlaceObject() { if (m_previewInstance != null) { UnityEngine.Object.Destroy(m_previewInstance.gameObject); UR_CommandMgr.Instance.Execute(new LE_CmdPlaceObject(this, m_object, m_previewInstance.transform, m_objectResourcePath)); } } private void MoveToLayer(Transform root, int layer, Dictionary layerBuffer = null) { if (layerBuffer != null) { layerBuffer.Add(root.gameObject, root.gameObject.layer); } root.gameObject.layer = layer; foreach (Transform item in root) { MoveToLayer(item, layer, layerBuffer); } } private bool OnObjectDrag() { bool isObjectPlaceable = m_isObjectPlaceable; if (LE_EventInterface.OnObjectDragged != null) { LE_ObjectDragEvent lE_ObjectDragEvent = new LE_ObjectDragEvent(m_object, m_previewInstance, m_isObjectPlaceable, m_dragMessage, m_cursorHitInfo); LE_EventInterface.OnObjectDragged(this, lE_ObjectDragEvent); isObjectPlaceable = lE_ObjectDragEvent.IsObjectPlaceable; SetDragMessageInUI(lE_ObjectDragEvent.Message); } if (!isObjectPlaceable && m_previewInstance != null) { UnityEngine.Object.Destroy(m_previewInstance.gameObject); } return isObjectPlaceable; } private void SetDragMessageInUI() { SetDragMessageInUI(m_dragMessage); } private void SetDragMessageInUI(string p_message) { if (LE_GUIInterface.Instance.delegates.SetDraggableObjectMessage != null) { LE_GUIInterface.Instance.delegates.SetDraggableObjectMessage(m_dragMessage); } } private bool IsObjectDraggedInUI() { if (LE_GUIInterface.Instance.delegates.IsObjectDragged != null) { return LE_GUIInterface.Instance.delegates.IsObjectDragged(); } return false; } } }