lua 游戏开发(传送)传送阵实例

目录

  • Description
  • place
    • 地形,脚本
    • 服务器
  • teleport
    • 劣势
    • 优势
    • 实现
  • moveto
    • 地图交互

Description

teleport:在同一个场景里的玩家会受到游戏循环的影响,可以通过teleport的方式,在不同场景制定不同的自然法则,灯光等。
moveto: 在同一个place下的移动
这里将说明如何创建一个不同的场景并传送。也会对简单带

place

Teleport的指向是place的话,玩家会在同一个服务器中,传送到不同的场景里。玩家数受到服务器限制。也可以通过传送到不同的服务器,这篇文章仅介绍place间的传送。

地形,脚本

不同的place的脚本,事件,workspace,是不同的.不会存在相互的影响。可以用这样的方法来串联使用不同地形编辑器搭建的场景,加载不同的光源。也可以通过不同的循环,界定不同的游戏法则。

服务器

当一个场景没有玩家时,会被服务器给注销以节约资源。当需要传送到新场景时,服务器内没有新场景会创建一个新的场景,并执行代码循环。之后有新的传送会被现有的场景中。所以对于大厅等待固定时常然后传送的游戏会有无法解决的问题。
譬如大厅等待60秒,游戏60秒。
当第一批大厅内玩家被传走,大厅关闭。
在30s后,有新玩家进入服务器,开辟新的大厅,开始计时。
当游戏中的玩家返回到大厅时,他们会发现,下一句游戏将会在30s后开局(甚至因为加载而更少)
而这个是由于规则本身带来的问题。所以teleport并不适合于那些对时间有要求的游戏。反而在自由探索世界是一个很好的资源节约。

teleport

劣势

通信延迟
小游戏场景切换存在加载延迟

大厅

投票
玩家等待_大厅
新地图
时间到
上局投票的地图

游戏

根据投票创建
删除上局地图
大厅
地图1.新
地图1.旧
玩家游戏_地图2

其中最为明显的范例是 死亡跑酷.
而另一款小游戏则使用全随机下一个游戏,来规避这一种有些不愉快的游戏体验: 史诗迷你小游戏.
顺应用户游戏习惯还是进入游戏时候加载等待(可以用图片遮挡),取决于你的需求。

优势

适合自由世界的探索,将世界地图划分成为小块的加载(类比于天龙八部/诛仙/魔兽世界/剑侠情缘3/天涯明月刀)地图的区分
对与不计时间,玩家可以自由选择的大游戏是更优的选择.

实现

在studio中无法调用传送服务器,需要到player中测试。
此处是一个碰触传送阵的dome

local placeID_0 = 5411490997--传送场景ID
local TeleportService = game:GetService("TeleportService")--服务器调用

local function onPartTouch(otherPart)
	local player = game.Players:GetPlayerFromCharacter(otherPart.Parent)
	
	if player then
	    local Players = game:GetService("Players")
		local human=Players:GetPlayers()
			
local success, result = pcall(function()
    return TeleportService:TeleportPartyAsync(placeID_0,human)
		end)--pcall函数第一个返回值是函数的运行状态(true,false),第二个返回值是pcall中函数的返回值。 
		
if success then
    local jobId = result
    print("Players teleported to "..jobId)
else
    warn(result)
end
	end
end

script.Parent.Touched:Connect(onPartTouch)

通过pcall和之后的if success语句,可以确保执行的安全。

moveto

小游戏一般使用

hit.Parent:moveTo(Position) 

的方式实现传送
通常是在进行当前游戏时候 加载另一个新的地图。(也就是说,本轮投票需要在下一轮才能玩的到)通过这样限制的减少了进入游戏时候的卡顿现象。

地图交互

两个相互穿越的下水盖


local TeleportPart = {
     game.Workspace.Teleport.Part11,game.Workspace.Teleport.Part12, game.Workspace.Teleport.Part21,game.Workspace.Teleport.Part22,game.Workspace.Teleport.Part31,game.Workspace.Teleport.Part32}
local partCDList = {
     false, false, false,false,false,false}
local toolman
for index = 1, #TeleportPart, 1 do --1,2,3
	    TeleportPart[index].Touched:Connect(function(hitPart)--碰到时
		local player = game.Players:GetPlayerFromCharacter(hitPart.Parent)
		if not partCDList[index] and player == game.Players.LocalPlayer then
			if (index%2)~=0 then --单数
				toolman=index+1
			else
				toolman=index-1
		   	end
	       	game.ReplicatedStorage.Events.teleportevent:FireServer(TeleportPart[toolman].Position,hitPart)
			partCDList[toolman] = true
			TeleportPart[toolman].Transparency=1
			wait(1)
			partCDList[toolman] = false
			TeleportPart[toolman].Transparency=0
			--不让一直判定
		end
	end)
end

上诉代码实现了一个互通的穿越。并设置了cd,不让来传送

你可能感兴趣的:(游戏,游戏开发,lua,脚本语言)