用XML做的Unity NPC对话系统


本文提供全流程,中文翻译。

Chinar坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


  • 1

    • Create XML Document 创建所需的XML文档
  • 2
    • Audio Manager 音频管理器脚本
  • 3
    • UI Manager 界面交互控制
  • 4
    • Finish 测试运行

游戏效果:


1

Create XML Document —— 创建所需的XML文档

注意路径:

我的XML文档”Dialog.xml”放在了 Assets 目录下创建的一个 Data 目录中

如果名字不一样,需要改名

或者直接修改解析XML代码中的读取路径,为你自己的路径

document.Load(Application.dataPath + "/Data/Dialog.xml"); //加载 XML 内容

<?xml version="1.0" encoding="utf-8"?>
<!-- Dialog System ; Background ; Image ; Music -->
<root><bg>背景1</bg><bgm>雨声</bgm><say><name>船长</name><image>曲境一号船长1</image><sound>花痴诗1</sound><content>我的小鱼你醒了,还记认识早晨吗?</content></say><say><name>秀秀</name><image>秀秀1</image><sound>花痴诗2</sound><content>昨夜你曾经说, 愿夜幕永不开启。</content></say><say><name>船长</name><image>曲境一号船长2</image><sound>花痴诗3</sound><content>你的香腮边轻轻滑落的</content></say><say><name>秀秀</name><image>秀秀2</image><sound>花痴诗4</sound><content>是你的泪,还是我的泪?</content></say><bg>背景2</bg><say><name>秀秀</name><image>秀秀3</image><sound>花痴诗5</sound><content>初吻吻别的那个季节</content></say><say><name>船长</name><image>曲境一号船长3</image><sound>花痴诗6</sound><content>不是已经哭过了吗?</content></say><bg>背景3</bg><say><name>船长</name><image>曲境一号船长4</image><sound>花痴诗7</sound><content>我的指尖还记忆着</content></say><say><name>秀秀</name><image>秀秀4</image><sound>花痴诗8</sound><content>你慌乱的心跳</content></say><say><name>船长</name><image>曲境一号船长1</image><sound>花痴诗9</sound><content>温润的体香里</content></say><bg>背景4</bg><say><name>秀秀</name><image>秀秀1</image><sound>花痴诗10</sound><content>那一缕长发飘飘…</content></say>
</root>

2

Audio Manager —— 音频管理器脚本

将此脚本挂在保证激活状态的 GameObject 上,并添加 2 个 AudioSource 组件

通过拖动的方式

在 Inspecter 面板中将 2 个 AudioSource 组件拖到 ↓

背景音: BgmAudioSource 和音效: SeAudioSource 框中

代码直接 Copy

using UnityEngine;/// <summary>
/// 声音管理类
/// </summary>
public class AudioManager : MonoBehaviour
{public static AudioManager Instance;       //单例public        AudioSource  BgmAudioSource; //背景音public        AudioSource  SeAudioSource;  //音效private       AudioClip    _clip;          //音乐文件/// <summary>/// 初始化函数/// </summary>void Start(){Instance = this;}/// <summary>/// 播放背景音/// </summary>public void PlayBgm(string inName){_clip               = Resources.Load<AudioClip>(inName); //加载音乐文件BgmAudioSource.clip = _clip;                             //更换音乐文件为Clip默认文件BgmAudioSource.Play();                                   //播放音乐}/// <summary>/// 播放音效/// </summary>public void PlaySe(string inName){_clip = Resources.Load<AudioClip>(inName); //加载音乐文件SeAudioSource.PlayOneShot(_clip);          //播放音效,一声就完了}/// <summary>/// 停止背景音/// </summary>public void StopBgm(){BgmAudioSource.Stop(); //停止播放器}
}


3

UI Manager —— 界面交互控制

将此脚本挂在保证激活状态的 GameObject 上

通过拖动的方式

Inspecter —— 面板中:分别添加声明的 6 个对象

代码直接 Copy

