一个人是如何做到的,这样你就可以在靠近其他玩家的时候点击他们来抓住他们



(禁止来自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>/td>[/tr>/td>//tr>/td>/td>[/tr>/td>/td>/td>
事件 操作服务器端
微笑者团队的一名玩家点击鼠标 垃圾邮件输入被消除 x
播放动画 x
检测到与另一队球员的碰撞x
冷却开始消除额外点击
玩家被触摸 它们的控件被禁用 x
他们的角色布娃娃 x
抓取器和播放器之间的约束被创建x
网络对其角色的所有权授予抓取器x
他们的生命值降低x
它们会在一段时间后发布x
玩家的生命值降低 如果下降得太低,他们会切换团队
玩家从抓取中释放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

我不知道这是否有助于解决垃圾邮件问题你提到的。

最新更新