如何在Reworld里写一个弧线

功能效果展示

运行环境

Win7,Win8,Win10

Reworld版本 体验版

vc_redist.x64 运行环境

针对零基础读者的补充

下载安装 Reworld对应版本

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

Reworld创作者之家论坛:http://bbs.reworlder.com

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

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

redist.x64下载链接

思路分析

想要制作一个弧线,我们可以使用贝塞尔曲线来实现这个效果,我们让一个零件在5个零件间不断的进行取点计算线段的距离,通过零件的运动就可以绘制出一条贝塞尔曲线。具体关于贝塞尔曲线的解释可以查看链接:贝塞尔曲线扫盲

功能搭建

一、零件搭建过程

工作区内创建5个零件,分别重命名为a,b,c,d,e。再创建一个零件重命名为ball,坐标与a相同。将6个零件如下图所示摆放位置:

如何在Reworld里写一个弧线_第1张图片

二、核心功能搭建过程

工作区内创建一个服务器脚本。如下图所示:

如何在Reworld里写一个弧线_第2张图片

编写服务器脚本如下:

local gameOjbet\_tran = {}    --路径物体里面存a,b,c,d,e
local point = {}             --路径列表
 
local ball = WorkSpace.ball      --移动物体
local Speed = 1    --速度
local Time1 = 0.01
local Timer = 0
local frame = 200  --帧率
local i = 2        --下坐标
--整个路径走的方向
local a = WorkSpace.a   
local b = WorkSpace.b
local c = WorkSpace.c
local d = WorkSpace.d
local e = WorkSpace.e
 
local m\_camera = WorkSpace.摄像机
local isgo = true
--------------------------------------------------------------------------------   
--使小球没曲线运动
--这里不能直接在for里以Point使用差值运算,看不到小球运算效果
--定义一个计时器,在相隔时间内进行一次差值运算。
local function Update()
    if isgo == true then
        Timer = Timer + Time.deltaTime
        if Timer > Time1 then
            Timer = 0
            ball.Position = Vector3.Lerp(point\[i - 1\], point\[i\], 1)    -- 移动
            i = i + 1
            if i >= #point then
                isgo = false
            end
        end
    end
end
m\_camera.CameraType = Enum.CameraType.Fixed
m\_camera.Position = Vector3(ball.Position.x,ball.Position.y,ball.Position.z)
 
local function Init()
    m\_camera.Subject = ball
 
    gameOjbet\_tran\[1\] = a
    gameOjbet\_tran\[2\] = b
    gameOjbet\_tran\[3\] = c 
    gameOjbet\_tran\[4\] = d       
    gameOjbet\_tran\[5\] = e   
    coroutine.start(function ()
    for j = 1,200, 1 do 
        --一
        coroutine.wait(0.0001) -- 延时检测 进行计算
        local pos1 = Vector3.Lerp(gameOjbet\_tran\[1\].Position, gameOjbet\_tran\[2\].Position, j / frame)
        local pos2 = Vector3.Lerp(gameOjbet\_tran\[2\].Position, gameOjbet\_tran\[3\].Position, j / frame)
        local pos3 = Vector3.Lerp(gameOjbet\_tran\[3\].Position, gameOjbet\_tran\[4\].Position, j / frame)
        local pos4 = Vector3.Lerp(gameOjbet\_tran\[4\].Position, gameOjbet\_tran\[5\].Position, j / frame)
        --二
        local pos1\_0 = Vector3.Lerp(pos1, pos2, j / frame)
        local pos1\_1 = Vector3.Lerp(pos2, pos3, j / frame)
        local pos1\_2 = Vector3.Lerp(pos3, pos4, j / frame)
        --三
        local pos2\_0 = Vector3.Lerp(pos1\_0, pos1\_1, j / frame)
        local pos2\_1 = Vector3.Lerp(pos1\_1, pos1\_2, j  / frame)
        --四
        local find = Vector3.Lerp(pos2\_0, pos2\_1, j / frame)
        point\[j\] = find    
    end
    print("开始跑了")
    GameRun.Update:Connect(Update)
    end)
end
Init()

补充说明

1.什么是工作区?

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

2.什么是服务器脚本?

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

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

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

好了,接下来我们开始游戏,名为ball的零件就会从a零件到e零件做一个弧线的运动啦。如果有什么问题或者有更好的实现方式,大家可以在下方积极交流讨论,我们也会参与进来和大家一起分享经验,期望能和大家共同进步~~

你可能感兴趣的