Пример #1
0
    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();
        }
    }
Пример #2
0
    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();
    }
Пример #3
0
    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));
                }
            }
        }
    }