纯新手,仅用于记录个人学习中遇到的问题。

目录

当前目标: 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使用相关推荐

  1. Ruby‘s Adventrue游戏制作笔记(十四)Unity播放游戏音效

    Ruby's Adventrue游戏制作笔记(十四)Unity播放游戏音效 前言 一.创建背景音乐 二.创建新的脚本 三.在其他需要播放的所有脚本中进行操作 四.给敌人添加音效 五.给玩家添加移动音效 ...

  2. Ruby‘s Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效

    Ruby's Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效 前言 一.把特效物品进行切割 二.创建 particle System 三.创建彩色球 四.再设置一下其他属性 五. ...

  3. Ruby‘s Adventrue游戏制作笔记(十六)Unity子弹数量及其UI

    Ruby's Adventrue游戏制作笔记(十六)Unity子弹数量及其UI 前言 一.创建新的UI 二.编辑脚本 三.创建获得子弹的道具 系列链接 前言 本文章是我学习Unity官方项目项目所做笔 ...

  4. Unity-业余2D游戏制作笔记01-Dialogue System for Unity使用

    纯新手,仅用于记录个人学习中遇到的问题. 目前进度: 已完成几个人物角色的移动,基本场景,简单的背包和箱子,简单的保存和加载. 刚开始学习使用Dialogue System for Unity插件和L ...

  5. 【2D游戏制作笔记】给游戏战斗增加一点打击感

    目录 1.敌人颜色改变 2.相机震动 3.击退效果 4.受击特效 5.音效 以下内容是对自己制作过程中遇到问题的记录,不一定科学准确. 1.敌人颜色改变 学习链接 当敌人受到攻击时,改变敌人图像的颜色 ...

  6. 【2D游戏制作笔记】如何做出较好的角色操作手感

    目录 1.地面与角色的碰撞检测 2.操作过程中人物消失不见 3.墙上控制 以下内容是对自己制作过程中遇到问题的记录,不一定科学准确. 1.地面与角色的碰撞检测 当人物下落速度较大时,有时会出现人物穿过 ...

  7. Ruby‘s Adventrue游戏制作笔记(四)Unity绘制其他元素

    Ruby's Adventrue游戏制作笔记(四)Unity绘制其他元素 前言 一.修改地图层级,将Order in Layer 提高到-10 二.创建Prefabs 三.调整人物在其他元素的位置 四 ...

  8. Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹

    Ruby's Adventrue游戏制作笔记(十一)Unity角色攻击--发射子弹 前言 一.编辑子弹 二.创建脚本 三.修改玩家攻击脚本 四.将子弹拖入玩家脚本 五.让子弹碰撞到该碰撞的东西 六.编 ...

  9. Ruby‘s Adventrue游戏制作笔记(十)Unity添加动画

    Ruby's Adventrue游戏制作笔记(十)Unity添加动画 前言 一.给食物添加动画 二.给敌人添加动画 三.添加玩家动画 四.设置触发动画的脚本 系列链接 前言 本文章是我学习Unity官 ...

最新文章

  1. PCL基础3:点云程序运行时间计时
  2. SpringBoot上传文件大小限制
  3. Discuz7使用syntaxhighlighter_2.0.320实现代码高亮
  4. SAP IBASE logic of pt_equiindx
  5. python socket编程_最基础的Python的socket编程入门教程
  6. 产品经理应该mysql_数据库对产品经理的重要性
  7. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (5) - 流水线前端传统译码器
  8. 又是安卓玩剩下的功能!下代iPhone或可同时连两副耳机
  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn
  10. Java之volatile
  11. paip.操作DATATABLE增加列及内容
  12. html形状圆形,html – 使用CSS的圆形标记形状
  13. 百度地图点聚合,加载1万个marker
  14. 那智机器人带CClink模块和三菱Q系列PLC通信
  15. 守望先锋app(2)
  16. 上海电力大学计算机专业全国排名,上海电力大学有哪些专业 上海电力大学专业排名...
  17. php 日期转换为大写
  18. 指纹登录 TouchID FaceID
  19. Android 常用RGB值以及中英文名称
  20. 自媒体多平台多账号群发工具开发日记:第1天 工具的统筹规划

热门文章

  1. 电信大型服务器机房_四川电信服务器idc数据中心
  2. 黑客入侵自我保护手册
  3. mysql排序的四种方式
  4. 【Unity】在Unity中实现扫描二维码 生成二维码功能
  5. MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
  6. Web自动化测试02
  7. springCloud面试之feign+ribbon+hystirx交互概览
  8. 这3款免费的Word转PDF转换器软件,建议收藏使用
  9. 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)
  10. Windows终端美化