Dialogue System for Unity使用(二)实战


前言

构思一个剧情、实现她!

既然是实战,我们假想一个剧情:
某天,你出生了。
旁白:简单介绍。
小孩出生一岁时家人让你抓阄,获得对应效果。
每一年可以和周围的npc对话,获得某些能力提升。(如打铁匠提升力量
16岁左右出现一个👴,自称仙人,测试村子人的资质,你选择跟随或者出村寻找机缘。(过场动画,展示仙人
-跟随进入门派外门-》挑水可以完成任务获得积分,100积分进入内门。
-出村自谋出路到新的场景-》做工完成后获得银票,100两银子进入门派外门。
需要每次退出保存进度。

这里的需求用到了各种插件功能,包含旁白、通过对话改变人物属性、过场动画、任务系统、分支故事、缓存系统。具体细节合理性暂不考虑。


一、准备

新建场景,然后拖拽下图预制体到场景,最后点击预制体上的Create按钮创建到该场景同级目录。
在这里插入图片描述
现在我们每次点击Edit按钮就会进入对话系统了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
OK,如上图我们先把基本的版本、使用人、简介填一下,然后如下图随便搞两个模型,这里大火自由发挥;至于各个模块的功能上一篇有详细介绍,这里不多讲,主打实战功能。
在这里插入图片描述
最后,给咱们主角加上一个脚本,包含了基本属性和方法,可自由发挥。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float HP { set; get; }
    public float Strength { set; get; }
    public float Luck { set; get; }

    public void AddHP(float num) 
    {
        HP += num;
    }


    public void AddStrength(float num)
    {
        Strength += num;
    }


    public void AddLuck(float num)
    {
        Luck += num;
    }
}

二、旁白(开局介绍)

点击下图“+”号,然后将右边的属性修改一下,主要是Title、Actor、Conversant这几个属性,因为是背景介绍我们把对话人物什么的置空。
在这里插入图片描述
在这里插入图片描述
右键创建新节点,然后在新节点的属性页面加入文本描述。(这里双击节点也可以输入文本信息)
在这里插入图片描述
在这里插入图片描述
如法炮制,再加几段说明。抓阄好像应该在下一个对话,这里主讲功能忽略这些细节,以后再改过来

然后在Player身上添加Dialogue System Trigger,然后按下图依次选择,意思是开始的时候触发该对话。
在这里插入图片描述

在这里插入图片描述
ok这时候运行游戏,发现开局介绍会一段段自动播放到最后。

在这里插入图片描述
这里字幕太快了,我们想手动点击再进行下一幕,怎么办呢切回上一篇文章搜索Continue Button就能找到答案。如下图,在第二个选择处切换成Aways即可。其他的选项效果如何参考上一章文章,下面如果遇到类似问题我就不一一概述了,到时候直接上图告诉大火上一章文章搜什么关键词。
在这里插入图片描述
效果如下:
在这里插入图片描述

三、条件选择

1、表现层

既然是主角选择抓阄,那么就涉及到下图红框的演员、变量两个知识点;这里为设置让我们抓阄的人还是空的所以不添加演员了,如果想要抓阄的人是父母什么的可以添加一个演员,然后在变量处添加一个叫【HP】的Number,意为HP属性。
在这里插入图片描述
我们先建立新对话设置演员为自己,然后加上多个条件,右键make line连线。

在这里插入图片描述
切换到上一个对话结尾,然后连接到该对话。
在这里插入图片描述
运行发现没问题
在这里插入图片描述

2、逻辑层

我们选纸巾作为示例,点击脚本script右上角…Add我们的值设为1; 然后其他的如法炮制,这种方式当然可以但是不符合我们的水平,别忘了我们最开始玩家身上的脚本里的才是我们需要去改变的属性。
在这里插入图片描述

3、Lua连接脚本方法

此lua的意思就是连接脚本的意思,我们把最开始的代码进行小改变。注册咱们的方法进去。

using System.Collections;
using System.Collections.Generic;
using PixelCrushers.DialogueSystem;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float HP { set; get; }
    public float Strength { set; get; }
    public float Luck { set; get; }

    private void Start()
    {
        Lua.RegisterFunction("AddHP",this,SymbolExtensions.GetMethodInfo(()=>AddHP(0)));
        Lua.RegisterFunction("AddStrength", this, SymbolExtensions.GetMethodInfo(() => AddStrength(0)));
        Lua.RegisterFunction("AddLuck", this, SymbolExtensions.GetMethodInfo(() => AddLuck(0)));

    }

    private void OnDestroy()
    {
        Lua.UnregisterFunction("AddHP");
        Lua.UnregisterFunction("AddStrength");
        Lua.UnregisterFunction("AddLuck");

    }

    public void AddHP(float num) {
        HP += num;
        Debug.Log(HP);
    }


    public void AddStrength(float num)
    {
        Strength += num;
    }


    public void AddLuck(float num)
    {
        Luck += num;
    }
}

接下来创建Lua方法载体,然后设置对应的方法名称。 在这里插入图片描述
在这里插入图片描述
同时修改对应的脚本方法,然后进入剧情后选择对应选项发现属性增加并且debug输出成功,ojbk,我们掌握了调用对话系统调用脚本的途径。之前的HP属性可以删除了。
在这里插入图片描述

四、NPC站桩交互

1、悬浮对话框