using UnityEngine;
using System.Xml;                  //引用XML
using UnityEngine.UI;              //引用UI
using System.Collections.Generic;  //引用集合
using UnityEngine.SceneManagement; //引用命名空间/// <summary>
/// 枚举指令类型
/// </summary>
public enum CommandType
{Say, //说话Bgm, //背景音Bg   //背景
}/// <summary>
/// 基类:指令类
/// </summary>
public class Command
{public CommandType AllType; //定义成员变量 类型对象
}/// <summary>
/// 说话指令类:继承 指令基类
/// </summary>
public class Say : Command
{public string Name;    //名字public string Image;   //图片public string Sound;   //音乐public string Content; //内容
}/// <summary>
/// 背景音指令类:继承 指令基类
/// </summary>
public class Bgm : Command
{public string Name; //名字
}/// <summary>
/// 背景指令类:继承 指令基类
/// </summary>
public class Bg : Command
{public string Name; //名字
}/// <summary>
/// 对话系统
/// </summary>
public class DialogUI : MonoBehaviour
{public  List<Command> Commands = new List<Command>(); //声明一个 List 数组 类型为:Commandprivate int           _index   = 0;                   //默认索引为0public  GameObject    GameImage;                      //游戏界面public  GameObject    ReloadBut;                      //重开按钮public  Image         BgImage;                        //背景图public  Image         HeadPortrait;                   //头像public  Text          NameText;                       //名字文本public  Text          ConttentText;                   //内容文本private bool          _isExecute = false;             //是否执行命令:默认不执行/// <summary>/// 初始化方法/// </summary>void Start(){AnalysisXml();                                                                            //调用解析XML方法GameObject.Find("StartGameButton").GetComponent<Button>().onClick.AddListener(StartGame); //给开始游戏按钮,添加监听事件}/// <summary>/// 更新函数/// </summary>void Update(){if (Input.GetMouseButtonDown(0)           && _isExecute == true ||Input.GetKeyDown(KeyCode.KeypadEnter) && _isExecute == true) //如果按下鼠标左键或者按下Enter{OneByOneExecuteCommand(); //执行对话命令函数}}/// <summary>/// 开始游戏/// </summary>public void StartGame(){GameImage.SetActive(true); //激活游戏界面_isExecute = true;         //游戏开始:可以开始执行代码OneByOneExecuteCommand();  //游戏页面被激活的时候,就执行一次}/// <summary>/// 执行对话命令函数/// </summary>public void OneByOneExecuteCommand(){if (_index >= Commands.Count) //下标越界:读完{ReloadBut.SetActive(true);                                         //激活重载按钮ReloadBut.GetComponent<Button>().onClick.AddListener(ReloadScene); //给按钮添加 重载场景 监听事件_isExecute = false;                                                //关闭执行命令return;}Command command = Commands[_index++]; //自增:取出一条命令switch (command.AllType){//如果类型是:Say 说话case CommandType.Say:Say say             = (Say) command;                     //实例化 Say 对象 sayHeadPortrait.sprite = Resources.Load<Sprite>(say.Image); //更换头像NameText.text       = say.Name;                          //人物ConttentText.text   = say.Content;                       //说话内容if (!string.IsNullOrEmpty(say.Sound))                    //如果音效名不为空{AudioManager.Instance.PlaySe(say.Sound); //播放音效}break;//如果类型是:Bgm 背景音乐case CommandType.Bgm:Bgm bgm = (Bgm) command;                 //实例化 Bgm 对象 bgmAudioManager.Instance.PlayBgm(bgm.Name); //播放背景音乐OneByOneExecuteCommand();                //直接执行下一条break;//如果类型是:Bg 背景case CommandType.Bg:Bg bg          = (Bg) command;                    //实例化 Bg 对象 bgBgImage.sprite = Resources.Load<Sprite>(bg.Name); //更换背景图片OneByOneExecuteCommand();                         //直接执行下一条break;}}/// <summary>/// 重载场景/// </summary>public void ReloadScene(){SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); //重载当前场景}/// <summary>/// 解析XML/// </summary>private void AnalysisXml(){XmlDocument document = new XmlDocument();                 //实例化一个xml文档document.Load(Application.dataPath + "/Data/Dialog.xml"); //加载 XML 内容XmlElement rootEle = document.LastChild as XmlElement;    //根节点foreach (XmlElement ele in rootEle.ChildNodes)            //遍历根节点的所有子节点{if (ele.Name == "bgm") //如果元素的名字是XML文档中的节点"bgm"{Bgm bgm     = new Bgm();bgm.AllType = CommandType.Bgm;bgm.Name    = ele.InnerText;Commands.Add(bgm); //添加到命令数组 Commands 中}else if (ele.Name == "bg"){Bg bg      = new Bg();bg.AllType = CommandType.Bg;bg.Name    = ele.InnerText;Commands.Add(bg);}else if (ele.Name == "say"){Say say     = new Say();say.AllType = CommandType.Say;say.Name    = ele.ChildNodes[0].InnerText;say.Image   = ele.ChildNodes[1].InnerText;say.Sound   = ele.ChildNodes[2].InnerText;say.Content = ele.ChildNodes[3].InnerText;Commands.Add(say);}}}
}


