- Tutoriales
- Scripting
- Reacting To String Input
Reacting To String Input
Revisado con versión: 5.5
-
Dificultad: Principiante
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.


Reacting To String Input
Principiante Scripting
Download the incomplete version of the project here.
Room
Code snippet
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
Code snippet
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
Code snippet
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
Code snippet
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Exit
{
public string keyString;
public string exitDescription;
public Room valueRoom;
}
TextInput
Code snippet
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
Code snippet
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
Code snippet
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]);
}
}