如何製作一條弧線

功能效果展示

 

運行環境

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個零件如下圖所示擺放位置:

 

二、核心功能搭建過程

工作區內創建一個服務器腳本。如下圖所示:

編寫服務器腳本如下:

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()
    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
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零件做一個弧線的運動啦。如果有什麼問題或者有更好的實現方式,大家可以在下方積極交流討論,我們也會參與進來和大家一起分享經驗,期望能和大家共同進步~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章