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]);
}
}
联系客服