void Update() { highlightedObject = null; highlightedCollision3D = null; highlightedCollision = null; Rect screenRect = new Rect(0, 0, Screen.width, Screen.height); if (Controller.LoadState == Controller.State.Finished && !EventSystem.current.IsPointerOverGameObject() && screenRect.Contains(Input.mousePosition) ) { HandleCollision(); } }
private void HandleCollision() { var ec = Controller.obj?.levelEventController?.editor?.cam; bool mouselook = ec != null && (ec.MouseLookEnabled || ec.MouseLookRMBEnabled); if (mouselook) { return; } int layerMask = 0; Camera cam = Camera.main; //layerMask |= 1 << LayerMask.NameToLayer("Object"); if (LevelEditorData.Level?.IsometricData != null) { cam = ec?.camera3D ?? cam; // Isometric: Raycast objects layerMask = 1 << LayerMask.NameToLayer("3D Object"); Ray ray = cam.ScreenPointToRay(Input.mousePosition); RaycastHit[] hits = Physics.RaycastAll(ray, Mathf.Infinity, layerMask, QueryTriggerInteraction.Ignore); if (hits != null && hits.Length > 0) { System.Array.Sort(hits, (x, y) => (x.distance.CompareTo(y.distance))); if (Settings.ShowObjects) { for (int i = 0; i < hits.Length; i++) { // the object identified by hit.transform was clicked Unity_ObjBehaviour ob = hits[i].transform.GetComponentInParent <Unity_ObjBehaviour>(); if (ob != null) { highlightedObject = ob; break; } } } } // Isometric: Raycast collision layerMask = 1 << LayerMask.NameToLayer("3D Collision"); ray = cam.ScreenPointToRay(Input.mousePosition); hits = Physics.RaycastAll(ray, Mathf.Infinity, layerMask, QueryTriggerInteraction.Ignore); if (hits != null && hits.Length > 0) { System.Array.Sort(hits, (x, y) => (x.distance.CompareTo(y.distance))); for (int i = 0; i < hits.Length; i++) { // the object identified by hit.transform was clicked // Hack, for now use the gameobject name string[] name = hits[i].transform.gameObject.name.Split(','); if (name.Length == 2 && int.TryParse(name[0], out int x) && int.TryParse(name[1], out int y)) { var c3dt = LevelEditorData.Level.IsometricData.GetCollisionTile(x, y); if (c3dt != null) { highlightedCollision3D = c3dt; break; } } } } // TODO: Add colliders to each 3D block, and dummy behavior that has the x,y coordinates in tile space. Only disable renderers... } else { layerMask = 1 << LayerMask.NameToLayer("Object"); RaycastHit2D[] hits = Physics2D.RaycastAll(cam.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, Mathf.Infinity, layerMask); if (hits != null && hits.Length > 0) { System.Array.Sort(hits, (x, y) => (x.distance.CompareTo(y.distance))); if (Settings.ShowObjects) { for (int i = 0; i < hits.Length; i++) { // the object identified by hit.transform was clicked Unity_ObjBehaviour ob = hits[i].transform.GetComponentInParent <Unity_ObjBehaviour>(); if (ob != null) { highlightedObject = ob; break; } } } } } Vector2Int mouseTileCollision = Controller.obj.levelController.controllerTilemap.MouseToTileInt(Input.mousePosition, collision: true); highlightedCollision = LevelEditorData.Level?.Maps?.Where(x => x.Type.HasFlag(Unity_Map.MapType.Collision)).Select(x => x.GetMapTile(mouseTileCollision.x, mouseTileCollision.y)).ToArray(); Vector2Int mouseTile = Controller.obj.levelController.controllerTilemap.MouseToTileInt(Input.mousePosition); highlightedTile = LevelEditorData.Level?.Maps?.Where(x => x.Type.HasFlag(Unity_Map.MapType.Graphics)).Select(x => x.GetMapTile(mouseTile.x, mouseTile.y)).ToArray(); }
public void Update() { if (Controller.LoadState == Controller.State.Finished && !sentHierarchy) { SendHierarchy(); sentHierarchy = true; } if ((Application.platform == RuntimePlatform.WebGLPlayer || debugMessages) && Controller.LoadState == Controller.State.Finished) { // TODO: Handle highlight & selection changes like in raymap: var hl = Controller.obj.levelController.editor.objectHighlight; var hlCollision3D = hl.highlightedCollision3D; var hlCollision = hl.highlightedCollision; if (!Settings.ShowCollision) { hlCollision3D = null; hlCollision = null; } if (highlightedObject_ != hl.highlightedObject || (highlightedCollision3D_ != hlCollision3D || (highlightedCollision_ != hlCollision && (highlightedCollision_ == null || hlCollision == null || !highlightedCollision_.SequenceEqual(hlCollision))))) { highlightedObject_ = hl.highlightedObject; highlightedCollision_ = hlCollision; highlightedCollision3D_ = hlCollision3D; Send(GetHighlightMessageJSON()); } // Check selected object if (selectedObject_ != Controller.obj.levelEventController.SelectedEvent) { selectedObject_ = Controller.obj.levelEventController.SelectedEvent; if (selectedObject_ != null) { x_ = selectedObject_.ObjData.XPosition; y_ = selectedObject_.ObjData.YPosition; if (selectedObject_.ObjData is Unity_Object_3D o3d && LevelEditorData.Level?.IsometricData != null) { pos3D_ = o3d.Position; } // TODO: keep state indices so updates on animation speed, etc. can be sent //selectedPersoStateIndex_ = selectedPerso_.currentState; } Send(GetSelectionMessageJSON(includeLists: true, includeDetails: true)); } // Check selected object's changed values if (selectedObject_ != null) { if (selectedObject_.ObjData.XPosition != x_ || selectedObject_.ObjData.YPosition != y_ || (selectedObject_.ObjData is Unity_Object_3D o3d && LevelEditorData.Level?.IsometricData != null && o3d.Position != pos3D_)) { x_ = selectedObject_.ObjData.XPosition; y_ = selectedObject_.ObjData.YPosition; if (selectedObject_.ObjData is Unity_Object_3D o3d2 && LevelEditorData.Level?.IsometricData != null) { pos3D_ = o3d2.Position; } Send(GetSelectionMessageJSON(includeLists: false, includeDetails: false)); } } } }