3124692 发表于 2019-12-17 16:05

Roblox 开发过程中的一些小技巧

Roblox 开发过程中的一些小技巧,希望能对大家有帮助
1. 建筑方块预览在制作建造类方块游戏的时候,我们可能需要提前让玩家知道,一个东西摆放出来的位置、样子等等。这个时候我们希望能显示半透或者其他什么效果的实际模型给玩家预览。Roblox为了安全考虑,目前已经禁止在LocalScript中创建Part等模型(以前有个模式可以,现在正在废弃,不要使用)。那么怎么实现我们这个需求呢? 由服务器创建一个目标模型,挂载玩家的Player下面。不要放在workspace下面,以免别的玩家看到。客户端使用一个脚本,来定时或者其他方式检测预览模型是否存在,如果存在就由LocalScript将预览模型挂到workspace下面。客户端的这个动作只会在本客户端生效,不会影响其他人,别人依然无法看到。根据逻辑需求,设置预览模型的位置,以正常预览。预览模型使用固定的名字,方便查找服务器创建新的预览模型时,需要删除老的预览模型问题: 服务器重新创建预览模型时,不会触发它的父节点的ChildAdded事件,可能是因为同名的问题。所以最好不要监听这个事件来处理,定时或者每帧检测都行。2. 代码组织管理Roblox本身不支持版本管理,存储到本地也是一个完整的二进制文件(建议多备份)那么当项目大了之后,多个脚本如何管理?想要回滚到以前的版本怎么办?一个简单的方法是每天定期备份二进制,并以时间作为后缀。另一个方法稍微麻烦一点。将lua脚本每个都导出来,然后使用git或者其他版本工具定期提交。这样就有自己的版本记录了。Roblox的脚本导出比较坑的是,每次只能导出单个脚本,选择多个则只能导出二进制了(也可以选择xml的方式,也是可以阅读的内容了,但是没法跟踪单个文件的修改记录)。所以这里写了一个小插件来导出所有的脚本(由于没法自动保存,也只能弹出另存的对话框,挨个确认以及覆盖就好了)。下面的代码要在plugin中执行。 local toolbar = plugin:CreateToolbar("BlockTools")local saveTool = toolbar:CreateButton("SaveScripts", "auto save", "rbxassetid://3988191156")local function SaveFoldor(folder)        local tbAll = folder:GetChildren()        for _, obj in ipairs(tbAll) do                if obj:IsA("LuaSourceContainer")then      -- 过滤脚本                        selection:Set({obj})                        plugin:PromptSaveSelection(obj.Name)    -- 弹出保存对话框                elseif obj:IsA("Folder") then    -- 遍历文件夹                        SaveFoldor(obj)                end        endend local function onBtnSave()        saveTool:SetActive(false)-- 设置非选中状态         -- 保存各个脚本到lua文件添加有放脚本的地方目录或者service        SaveFoldor(game:GetService("ReplicatedFirst"))        SaveFoldor(game:GetService("ReplicatedStorage"))        SaveFoldor(game:GetService("ServerScriptService"))        SaveFoldor(game:GetService("StarterPlayer"))endsaveTool.Click:Connect(onBtnSave)执行这个脚本并保存各个脚本之后,我们就可以自行使用git来管理了。 代码组织假如只有一个place则没必要。如果有多个place,那么很大可能各种服务器和客户端的代码都是需要重用的。Roblox也没有提供相应的直接的方式来处理。简单暴力的方式就是,在不同的place之间拷贝,这种硬拷贝的方式的各种问题也不用多说,懂的都懂。不过他有个Packages的功能,并且能够同步。所以利用这个功能我们可以在不同的place中同步脚本。例如,在ServerScriptService下放的都是Server逻辑代码。那么不要直接将代码放在ServerScriptService之下,而是 先建一个Folder文件夹,例如叫ServerLogic,然后将代码都放在这个文件夹之下,再在这个文件夹上右键,选择Convert to package ,按提示操作之后就能够将这个文件夹打成一个Package。在另一个place中,发现并不能直接找到前面的Package,这个时候直接使用拷贝的方式,将ServerLogic拷贝,在新place中的ServerScriptService上Paste into,就可以了。建立Package之后,修改任何脚本,ServerLogic上会出现一个黄色原点,表示已修改。修改完毕之后,右键ServerLogic 选择 Publish Changes to Package 来同步到远端(这个跟版本管理有点像,可惜没有版本记录,只会记录一个最新版本)更新之后,在其他place中ServerLogic 的右侧会出现一个绿色小图标,表示远端有更新,这个时候可以右键并选择Get Latest ...这就完成了不同place之间脚本的同步。需要注意的是,提前使用文件夹组织好脚本,不同Service下面的操作一致,多建立几个Package就好了。 现在问题来了:不同place之间肯定还是有很多不同的代码逻辑,这些脚本又怎么组织呢?其实只要不放在Package下面,就不会同步了。可以放在一个单独的目录中。另一个方法是都放在Package下面,然后使用条件来执行不同的脚本。例如在ServerScriptService下面设置一个变量来控制各个服务器的类型(不放在package下面)。这样脚本就能知道当前是什么样的place。 鉴于脚本没有什么固定的加载顺序,建议整个server只有一个Script脚本,其他都使用ModuleScript。只有那些非常独立,并且没有什么顺序依赖、数据依赖的内容可以放在独立的Script脚本中。 3. 面片制作Roblox没有直接创建面片的方法,可以通过在part下创建一个BlockMesh,然后把Mesh的Scale属性的xyz随便设置一个为0,则可以得到另外两个轴组成的面片。然后给上贴图上之后,可以做成双面显示。 可以用于显示一些场景中的图标,植物之类的面片。————————————————版权声明:本文为CSDN博主「吾爱豆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/bdalasja/article/details/102482006
页: [1]
查看完整版本: Roblox 开发过程中的一些小技巧