示例#1
0
        // 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);
        }
示例#2
0
        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);
        }