功能效果展示

运行环境

Win7,Win8,Win10

Reworld版本 体验版

vc_redist.x64 运行环境

针对零基础读者的补充

下载安装 Reworld对应版本

Reworld官网链接:http://www.reworlder.com/

下载后安装后注册账号打开空地图

下载安装 vc_redist.x64.rar运行环境

redist.x64下载链接

思路分析

Reworld有3种类型的脚本,适用于不同场景

服务器脚本:处理游戏内所有内容·(UI除外)

客户端脚本:处理游戏内UI。也可以处理游戏内容,但是属于本地内容改变,多人游戏其他玩家看不到

通用模块脚本:定义通用数据和通用方法

服务器脚本和客户端脚本属于2个脚本环境,互相是不能调用对方定义的数据和方法的。这个时候就需要通用模块脚本,使用通用模块脚本写的代码服务器脚本和客户端脚本都能使用。它们使用的同一份代码,但只是运行前,运行后相当于2个脚本环境各自new了一个对象,在服务器脚本修改属性,客户端脚本是不会改变的,并不能使用通用模块脚本来充当服务器脚本和客户端脚本的桥梁。通用模块脚本的用处就是定义游戏数据和通用的方法。

下面是官方通用模块脚本使用例子

通用模块脚本:

mod = {}
mod.a = "hello"
mod.b = "world"
function mod.ab()c = RWObject.Create("Part")c.Name = mod.a..mod.bend
return mod

服务器脚本:

a = RWrequire(WorkSpace["通用模块脚本"])
print(a.a)
print(a.b)
a.ab()

玩家与NPC对话

游戏内有2个NPC角色分别是战士导师和法师导师,NPC有好感度不同的好感度会触发不同的动作和不同的对话,靠近NPC会弹出对话UI,为演示功能好感度大于40就不会弹出对话。点击对话结束增加好感度,对话未结束离开NPC减少好感度。

案例主要演示通用模块脚本定义数据的NPC数据和定义方法的NPC方法,NPC数据:NPC角色动作和对话数据。NPC方法:获取NPC角色数据的方法。使用通用模块脚本定义,通过引用服务器脚本和客户端脚本都能直接调用。

通用模块脚本和NPC搭建

一、搭建过程

1.按照下面图片在工作区中创建通用模块脚本和文件夹,将通用模块脚本重命名为NPC方法,如下图所示:

编写NPC方法脚本如下:

--NPC方法
local this={}
this.parent=script.Parent--增加NPC好感度,返回NPC好感度
--参数 1.NPC角色 2.好感度
function this.addFavor(npc,favor)npc.好感度.Value=npc.好感度.Value+favorreturn npc.好感度.Value
end--获取对话
--参数 1.NPC角色
function this.getTalk(npc)local data=RWrequire(npc.NPC数据)local favor=npc.好感度.Valuelocal len=#data.talksfor i=1,len,1 doif data.talks[i].favor >= favor thenreturn data.talks[i].talkendend
end--获取动作
--参数 1.NPC角色
function this.getAction(npc)local data=RWrequire(npc.NPC数据)local favor=npc.好感度.Valuelocal len=#data.actionsfor i=1,len,1 doif data.actions[i].favor >= favor thenreturn data.actions[i].actionendend
endreturn this

2.先在工作区中新建一个角色,重命名为战士导师,在角色下新增通用模块脚本重命名为NPC数据,新增动作重命名为action并且修改本地动作名为yaotou,新增一个整数值重命名为好感度。完成后复制该角色并重命名为法师导师。如下图所示:

编写战士导师NPC数据脚本如下:

--NPC数据 战士
local this={}
this.parent=script.Parent
--动作
this.actions={{favor=0,action='yaotou'},{favor=10,action='showmuscle1'},{favor=30,action='showmuscle2'}}
--对话
this.talks={{favor=0,talk={'你好,我是'..script.Parent.Name,'新来的冒险者,欢迎来到重启世界'}},{favor=10,talk={'很高兴再次见到你冒险者','你现在太弱了,还不能转职'}},{favor=30,talk={'好久不见,冒险者','你经历了什么,变得如此强大','来转职战士吧,一拳一个脆皮法师'}}}return this

编写法师导师NPC数据脚本如下:

--NPC数据 法师
local this={}
this.parent=script.Parent
--动作
this.actions={{favor=0,action='yaotou'},{favor=10,action='youtaishou'},{favor=30,action='wave'}}
--对话
this.talks={{favor=0,talk={'你好,我是'..script.Parent.Name,'新来的冒险者,欢迎来到重启世界'}},{favor=10,talk={'很高兴再次见到你冒险者','你现在太弱了,还不能转职'}},{favor=30,talk={'好久不见,冒险者','你经历了什么,变得如此强大','想成为法师吗,魔法令人着迷'}}}return this

