Unity-业余2D游戏制作笔记02-Dialogue System for Unity使用
纯新手,仅用于记录个人学习中遇到的问题。
目录
当前目标: C#的变量数值和LUA代码连接
(一)Dialogue System任务流程里简单的LUA代码修改变量
(二)Lua通过调用C#函数,来修改C#里变量的数值。
(三)实现复杂一点的任务流程
1.创建从任务01切换到任务02的流程
2.玩家完成任务的过程
3.NPC背包物品栏物品自检的功能通用化
(四)解决一个小问题:空格键代替鼠标点按Botton按钮
Dialogue System for Unity手册参考内容
需要后续解决的问题
目前进度:
已完成几个人物角色的移动,基本场景,简单的背包和箱子,简单的保存和加载。
使用Dialogue System for Unity插件 :
1.修改UI符合游戏界面,UI对话显示人物的动画
上次留下的问题:
有几个问题需要后续代码修改:
1.一个NPC说话时,另一个应该停止动作
2.目前是在UI界面挂载这个Animator的,因此所有NPC调用这个UI都会显示这个挂载的动画
需要接下来解决的问题:
1.好感度数值和代码链接,实现插件内的好感度变化时,执行相应的反馈。
2.靠近NPC后一定范围后,能看到NPC之间头上出现气泡对话
————————————————
版权声明:本文为CSDN博主「solitaryheart」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/solitaryheart/article/details/128741325
上面需后续代码修改的1和2,都在《业余2D游戏制作笔记03》的文章里得到解决。
当前目标: C#的变量数值和LUA代码连接
先解决上次遗留其他小问题:1.text文本无法显示变量,另外任务文本部分被UI界面挡住了。
仔细看手册介绍,发现Entry1里var首字母不能大写。改成小写就正常显示了。
修改任务界面在左侧,这样不会被遮挡
好感度数值Affinity是记录在插件Love/Hate里面的,等下再来处理这个变量。
先由易到难,尝试一下C#的变量和Dialogue插件的变量的修改方法。
(一)Dialogue System任务流程里简单的LUA代码修改变量
例如,我在Dialogue Database里面,创建了变量“食物”,初始值是0. 它可以在插件内被修改。
实现增加食物的话,可以通过向NPC_Test乞讨。在NPC_Test身上挂载Dialogue System Trigger,Trigger选择On Use。这样的话,还需要加个Usable组件,说明这个NPC_Test是可以use的。另外这个NPC还必须有个Collider,选上is Trigger,这个Trigger的范围,就是允许Player点按触发的范围。(当Player点按触发后,将执行Dialogue System Trigger里面Action的内容:食物+1)
设置完NPC再设置Player,这个事件的触发由Player来判定。因此在Player上需要挂载Proximity Selector,设置Use Key为Space,即按空格键触发。另外插件内默认有Use Buttom:"Fire2",即鼠标右键也可以触发。触发后,执行Action里面的LUA代码:Variable[“食物”]=Variable[“食物”]+1
(二)Lua通过调用C#函数,来修改C#里变量的数值。
先实现简单的功能:完成NPC的任务后玩家获得5个金币。这个功能可以通过将C#函数注册进LUA里来实现。
金钱变量的定义和修改在C#代码上是挂载在一个叫InventoryManager.cs的文件里。找到Dialogue自带的模板,模板里拷贝出来示例代码,加到InventoryManager.cs里面。
先加上运行库using PixelCrushers.DialogueSystem;在加上OnEnable和OnDisable的注册和注销函数。然后定义金钱修改的函数。
using PixelCrushers.DialogueSystem;//添加public class InventoryManager : Singleton<InventoryManager>//下面的是复制的内容
{[Tooltip("Typically leave unticked so temporary Dialogue Managers don't unregister your functions.")]public bool unregisterOnDisable = false;//注销函数的开关void OnEnable(){Lua.RegisterFunction("AddMoney", this, SymbolExtensions.GetMethodInfo(() => AddMoney((double)0)));//}void OnDisable(){if (unregisterOnDisable){Lua.UnregisterFunction("AddMoney");}}public void AddMoney(double value){ playerMoney = playerMoney + (int)value;// Note: Lua always passes numbers as doubles. }
}
代码改完后,在Project里面右键创建一个Custom Lua Function Info
在里面设置函数名以及输入输出的参数类型
然后在任务完成时,执行这个AddMoney函数。
可以看到Player Money从9100变成9105。实现了这个任务完成获得金钱的功能。
(三)实现复杂一点的任务流程
完成了这个简单功能,接下来做个复杂一点的。NPC有一个任务02:想要一个南瓜。玩家获得一个南瓜,在背包里。这时给NPC赠送南瓜,再次对话就完成了任务,获得物品奖励。
这个可以用上面的方法,先在插件定义一个Bool变量“taskItemNum”,在C#函数里检查背包里的目标物体数量是多少,获得返回值,使用DialogueLua.SetVariable函数,将返回值赋给“taskItemNum”
以下是实践操作过程:
1.创建从任务01切换到任务02的流程
先参考上面增加金钱的方式,在C#写一个获得奖励物品的函数TaskReward(double 物品ID, double 物品数量)。然后在任务01的开始对话里,加上允许进入对话01的条件:任务未领取或任务进行中。
对话01的最后完成对话里,将这个任务结束
创建任务02
创建Bool变量
对话02的start添加条件,任务01已完成
对话中末尾添加LUA代码,激活任务02
这样就可以接到任务2。
2.玩家完成任务的过程
玩家获得南瓜,并如何赠送给NPC,这个功能一开始已经完成了,就不再描述。整个功能,就是给每个NPC创建一个列表,列表的每一项存放物品ID和物品数量。玩家获得一个南瓜,就在玩家的列表下,增加南瓜的ID,并给这一项的数量加一。如果赠送给NPC,就把这个值归零。给NPC列表加上南瓜ID和数量一。如下图,就是设置的NPC的背包物品栏,南瓜ID 1021,数量25.
3.NPC背包物品栏物品自检的功能通用化
接到任务后,每次对话进入某个阶段,就触发NPC物品自检函数。
先把函数注册进插件里。
这个检测NPC背包物品的功能,可能在每个NPC身上都能用到。因此让这个功能通用化。写一个Dialogue Control.cs代码,挂载在每个NPC身上,给每个NPC定义一个Personal ID,需要用到谁的背包,就把谁的Personal ID传到Inventory Manager.cs
先在Dialogue Control.cs函数开头定义好人物ID,在Unity界面上,给每个挂载了这个代码的NPC输入ID值
[Header("人物ID")][SerializeField] public int personalID;
然后在OnEnable上注册这个LUA函数
Lua.RegisterFunction("CheckItemMeetRequirement", this, SymbolExtensions.GetMethodInfo(() => CheckItemMeetRequirement((string)aaa, (double)0)));//注册函数
接下来设置触发方法,每个NPC身上都有Box Collider 2D,设置了Trigger,这样可以在Trogger函数里触发,变量canTalk在Trigger Enter时设置成true,自检函数根据判断canTalk的值判断是否可以触发。如果玩家没在NPC附近,就不触发。
private void OnTriggerEnter2D(Collider2D other){if (other.CompareTag("Player")){Settings.canTalk[personalID] = true;//npc.interactable;// && !npc.isMoving}}private void OnTriggerExit2D(Collider2D other){if (other.CompareTag("Player")){Settings.canTalk[personalID] = false;}}
这里提一下,canTalk是没有初始化的,需要在Start()里面初始化一下。
Start(),Awake(),Update()这三个是C#常用的函数。这里说一下他们的区别。
Update()里的代码会被反复的执行,每帧执行一次所以监控按键触发的函数,肯定是写在Update()里面的。
Start()只在开始时执行一次
Awake()也是只在开始时执行一次,但是它的执行在Start()之前。
根据canTalk的值是否true,来判断是否呼叫检查背包的事件
这里写的时候有个问题: 所有NPC都挂载了这个Dialogue Control代码,也就是说,每个NPC的这个代码都定义了新的canTalk。玩家接触的NPC,刚将cantalk设置成true,其他的NPC没有接触到玩家,就将canTalk设置成false.如果有10个NPC,玩家只接触了一个。这个canTalk只有1/10的时候才是true.
因此为了解决这个问题,在Settings.cs文件里定义了静态数组(因为C#没有全局变量),这样所有的代码都能共同修改这个静态数组。由于cantalk在Settings.cs这里初始化过了,所以不必在Dialogue Control代码初始化了。
public static bool[] canTalk = new bool[10];
在Dialogue Control写一下NPC背包自检函数。函数里满足条件时,调用检查背包的事件。
public void CheckItemMeetRequirement(double taskItemID){for (int i = 0;i< 10; i++){if (Settings.canTalk[i]){EventHandler.CallCheckItemRequirement(i, taskItemID);break;}}}
EventHandler.cs里面注册一下呼叫事件
public static event Action<int,double> CheckItemRequirement;public static void CallCheckItemRequirement(int personalID, double taskItemID){CheckItemRequirement?.Invoke(personalID, taskItemID);}
到目前的情况,已经能正常呼叫检查背包的事件,那么再写这个呼叫事件的代码。
public void OnCheckItemRequirement(int personalID, double taskItemID){int taskItemIntID = (int)taskItemID;double taskItemDoubleNum;//逐项检查背包物品for (int i = 0; i < allBag[personalID].itemList.Count; i++){if (allBag[personalID].itemList[i].itemID == taskItemIntID){taskItemNum = allBag[personalID].itemList[i].itemAmount;taskItemDoubleNum = (double)taskItemNum;DialogueLua.SetVariable("taskItemNum", taskItemDoubleNum);Debug.Log("最终任务物品数量:");Debug.Log(taskItemNum);}}}
最后在对话里调用这个函数。并在下一个对话对返回值进行判断。
这样任务02的流程就实现了
(四)解决一个小问题:空格键代替鼠标点按Botton按钮
另外对话中有个不好用的功能:Continue Button,需要鼠标点击按钮才能继续,用着不方便。当然这个也可以在Dialogue Manager里面取消,但是取消后自动播放也不好控制播放速度,因此想改成空格键触发。
首先,空格键前面设置了有再次触发对话的功能,而在对话过程中不能重复开启对话,因此先把这个功能取消。给Player加上Dialogue System Events组件,并把上面的Proximity Selector组件拖进来,选择Bool Enabled选项。On Conversation Start里面的方框不勾选,On Conversation Start里的方框勾选。这样在对话期间就取消了Selector组件。
在UI Prefab里面找到这个Continue Button,然后添加一个UI Button Key Trigger组件,这样识别到按键Space触发时,自动触发Button组件
Dialogue System for Unity手册参考内容
参数的set和get
执行LUA函数
LUA监听
需要后续解决的问题:
1.Dialogue System里Actor角色的选项卡太少,需要加上年龄,等级,职业,资产等选项卡
2.按下按键,跳出任务窗口栏,显示任务进度和描述
3.Love/Hate 插件的好感度变化
4.Bark对话气泡的实现
5.任务对话时的动画切换
Unity-业余2D游戏制作笔记02-Dialogue System for Unity使用相关推荐
- Ruby‘s Adventrue游戏制作笔记(十四)Unity播放游戏音效
Ruby's Adventrue游戏制作笔记(十四)Unity播放游戏音效 前言 一.创建背景音乐 二.创建新的脚本 三.在其他需要播放的所有脚本中进行操作 四.给敌人添加音效 五.给玩家添加移动音效 ...
- Ruby‘s Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效
Ruby's Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效 前言 一.把特效物品进行切割 二.创建 particle System 三.创建彩色球 四.再设置一下其他属性 五. ...
- Ruby‘s Adventrue游戏制作笔记(十六)Unity子弹数量及其UI
Ruby's Adventrue游戏制作笔记(十六)Unity子弹数量及其UI 前言 一.创建新的UI 二.编辑脚本 三.创建获得子弹的道具 系列链接 前言 本文章是我学习Unity官方项目项目所做笔 ...
- Unity-业余2D游戏制作笔记01-Dialogue System for Unity使用
纯新手,仅用于记录个人学习中遇到的问题. 目前进度: 已完成几个人物角色的移动,基本场景,简单的背包和箱子,简单的保存和加载. 刚开始学习使用Dialogue System for Unity插件和L ...
- 【2D游戏制作笔记】给游戏战斗增加一点打击感
目录 1.敌人颜色改变 2.相机震动 3.击退效果 4.受击特效 5.音效 以下内容是对自己制作过程中遇到问题的记录,不一定科学准确. 1.敌人颜色改变 学习链接 当敌人受到攻击时,改变敌人图像的颜色 ...
- 【2D游戏制作笔记】如何做出较好的角色操作手感
目录 1.地面与角色的碰撞检测 2.操作过程中人物消失不见 3.墙上控制 以下内容是对自己制作过程中遇到问题的记录,不一定科学准确. 1.地面与角色的碰撞检测 当人物下落速度较大时,有时会出现人物穿过 ...
- Ruby‘s Adventrue游戏制作笔记(四)Unity绘制其他元素
Ruby's Adventrue游戏制作笔记(四)Unity绘制其他元素 前言 一.修改地图层级,将Order in Layer 提高到-10 二.创建Prefabs 三.调整人物在其他元素的位置 四 ...
- Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹
Ruby's Adventrue游戏制作笔记(十一)Unity角色攻击--发射子弹 前言 一.编辑子弹 二.创建脚本 三.修改玩家攻击脚本 四.将子弹拖入玩家脚本 五.让子弹碰撞到该碰撞的东西 六.编 ...
- Ruby‘s Adventrue游戏制作笔记(十)Unity添加动画
Ruby's Adventrue游戏制作笔记(十)Unity添加动画 前言 一.给食物添加动画 二.给敌人添加动画 三.添加玩家动画 四.设置触发动画的脚本 系列链接 前言 本文章是我学习Unity官 ...
最新文章
- PCL基础3:点云程序运行时间计时
- SpringBoot上传文件大小限制
- Discuz7使用syntaxhighlighter_2.0.320实现代码高亮
- SAP IBASE logic of pt_equiindx
- python socket编程_最基础的Python的socket编程入门教程
- 产品经理应该mysql_数据库对产品经理的重要性
- Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (5) - 流水线前端传统译码器
- 又是安卓玩剩下的功能!下代iPhone或可同时连两副耳机
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn
- Java之volatile
- paip.操作DATATABLE增加列及内容
- html形状圆形,html – 使用CSS的圆形标记形状
- 百度地图点聚合,加载1万个marker
- 那智机器人带CClink模块和三菱Q系列PLC通信
- 守望先锋app(2)
- 上海电力大学计算机专业全国排名,上海电力大学有哪些专业 上海电力大学专业排名...
- php 日期转换为大写
- 指纹登录 TouchID FaceID
- Android 常用RGB值以及中英文名称
- 自媒体多平台多账号群发工具开发日记:第1天 工具的统筹规划
热门文章
- 电信大型服务器机房_四川电信服务器idc数据中心
- 黑客入侵自我保护手册
- mysql排序的四种方式
- 【Unity】在Unity中实现扫描二维码 生成二维码功能
- MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
- Web自动化测试02
- springCloud面试之feign+ribbon+hystirx交互概览
- 这3款免费的Word转PDF转换器软件,建议收藏使用
- 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)
- Windows终端美化