4

Finish —— 测试运行

直接点击运行 Or Alt+P

Chinar所作,Down下即可!

附:Chinar的GitHub工程案例


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

Unity 3D游戏-NPC对话系统With XML相关推荐

  1. 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍

    随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...

  2. Unity 3D - 游戏开发中的Lua

    Unity 3D - 游戏开发中的Lua : 本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323 前言 : ...

  3. Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games

    Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...

  4. 《Unity 3D 游戏开发技术详解与典型案例》——1.3节第一个Unity 3D程序

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.3节第一个Unity 3D程序,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  5. 雨松MOMO《Unity 3D游戏开发》源码公布

    原创文章如需转载请注明:转载自雨松MOMO程序研究院 本文链接地址:雨松MOMO<Unity 3D游戏开发>源码公布 下载源码时,首先大家请登陆图灵社区找到<Unity 3D游戏开发 ...

  6. unity 3d游戏开发_使用Unity 5开发3D游戏

    unity 3d游戏开发 If there's one thing cooler than playing games, it's building games. 如果有比玩游戏更酷的一件事,那就是构 ...

  7. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  8. Unity 3D 环境特效||Unity 3D 游戏场景设计实例

    Unity 3D 环境特效 一般情况下,要在游戏场景中添加雾特效和水特效较为困难,因为需要开发人员懂得着色器语言且能够熟练地使用它进行编程. Unity 3D 游戏开发引擎为了能够简单地还原真实世界中 ...

  9. Unity 3D游戏发布到Android平台

    Android 是目前最流行的一个词,Android 的游戏.软件等几乎是人们每天都要用到的.要将 apk 文件发布到 Android 平台,必须先安装两个工具:Java(JDK)和 Android ...

最新文章

  1. 关于web项目当中的mybatis的xml 文件的配置启动报错的解决。
  2. hdu4282 x^z+y^z+x*y*z=k 解的个数
  3. Kubernetes(六) - Secret和私有仓库认证
  4. android studio配置java_android studio配置Javah 和ndk-build
  5. TCP queue 的一些问题
  6. vscode 插件推荐 - 献给所有前端工程师(2018.4.29更新)
  7. XML——XML的那些事
  8. Android USB AUDIO初步分析
  9. 【转】Intellij Idea识别Java Web项目
  10. 如何在JavaScript中用SpreadJS导入/导出Excel文件
  11. FTP,HTTP各种端口号
  12. Java文件上传【通用】
  13. java编写websocket客户端
  14. C#高斯平滑算法 :二维高斯卷积代码实例
  15. 7-7 sdust-Java-字符串集合求并集 (10分)
  16. Windows dss代理摄像头rtsp流 rtsp摄像头+ffmpeg+vlc
  17. 一起谈.NET技术,.NET十年(上)
  18. UEFI U盘安装Win10最简单的方法【转】
  19. hbw-utils - 基本数据类型进制转换的实现
  20. Oracle tns 协议

热门文章

  1. python连接plc_Python与PLC踩坑实录:成功解决西门子 PLC S7-200_SMART与PC连接时不能同时用Python的snap7包和step7软件同时连接...
  2. con 元器件符号_常用元器件名称符号和举例.doc
  3. selenium使用多种浏览器运行踩坑(谷歌,IE,360)
  4. Python Pandas聚合函数
  5. 工业4G无线产品应用于充电桩远程监控解决方案
  6. python 评分卡建模记录---使用到的各种函数(1)(转载)
  7. 如何计算:结构体内存的大小(在结构体的考察中占据非常重要的地位)
  8. visual studio 2005 没有注册类别
  9. 为什么使用消息队列、消息队列优缺点和适用场景?
  10. R语言nomo图绘制再探