3.在界面初始化下新增一个2D容器界面重命名为talkUI,在talkUI下新增一个文本控件,新增一个服务器脚本重命名为按照talkUI_C。如下图所示:

编写talkUI_C脚本如下:

--对话界面
local this={}
this.parent=script.Parent
this.conversation=nil
this.conversationIndex=1
this.npcMethod=RWrequire(WorkSpace["NPC方法"])
this.npc=nilfunction this.main()this.parent.GuiMouseLeftUp:Connect(this.guiMouseLeftUp)MessageEvent.ClientEventCallBack("showTalkUI"):Connect(this.showUIECB)MessageEvent.ClientEventCallBack("hideTalkUI"):Connect(this.hideUIECB)
end--界面点击
function this.guiMouseLeftUp(x,y) if this.conversationIndex<#this.conversation thenthis.conversationIndex=this.conversationIndex+1this.showConversation()elseif this.conversationIndex==#this.conversation thenthis.parent.IsVisable =falsethis.npcMethod.addFavor(this.npc,15)end
end
--显示界面
function this.showUIECB(npcName)this.parent.IsVisable =true
this.npc=WorkSpace.npc_F[npcName]this.conversation=this.npcMethod.getTalk(this.npc)this.conversationIndex=1this.showConversation()
end--隐藏界面
function this.hideUIECB()this.parent.IsVisable =false
end--显示对话
function this.showConversation()local con=this.conversation[this.conversationIndex]this.parent.文本控件.Text=con
endthis.main()

4.在玩家初始化——角色初始化脚本下创建Player_S服务器脚本,如下图所示:

编写Player_S服务器脚本如下:

--玩家
local this={}
this.parent=script.Parent
this.npcArr=nil
this.interactNPC=nil
this.npcMethod=RWrequire(WorkSpace["NPC方法"])function this.main()this.npcArr=WorkSpace.npc_F:GetAllChild()GameRun.Update:Connect(this.Update)
end--帧频函数
function this.Update(delta)local len=#this.npcArrlocal distance = nillocal minDistance = 1.5local npc=nilfor i=1,len,1 dodistance = Vector3.Distance(this.parent.Position,this.npcArr[i].Position)if distance < minDistance and this.npcMethod.addFavor(this.npcArr[i],0)<40 thenminDistance=distancenpc=this.npcArr[i]endendif this.interactNPC==nil and npc~= nil thenprint('接触NPC:',tostring(npc.Name))npc.action.LocalClipId =this.npcMethod.getAction(npc)npc.action:PlayAnimation()MessageEvent:FireClient(this.parent.PlayerId,"showTalkUI",npc.Name)elseif this.interactNPC~=nil and npc== nil thenprint('离开NPC:',tostring(this.interactNPC.Name))this.npcMethod.addFavor(this.interactNPC,-5)MessageEvent:FireClient(this.parent.PlayerId,"hideTalkUI")endthis.interactNPC=npc
endthis.main()

二、补充说明

1.什么是工作区?

工作区中的对象是会被可视化显示到3D场景中的,并且只有在工作区中的对象才会发生物理交互。

服务对象。

不可创建。

不可复制。

不可删除。

2.什么是通用模块脚本?

脚本不会自动执行,通常用来定义函数或函数组;客户端和服务器都可以访问脚本内容,调用脚本中的函数。

3.什么是服务器脚本?

只会在服务器运行的Lua脚本代码,用于编写服务器逻辑。

4.为什么要使用服务器脚本?

基于敌人跟随攻击功能用于单人和多人等不同环境,所以采用通用的服务器脚本。

  1. 服务器脚本与客户端脚本不同,客户端执行的操作只有本地客户端,也就是玩家自己有效。而服务器执行的操作不仅针对单人有效,还针对与服务器相连的所有客户端同步生效。
  2. 在多人游戏中,如果这个对象的变化是针对一个人的,必须在客户端脚本进行编写;如果这个对象的变化是针对所有人的,那就必须在服务器脚本进行编写。
  3. 对于只能在客户端脚本修改的对象,如何让服务器知晓变化结果是很重要的。这里采用传统游戏的制作流程,也就是在客户端进行修改,把修改后的结果通过与服务器通信的方式发送到服务器,再通过服务器进行逻辑运算,把执行结果再同步给所有客户端。

好了,接下来我们点击开始游戏就可以了,如果有什么问题或者有更好的实现方式,大家可以在下方积极交流讨论,我们也会参与进来和大家一起分享经验,期望能和大家共同进步~~

