分享

Introduction and Goals

 三维记忆 2019-11-19

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]);

    }

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多