mirror of
https://github.com/Ratstail91/Mementos.git
synced 2025-11-29 02:24:28 +11:00
111 lines
3.3 KiB
C#
111 lines
3.3 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using System;
|
|
using Ink.Runtime;
|
|
|
|
// This is a super bare bones example of how to play and display a ink story in Unity.
|
|
public class BasicInkExample : MonoBehaviour {
|
|
public static event Action<Story> OnCreateStory;
|
|
|
|
void Awake () {
|
|
// Remove the default message
|
|
RemoveChildren();
|
|
StartStory();
|
|
}
|
|
|
|
// Creates a new Story object with the compiled story which we can then play!
|
|
void StartStory () {
|
|
story = new Story (inkJSONAsset.text);
|
|
if(OnCreateStory != null) OnCreateStory(story);
|
|
RefreshView();
|
|
}
|
|
|
|
// This is the main function called every time the story changes. It does a few things:
|
|
// Destroys all the old content and choices.
|
|
// Continues over all the lines of text, then displays all the choices. If there are no choices, the story is finished!
|
|
void RefreshView () {
|
|
// Remove all the UI on screen
|
|
RemoveChildren ();
|
|
|
|
// Read all the content until we can't continue any more
|
|
while (story.canContinue) {
|
|
// Continue gets the next line of the story
|
|
string text = story.Continue ();
|
|
// This removes any white space from the text.
|
|
text = text.Trim();
|
|
// Display the text on screen!
|
|
CreateContentView(text);
|
|
}
|
|
|
|
// Display all the choices, if there are any!
|
|
if(story.currentChoices.Count > 0) {
|
|
for (int i = 0; i < story.currentChoices.Count; i++) {
|
|
Choice choice = story.currentChoices [i];
|
|
Button button = CreateChoiceView (choice.text.Trim ());
|
|
// Tell the button what to do when we press it
|
|
button.onClick.AddListener (delegate {
|
|
OnClickChoiceButton (choice);
|
|
});
|
|
}
|
|
}
|
|
// If we've read all the content and there's no choices, the story is finished!
|
|
else {
|
|
Button choice = CreateChoiceView("End of story.\nRestart?");
|
|
choice.onClick.AddListener(delegate{
|
|
StartStory();
|
|
});
|
|
}
|
|
}
|
|
|
|
// When we click the choice button, tell the story to choose that choice!
|
|
void OnClickChoiceButton (Choice choice) {
|
|
story.ChooseChoiceIndex (choice.index);
|
|
RefreshView();
|
|
}
|
|
|
|
// Creates a textbox showing the the line of text
|
|
void CreateContentView (string text) {
|
|
Text storyText = Instantiate (textPrefab) as Text;
|
|
storyText.text = text;
|
|
storyText.transform.SetParent (canvas.transform, false);
|
|
}
|
|
|
|
// Creates a button showing the choice text
|
|
Button CreateChoiceView (string text) {
|
|
// Creates the button from a prefab
|
|
Button choice = Instantiate (buttonPrefab) as Button;
|
|
choice.transform.SetParent (canvas.transform, false);
|
|
|
|
// Gets the text from the button prefab
|
|
Text choiceText = choice.GetComponentInChildren<Text> ();
|
|
choiceText.text = text;
|
|
|
|
// Make the button expand to fit the text
|
|
HorizontalLayoutGroup layoutGroup = choice.GetComponent <HorizontalLayoutGroup> ();
|
|
layoutGroup.childForceExpandHeight = false;
|
|
|
|
return choice;
|
|
}
|
|
|
|
// Destroys all the children of this gameobject (all the UI)
|
|
void RemoveChildren () {
|
|
int childCount = canvas.transform.childCount;
|
|
for (int i = childCount - 1; i >= 0; --i) {
|
|
GameObject.Destroy (canvas.transform.GetChild (i).gameObject);
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
private TextAsset inkJSONAsset = null;
|
|
public Story story;
|
|
|
|
[SerializeField]
|
|
private Canvas canvas = null;
|
|
|
|
// UI Prefabs
|
|
[SerializeField]
|
|
private Text textPrefab = null;
|
|
[SerializeField]
|
|
private Button buttonPrefab = null;
|
|
}
|