通用模块脚本使用案例:玩家与NPC对话相关推荐

  1. 超市百货电商app移动端原型+通用模块全局规则说明+超市电商后台管理web端原型+超市电商产品原型及需求文档+业务后台(商品管理+广告管理+活动管理)

    作品介绍:Axure原型内容主要包括:超市百货电商app移动端原型+文档变更记录+名词术语说明+产品业务功能框架+通用模块和全局规则说明(消息推送机制+输入提交规则+图片加载机制+权限类提示说明+搜索 ...

  2. Python之re模块讲解及其案例举例

    Python之re模块讲解及其案例举例 文章目录 Python之re模块讲解及其案例举例 一.re模块简介 二.正则表达式的基本概念 1.正则表达式的语法介绍: 2.Python中的正则表达式模块 3 ...

  3. 100个Linux Shell脚本经典案例

    kill `ps -ef | grep redis | awk '{print $2}'` grep -w '\|aa\|bb'​​​​​​​ Linux 根据端口号杀进程的.sh脚本_xie_app ...

  4. 在html中使用thymeleaf编写通用模块

    在编写页面时,常常会需要用到通用模块,比如header部分.footer部分等. 项目前端使用的是themeleaf模板引擎,下面简单介绍下使用themeleaf写header通用模块: 1. 通用部 ...

  5. Openstack_通用模块_Oslo_vmware 创建 vCenter 虚拟机快照

    目录 目录 前文列表 创建虚拟机快照 最后 前文列表 Python Module_oslo.vmware_连接 vCenter Openstack_通用模块_Oslo_vmware 创建/删除 vCe ...

  6. Openstack_通用模块_Oslo_vmware 创建/删除 vCenter 虚拟机

    目录 目录 oslovmware Connect to vCenter Server Create VirtualMachine for vCenter 常用的虚拟机配置项 删除虚拟机 oslo.vm ...

  7. 【强烈推荐】如何解决JQuery类Post方式的跨域问题 - 空山雪林通用模块设计工作室 - ITeye技术网站...

    [强烈推荐]如何解决JQuery类Post方式的跨域问题 - 空山雪林通用模块设计工作室 - ITeye技术网站 [强烈推荐]如何解决JQuery类Post方式的跨域问题 博客分类:核心代码片段 jQ ...

  8. Mysql 脚本兼容性测试_MySQL 测试小脚本〔案例〕

    MySQL 测试小脚本[案例] 经常有人在msn上问我,如何做一个简单的测试.如insert数据到表中的行为. 比较myisam和innodb等. 在这里将自己写的一个小脚本放上来,希望你们停止骚扰我 ...

  9. 大数据分析技术架构的通用模块

    对于企业来说,坐拥庞大的数据资源,想要实现大数据分析,首先要建立自己的大数据系统平台,每个公司都有自己的具体业务场景,因此对大数据平台的要求也不同.今天我们仅从通用的角度,来聊聊大数据分析需要什么技术 ...

  10. Python爬虫之Requests模块巩固深入案例

    爬虫之Requests模块巩固深入案例 requests实战之网页采集器 requests实战之破解百度翻译 requests实战之豆瓣电影爬取 requests实战之肯德基餐厅位置爬取 reques ...

最新文章

  1. 【神经网络】(6) 卷积神经网络(VGG16),案例:鸟类图片4分类
  2. 利用jsoncpp将json字符串转换为Vector
  3. armbian安装图形桌面_必看贴:Centos7安装Xrdp远程桌面服务
  4. 项目: 用Easyx绘制围棋和象棋的棋盘
  5. 用SI 和 DI实现字符串的复制
  6. sublime text 食用笔记
  7. 给SAP Spartacus开源项目提交代码时的注意事项
  8. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎
  9. centos oracle 安装 踩坑实录 (三:踩坑与填坑大全)
  10. j2ee02 集合框架
  11. 2007年考研数学一解析pdf
  12. 2022 年最佳开源软件出炉
  13. 吴恩达机器学习(一)—— 简介
  14. HBuilder没有显示表格边框
  15. 婴儿脸上起湿疹吃什么好
  16. 【UV打印机】电气之光电传感器
  17. python实现模仿银行ATM机
  18. 计算机网络专业运动会入场式,这所学校运动会开幕式亮了!各方阵带着专业C位亮相...
  19. 【038】MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义?
  20. Codeforces Beta Round #82 (Div. 2) C. Buns(多重背包)

热门文章

  1. 微信小程序自定义tab切换组件
  2. python vtk_Python vtk.vtkRenderer方法代码示例
  3. spring事务和加可重入锁解决库存超卖遇到的问题
  4. idea中的maven项目的xml文件的xmlns报错的解决办法
  5. C++验证奇偶性时求余运算%和位运算的速度比较
  6. openg和VS2010的环境配置
  7. linux make menuconfig快速查找配置项
  8. 快速生成文件夹内包含的的所有文件的文件名列表
  9. ImageMagick (Magick++ for C++) configuration in Visual Studio 2012
  10. epub与mobi转换工具