// Walking in a room public void WalkInRoom(PixelRoom room, Vector2 walkFromPosition, Vector2 walkToPosition = default(Vector2)) { if (walkToPosition == default(Vector2)) { walkToPosition = room.center; } PixelCollider pixelCollider = GetComponentInChildren <PixelCollider>(); if (room != pixelCollider.GetPixelRoom()) { room.gameObject.SetActive(true); } HashSet <WayPoint> navigationMesh = room.GetNavigationalMesh(pixelCollider, walkFromPosition); WayPoint closest = navigationMesh.Aggregate((i1, i2) => Vector2.Distance(i1.position, walkToPosition) < Vector2.Distance(i2.position, walkToPosition) ? i1 : i2); if (room != pixelCollider.GetPixelRoom()) { room.gameObject.SetActive(false); } Debug.DrawLine(transform.position, closest.position, Color.magenta, 10.0f); CharacterTask characterTask = new CharacterTask(GameTask.TaskType.WALKTO, closest.position); characterTasks.Enqueue(characterTask); }
public bool Navigate(PixelPose pose) { // Find a list of doors to navigate to List <PixelDoor> path = FindPathToRoom(pose.pixelRoom); if (path != null) { foreach (PixelDoor door in path) { Debug.Log("Take " + door.name + " to " + door.destination); } } // Enqueue walkto tasks foreach (PixelDoor door in path) { CharacterTask walkToDoorTask = new CharacterTask(GameTask.TaskType.WALKTO, door.dropInWorldLocation); CharacterTask enterDoorTask = new CharacterTask(GameTask.TaskType.ENTERDOOR, door); characterTasks.Enqueue(walkToDoorTask); characterTasks.Enqueue(enterDoorTask); } Vector2 lastPosition; if (path.Count == 0) { lastPosition = transform.position; } else { lastPosition = path.Last().dropOffWorldLocation; } WalkInRoom(pose.pixelRoom, lastPosition, pose.position); CharacterTask faceTask = new CharacterTask(GameTask.TaskType.FACEDIRECTION, pose.direction); faceTask.character = this; characterTasks.Enqueue(faceTask); return(true); }