Exemplo n.º 1
0
    public Vector2 MoveInDirection(ref RatTunnelNode currentNode, Vector2 position, Vector2 movement)
    {
        // Handle entry
        if (currentNode == null)
        {
            currentNode = GetEntryNode(position, movement);
            if (currentNode == null)
            {
                return(position);
            }
        }

        // Handle exit
        if (IsExiting(position, movement))
        {
            currentNode = null;
            return(position);
        }

        Vector2 nodePosition = currentNode.transform.position;

        // Handle being at a node
        if (currentNode.IsInNode(position))
        {
            int connectionIndex = currentNode.ClosestDirectionIndex(movement);
            if (connectionIndex < 0)
            {
                return(position);
            }

            position += movement;
            float disp = Vector2.Dot(position - nodePosition, currentNode.GetConnectingDirection(connectionIndex));
            return(currentNode.GetTowardConnectionPosition(connectionIndex, disp));
        }
        // Handle being between nodes
        else
        {
            Vector2 disp            = position - nodePosition;
            float   dist            = disp.magnitude;
            int     connectionIndex = currentNode.ClosestDirectionIndex(disp);
            Vector2 dir             = currentNode.GetConnectingDirection(connectionIndex);

            dist += Vector2.Dot(movement, dir);
            Vector2 newPosition = currentNode.GetTowardConnectionPosition(connectionIndex, dist);

            if (currentNode.IsInConnectedNode(newPosition, connectionIndex))
            {
                currentNode = currentNode.GetConnectedNode(connectionIndex);
            }

            return(newPosition);
        }
    }
Exemplo n.º 2
0
    private void OnTriggerStay2D(Collider2D collision)
    {
        if (currentNode != null)
        {
            return;
        }

        RatTunnel tunnel = collision.GetComponent <RatTunnel>();

        if (tunnel == null)
        {
            return;
        }

        RatTunnelNode entry = tunnel.GetEntryNode(transform.position, lastInput);

        if (entry != null)
        {
            currentNode        = entry;
            currentTunnel      = tunnel;
            rigidBody.bodyType = RigidbodyType2D.Static;
        }
    }