第十章 游戏剧情(Game Plot)
在大部分的RPG中,故事剧情是非常重要的。例如某些播放某些过场动画,人物台词等文字叙述的显示。这些可以推动整个游戏流程。
在Unity商店中,有一些剧情类的插件。我们编写的这个可以配合那些插件使用。
文章目录
七 text命令执行器与文本界面 (text Command Exeuctor and UI Text Panel)
我们接下来进行的是text
命令,但写命令之前,我们要先有UI能够显示我们的文本。
关于UIManager
等问题,第六章的示例已经很好了,你也可以查看本章的源码,或者使用自己的UIManager
。两者大同小异,不再阐述。
1 界面结构 (Panel Structure)
我们在这里规定,文本界面有三个显示固定文本窗口,用它们来显示文本:
-
对话用屏幕上方;
-
对话用屏幕下方;
-
过场用屏幕下方(比对话用稍大)。
具体位置如 图 10.1 显示:
- 图 10.1:UI Text Panel
我们的对话文本窗口包含:
-
背景(Background);
-
头像(Profile);
-
文本背景(BackgroundInset);
-
文本(Text);
-
文本图标(Icon)(按键提示符);
而我们的过场用文本窗口包含:
-
文本背景(BackgroundInset);
-
文本(Text);
-
文本图标(Icon)(按键提示符);
它们是雷同的,所以我们可以建立一个子UI,能省掉我们很多事。
2 子UI文本窗口(Sub UI Text Window)
首先要明确的是,子窗口的作用:用来显示文本。
而显示方式有多种,一般情况下:
-
逐字显示;
-
逐行显示;
-
直接全部显示。
它们各有各的用处,主要是看游戏的需求。
根据结构,我们先创建一个UIBehaviour
(它在UnityEngine.EventSystems
命名空间下):
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace DR.Book.SRPG_Dev.UI
{
[AddComponentMenu("SRPG/UI/Text Window")]
public class SubUITextWindow : UIBehaviour
{
#region UI Fields
[SerializeField]
private Image m_ImgBackground;
[SerializeField]
private Image m_ImgProfile;
[SerializeField]
private Image m_ImgBackgroundInset;
[SerializeField]
private Text m_TxtText;
[SerializeField]
private Image m_ImgIcon;
#endregion
#region UI Properties
// 省略UI属性
#endregion
/// TODO 其它内容
}
}
2.1 字段与属性(Fields and Properties)
我们这里选择 逐字写入 ,我们就需要一个写入速度,我们称它为写入间隔。而写入的过程,我们使用Coroutine
(当然,你也可以使用Update()
)。
所以我们需要的字段:
-
写入间隔;
-
需要写入的文本;
-
是否正在写入文本。
创建字段与属性:
#region Fields
[SerializeField]
private float m_WordInterval = 0.05f;
private string m_Text = string.Empty;
private Coroutine m_WritingCoroutine = null;
#endregion
#region Properties
/// <summary>
/// 写入时每个字符的时间间隔
/// </summary>
public float wordInterval
{
get {
return m_WordInterval; }
set {
m_WordInterval = Mathf.Max(0f, value); }
}
/// <summary>
/// 是否在写入状态
/// </summary>
public bool isWriting
{
get {
return m_WritingCoroutine != null; }
}
/// <summary>
/// 获取应写入的完整文本
/// </summary>
public string text
{
get {
return m_Text; }
}
#endregion
2.2 写入完成事件(Write Text Done Event)
我们在完成写入文本时,最好可以进行通知(例如通知我们的UITextPanel
),这使用事件是一个好方法。
创建写入完成事件:
#region Unity Event
/// <summary>
/// 当文本写入完成时:
/// Args:
/// SubUITextWindow textWindow; // 写入的窗口
/// </summary>
[Serializable]
public class TextWriteDoneEvent : UnityEvent<SubUITextWindow> {
}
[Space, SerializeField]
private TextWriteDoneEvent m_TextWriteDoneEvent =