功能效果展示
運行環境
Win7,Win8,Win10
Reworld版本 體驗版
vc_redist.x64 運行環境
針對零基礎讀者的補充
下載安裝 Reworld對應版本
Reworld官網鏈接:http://www.reworlder.com/
Reworld創作者之家論壇:http://bbs.reworlder.com
下載後安裝後註冊賬號打開空地圖
下載安裝 vc_redist.x64.rar運行環境
思路分析
想要製作一個弧線,我們可以使用貝塞爾曲線來實現這個效果,我們讓一個零件在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零件做一個弧線的運動啦。如果有什麼問題或者有更好的實現方式,大家可以在下方積極交流討論,我們也會參與進來和大家一起分享經驗,期望能和大家共同進步~~