功能效果展示
运行环境
Win7,Win8,Win10
Reworld版本 体验版
vc_redist.x64 运行环境
针对零基础读者的补充
下载安装 Reworld对应版本
Reworld官网链接:http://www.reworlder.com/
Reworld创作者之家论坛:http://bbs.reworlder.com
下载后安装后注册账号打开空地图
下载安装vc_redist.x64.rar运行环境
redist.x64下载链接
思路分析
存储服务是Reworld编辑器提供的用于存储游戏中玩家数据的接口,在每次玩家进入游戏的时候都可以通过获取这些存储的数据来实现游戏状态的保留。下面我们来做最简单的一个数值存储,用最常见的金币作为例子。
存储服务的限制:
1、发布后必须多人才可存储。
2、存储效率:SetValue不可连续调用,一个数据的存储需消耗较长时间,连续存储会导致一些数据无法存储。
3、存储空间:在一个游戏中每个玩家总共只能存储512个字节的数据。
功能搭建
一、金币搭建过程
1.用圆柱压缩成一个钱币,贴上贴花。如果需要旋转漂浮就把重力取消再加上扭矩或者保持加速度。如下图所示:
2.金币的功能是,在角色触碰后增加玩家的金币数。金币被触碰后会消失,一段时间后在原位置重新出现一个金币。金币需要漂浮在空中,并且有旋转效果,所以取消金币的重力,并在金币下增加保持角速度。
3.玩家的金币数需要存储在玩家相关的对象上,才能实现每个玩家都有自己的金币。这里选择将数值用值对象的方式存储在玩家对象下。在玩家初始化->玩家初始化脚本中,添加一个文件夹,命名为预设值。在文件夹下添加整数值对象,命名为金币数。
4.在金币下添加服务器脚本,编写金币的脚本如下:
`local delaytime = 10--金币冷却时间`
`local istouch = ``true``--用来规避多次接触`
`script.Parent.TriggerEnter:Connect(function(res)`
`if` `res:IsClass(``"Avatar"``) then`
`if` `istouch == ``true` `then`
`istouch = ``false`
`coroutine.start(function()`
`local setpos = script.Parent.Position--记录金币的位置`
`script.Parent:Destroy()`
`local player = Players:GetPlayerByUserId(res.PlayerId)--通过角色的id获取玩家`
`local coinshad = player.玩家脚本.预设值.金币数--找到玩家下用来记录金币数的值`
`coinshad.Value = coinshad.Value + 1--金币数增加`
`local key = ``"Coin"`
`PlayerStoreData:SetValue(res.PlayerId, key, coinshad.Value)--将金币数值存储下来`
`coroutine.wait(delaytime)`
`local newcoin = ServerStorage.金币:Clone(WorkSpace)`
`newcoin.Position = setpos --将克隆的金币放在记录位置上`
`end)`
`end`
`end`
`end)`
金币制作完毕后需要在服务器存储中放入副本。
5.制作好了用来排行的数据,希望每次进入游戏时都可以保留上次的数据,所以需要将金币数存储为玩家的数据,使用玩家信息存储。在工作区或者服务器逻辑中创建服务器脚本,编写代码如下:
`Players.PlayerAdded:Connect(function(Uid) --玩家加载时触发`
`local player = Players:GetPlayerByUserId(Uid)`
`local Coins = player:WaitForChild(``"玩家脚本"``):WaitForChild(``"预设值"``):WaitForChild(``"金币数"``)`
`local key = ``"Coin"`
`if` `PlayerStoreData:GetValue(Uid, key) then--如果存储过金币值`
`Coins.Value = PlayerStoreData:GetValue(Uid, key)`
`end `
`end)`
二、显示界面搭建过程
1.在界面初始化下添加一个2D容器界面,命名为金币显示,在其中放一个图片控件显示金币图标,一个文本控件显示金币数量。分别命名为金币图和金币数。
2.在金币显示下添加客户端脚本:
local player = Players:GetLocalPlayer()
local getcoin = player:WaitForChild("玩家脚本"):WaitForChild("预设值"):WaitForChild("金币数")
local coinnum = GameUI:WaitForChild("金币显示"):WaitForChild("金币数")
local function CoinChange() -- 金币数值更改时显示
coinnum.Text = getcoin.Value
end
PropertyWatcherService:ListenPropertyChange(getcoin, "Value", CoinChange) -- 监测金币数的变化
补充说明
1.什么是2D容器界面?
2D容器界面是显示在玩家屏幕上的2DUI对象的主要存储对象。UI对象若要显示在编辑器中,必须作为容器控件的子级。
游戏运行后,存放在界面初始化下的界面会复制到玩家界面下,只有在玩家界面下的界面才能在游戏中显示。
2.什么是客户端脚本?
只会在客户端执行的脚本,执行的逻辑和表现也只会在本地客户端展现;可在以下几个文件目录下自动执行,客户端脚本在工作区下不会自动执行,需要放在以下对象里面:
1. 客户端最先加载 。
2. 工作区中的角色模型。玩家初始化中的角色初始化脚本,在运行后会自动移动到角色模型下。
3. 玩家列表中的玩家。玩家初始化中的玩家初始化脚本,在运行后会自动移动到玩家下
4. 玩家的玩家界面。界面初始化的脚本,在运行后会自动移动到玩家界面下。
3.什么是服务器脚本?
只会在服务器运行的Lua脚本代码,用于编写服务器逻辑。
好了,接下来我们运行游戏测试一下。如果有什么问题或者有更好的实现方式,大家可以在下方积极交流讨论,我们也会参与进来和大家一起分享经验,期望能和大家共同进步~~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。