我们把之前弄好的NPC多复制几个,染上不同颜色,为了让人物生动我们给他们添上barks,翻译过来叫狗吠,其实就是头顶的悬浮对话框,会随机显示一些符合角色的语句。然后随便搞搞,下图是铁匠的语录。
在这里插入图片描述
接着在铁匠NPC上加上Dialogue Actor组件,位置信息搞好,如图再把UI附上;最后添加Bark On Idle组件,选择刚刚的对话,大功告成。至于其余NPC就不一一展示。如图中游戏视图在没有其他主角对话的情况下NPC过几秒就会自言自语,效果还可以,当然真正的项目肯定需要改写这种组件或者加上各种条件,比如npc在得知妻子死亡后说的话就会有变化这样。在这里插入图片描述

2、NPC交互

新建个铁匠对话,3个选项,选教打铁的话就加力量;
在这里插入图片描述
然后给铁匠装上触发器选择OnUse即可触发对话,再添加并设置Unable可用组件,这里图方便我光设置范围了。
在这里插入图片描述
接下来给主角/相机加上Selector选择组件,改成点击触发,然后鼠标点击的时候小于上面设置的范围铁匠名字会变黄然后可以右键点击触
发。
在这里插入图片描述

3、动起来

到目前为止人物还没动起来,像触发NPC对话需要移动摄像机,有点影响我们以后的学习。这里创建个简单的脚本挂在Player身上,顺便把摄像机变成角色子物体外加移动到角色身后。

using UnityEngine;

public class Move : MonoBehaviour
{
    public float speed = 5;
    public float cameraSpeed = 10;

    private Vector2 cameraRot;
    void Start()
    {
        cameraRot = transform.eulerAngles;
    }
    // Update is called once per frame
    void Update()
    {
        //按键
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 dir = new Vector3(h, 0, v);
        dir = Camera.main.transform.TransformDirection(dir);
        dir.y = 0;
        transform.Translate(dir * speed * Time.deltaTime, Space.World);


        //右键移动视角
        if (Input.GetMouseButton(1))  
        {
            cameraRot += new Vector2(Input.GetAxis("Mouse Y"), Input.GetAxis("Mouse X")) * cameraSpeed;   //摄像机旋转的控制
            transform.eulerAngles = cameraRot;
        }
    }
}

在这里插入图片描述
接下来的每次对话完成就提示过了一年,10年后咱们遇见仙人,这里我就不展开了。假定一个数值,每次对话完成+1,然后使用条件判断,数值超过了10就进入下一段对话,和添加生命值是一样的,大火自由发挥吧。
在这里插入图片描述

五、过场动画

首先,我先粗略的看了下这个过场相关的东西,非常复杂,内置了很多类似移动、聚焦、屏幕渐变等;

–这里涉及到一部分TimeLine用法,所以暂且搁浅,过几天想好怎么写再补上。-结尾有解释,最近得病
在和道长对话中选择跟随去门派的选项,我们直接触发加载新场景的方法。(主角不销毁)

六、任务系统

接上,到达新场景开始做任务,这里我们选择了跟随仙人来到门派的支线,流程为咱们接近河流按E接水,然后返回道长的位置交付任务,获得积分,积分够100触发新对话加入内门,加人内门游戏结束。

1、表现层

第一步我们在新场景设置一个发布任务和领取奖励的NPC,叫白帽道长吧;再用蓝色cube画出一条河流。

在这里插入图片描述
对话安排,windows左键框选一个地区后按住ctrl+alt再松开鼠标即可打组group,就是下面的说明框框。mac按键改为shift+control。
在这里插入图片描述

2、逻辑层

首先注意,这里其实是可以理解有两个任务的也可以是一个,上图【接任务】和【挑水任务】是挑水任务,完成奖励是获得积分;而【积分任务】是积分=100达成了,也可以算一个任务。当然该插件有任务嵌套,一个大任务可以包含小任务是否完成,我们学习循序渐进先来最简单的。
(1)自带任务系统学习(只展示挑水任务):我们在Menu里面勾选使用自带的任务系统,添上任务的各个信息。
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e79e371ef184239a671a34371bd2349.png添加任务需要的实体,可使用[var=varName] 和[lua(code)]两种方式,下图1添加变量水,图2设置任务显示信息。在这里插入图片描述

在这里插入图片描述

回到对话层,下图1为老道和你开始对话的说辞,图2为结束对话->触发激活任务,也就是说接任务后这些对话不会再有了。(别忘了点Apply按钮)
在这里插入图片描述
在这里插入图片描述

【挑水任务】无限触发,所以没设完成状态。如下图。
在这里插入图片描述

接下来设置场景组件,给河流添加如下两个脚本,并在【Actions】zhong tianjia [Run Lua Code],绑定我们右键点击触发的事件->挑水。Usable值设为5。
在这里插入图片描述
然后把白眉身上的脚本按照铁匠搞一遍即可,大功告成。
在这里插入图片描述

七、额外说明

这篇文章花了我不少时间去写,囊括了该基本的用法,小点的项目应该是够用了。进阶内容我会总结下,就是一些表格用法、多语言、保存之类的。
其他的不多说了,希望有人能用这个插件实现自己想要的对话效果吧。

总结

其实该剧情是我开发的游戏里面的简化版本,本来文章差不多写好了,奈何突然新冠感染了,床都起不来在家硬躺了10天,今天起来整理了下上传。下期预告:本地化语言。

大家有什么问题可以留言,有什么想法也欢迎讨论。

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值