(禁止来自DevForums,在此处询问。)
基本上,一款名为"感染性微笑"的游戏在你成为"感染者"时有一个抓取系统;微笑者";。你拿着它们的时间越长,它们的转化就越多。当他们的生命值达到0时,他们会变成一个微笑者,就像玩家转换他们和其他人一样。
我该如何制作一个系统/抓取系统来做到这一点,但只是把它们弄得一团糟。(很明显,我想让玩家在一段时间后被淘汰!)
我也在研究一个布娃娃系统,所以我不会被完全用勺子舀着吃。
布娃娃脚本:完成!
抓取和碎布玩偶脚本:单击时显示抓取动画,但不显示抓取。
抓取只播放动画的脚本(LocalScript):
local userInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character
if not character or not character.Parent then
character = player.CharacterAdded:Wait()
end
local humanoid = character:WaitForChild("Humanoid")
local Animator = humanoid:WaitForChild("Animator")
local cooldown = false
local cooldowntime = 1
local grab = Instance.new("Animation")
grab.Name = "GrabAnim"
grab.AnimationId = "rbxassetid://7691396275"
game:GetService("ContentProvider"):PreloadAsync({grab})
local grabTrack = Animator:LoadAnimation(grab)
grabTrack.Priority = Enum.AnimationPriority.Core
grabTrack.Looped = false
grabTrack.Name = "GrabAnimTrack"
if(cooldown) then
wait(cooldowntime)
cooldown = false
return
end
game:GetService("UserInputService").InputBegan:Connect(function(inputObject, gameProcessed)
if inputObject.UserInputType == Enum.UserInputType.MouseButton1 then
if(cooldown) then
return
end
-- It'll return "Handle" half the time.
local Head = player.Character.Head
local D = Head.CFrame.LookVector * 10
local RayCast = workspace:Raycast(Head.Position,D)
if RayCast then
script.Parent.Lock:FireServer(RayCast.Instance)
end
cooldown = true
grabTrack:Play(0.09, 1, 1.2)
end
if(cooldown) then
wait(cooldowntime)
cooldown = false
return
end
end)
对于事件调用脚本(script):
local event = script.Parent:WaitForChild('Lock')
local arrested = false
local weld
event.OnServerEvent:Connect(function(plr, Target)
print(Target)
if Target.Name == "UpperTorso" or Target.Name == "LowerTorso" or Target.Parent:IsA("Accessory") then
arrested = true
coroutine.wrap(function()
while arrested == true do
Target.Anchored = true
Target.CFrame = plr.Character.HumanoidRootPart.CFrame * CFrame.new(0,0,-3)
wait()
end
end)()
elseif arrested then
arrested = false
end
end)
抢夺似乎又回来了;手柄";而不是像";UpperTorso";所以我不知道如何摆脱把手的东西。
您已经准备好了许多必要的部分。整个问题主要是确保事件链正确发生,并观察到不同的事件。
你错过的主要部分是如何";抓;另一个玩家。要做到这一点,你所要做的就是:
- 在抓取器和抓取器之间创建焊接或约束
- 将抓取的人形机器人的状态设置为碎布玩偶或物理
- 将抓取角色模型的网络所有权设置为服务器
这应该足以让你操纵其他玩家的角色。重要的是要知道这些事件需要在哪里处理。有些事情(如动画)需要在客户端播放,而其他事情(如冲突检测)则需要由服务器管理。
以下是您问题中的每一项操作的分解:
事件 | 操作 | 户端服务器端 | [/tr>|
---|---|---|---|
微笑者团队的一名玩家点击鼠标 | 垃圾邮件输入被消除 | x | |
播放动画 | x | ||
检测到与另一队球员的碰撞 | /td>x | [/tr>||
冷却开始消除额外点击 | |||
玩家被触摸 | 它们的控件被禁用 | x | /td>//tr>|
他们的角色布娃娃 | x | ||
抓取器和播放器之间的约束被创建 | /td>x | ||
网络对其角色的所有权授予抓取器 | /td>x | [/tr>||
他们的生命值降低 | /td>x | ||
它们会在一段时间后发布 | /td>x | ||
玩家的生命值降低 | 如果下降得太低,他们会切换团队 | ||
玩家从抓取中释放td> | 将它们连接到抓取器的约束被删除 | ||
网络所有权归还给他们 | /td>x | ||
他们重新控制了自己的角色 |
配件内部有一个把手。所以,如果你不想要手柄,只需移除部分。父级:IsA("附件")。此外,如果您希望光线投射忽略或直接进入附件,请首先制作一个包含所有附件的表,然后制作一个光线投射参数,并将该表添加到FilterDescendantsInstances中。确保FilterType是黑名单(它的默认值,所以不用担心)。或者,如果你想让头部看着附件,那么选择躯干,然后首先测试是否有躯干。如果存在,则将其设为local upperTorso = Target.Parent.Parent.UpperTorso
。
我是这里的初学者,但我使用love2d,并注意到当我调用mouse:IsDown()
时,它会多次调用我的函数,因为它捕捉到鼠标按钮在许多帧内都处于按下状态。
所以我做了一个函数:
Leftclick = 1
function mouseClicker ()
if mouse:IsDown() then
Leftclick = Leftclick -1
else
Leftclick =1
end
当我使用这个:
if Leftclick ==0 then
end
它可以防止很多疯狂。也许你可以用之类的东西
if leftclick < 0 then
我不知道这是否有助于解决垃圾邮件问题你提到的。