In this session we will learn how to program a text based adventure game in which the player explores a series of rooms by reading text and inputting commands via the keyboard. Room using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "TextAdventure/Room")] public class Room : ScriptableObject { [TextArea] public string description; public string roomName; public Exit[] exits; } GameController using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameController : MonoBehaviour { public Text displayText; public InputAction[] inputActions; [HideInInspector] public RoomNavigation roomNavigation; [HideInInspector] public List<string> interactionDescriptionsInRoom = new List<string> (); List<string> actionLog = new List<string>(); // Use this for initialization void Awake () { roomNavigation = GetComponent<RoomNavigation> (); } void Start() { DisplayRoomText (); DisplayLoggedText (); } public void DisplayLoggedText() { string logAsText = string.Join ("\n", actionLog.ToArray ()); displayText.text = logAsText; } public void DisplayRoomText() { ClearCollectionsForNewRoom (); UnpackRoom (); string joinedInteractionDescriptions = string.Join ("\n", interactionDescriptionsInRoom.ToArray ()); string combinedText = roomNavigation.currentRoom.description + "\n" + joinedInteractionDescriptions; LogStringWithReturn (combinedText); } void UnpackRoom() { roomNavigation.UnpackExitsInRoom (); } void ClearCollectionsForNewRoom() { interactionDescriptionsInRoom.Clear (); roomNavigation.ClearExits (); } public void LogStringWithReturn(string stringToAdd) { actionLog.Add (stringToAdd + "\n"); } // Update is called once per frame void Update () { } } RoomNavigation using System.Collections; using System.Collections.Generic; using UnityEngine; public class RoomNavigation : MonoBehaviour { public Room currentRoom; Dictionary<string, Room> exitDictionary = new Dictionary<string, Room> (); GameController controller; void Awake() { controller = GetComponent<GameController> (); } public void UnpackExitsInRoom() { for (int i = 0; i < currentRoom.exits.Length; i++) { exitDictionary.Add (currentRoom.exits [i].keyString, currentRoom.exits [i].valueRoom); controller.interactionDescriptionsInRoom.Add (currentRoom.exits [i].exitDescription); } } public void AttemptToChangeRooms(string directionNoun) { if (exitDictionary.ContainsKey (directionNoun)) { currentRoom = exitDictionary [directionNoun]; controller.LogStringWithReturn ("You head off to the " + directionNoun); controller.DisplayRoomText (); } else { controller.LogStringWithReturn ("There is no path to the " + directionNoun); } } public void ClearExits() { exitDictionary.Clear (); } } Exit using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] public class Exit { public string keyString; public string exitDescription; public Room valueRoom; } TextInput using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TextInput : MonoBehaviour { public InputField inputField; GameController controller; void Awake() { controller = GetComponent<GameController> (); inputField.onEndEdit.AddListener (AcceptStringInput); } void AcceptStringInput(string userInput) { userInput = userInput.ToLower (); controller.LogStringWithReturn (userInput); char[] delimiterCharacters = { ' ' }; string[] separatedInputWords = userInput.Split (delimiterCharacters); for (int i = 0; i < controller.inputActions.Length; i++) { InputAction inputAction = controller.inputActions [i]; if (inputAction.keyWord == separatedInputWords [0]) { inputAction.RespondToInput (controller, separatedInputWords); } } InputComplete (); } void InputComplete() { controller.DisplayLoggedText (); inputField.ActivateInputField (); inputField.text = null; } } InputAction using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class InputAction : ScriptableObject { public string keyWord; public abstract void RespondToInput (GameController controller, string[] separatedInputWords); } Go using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName= "TextAdventure/InputActions/Go")] public class Go : InputAction { public override void RespondToInput (GameController controller, string[] separatedInputWords) { controller.roomNavigation.AttemptToChangeRooms (separatedInputWords [1]); } } |
|