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); } }
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; } }