Я не знаю, с чего начать, поэтому прошу помощи. Я хочу создать сценарий, который определяет, ударился ли человек по этой детали.
Может ли кто-нибудь дать идею?
local Debris = game:GetService("Debris")
local wall = script.Parent
script.Parent.Touched:Connect(function(hit)
if hit.Name ~= "Rails" then
if hit.Name ~= "Baseplate" then
if hit.Name ~= "Essential" then
local explode = Instance.new("Explosion")
explode.Parent = hit
explode.Position = hit.Position
hit:BreakJoints()
Debris:AddItem(hit, 5)
end
end
end
end)
Спасибо
Мы можем использовать FindFirstAncestorOfClass и FindFirstChild вместе, чтобы определить, является ли часть дочерним элементом Player.Character.
Если у hit
есть предок Модель, а у этого предка есть Humanoid
, мы можем предположить, что Модель — это Player.Character
.
В приведенном ниже сценарии я сделал так, что при каждом касании script.Parent
мы проверяем наличие предка Модели, а затем наличие Humanoid
у этой Модели. Если да, то мы добавим к нему взрыв.
local Debris = game:GetService("Debris")
local wall = script.Parent
script.Parent.Touched:Connect(function(hit)
local characterModel = hit:FindFirstAncestorOfClass("Model")
if characterModel then
local humanoid = characterModel:FindFirstChild("Humanoid")
if humanoid then
local explode = Instance.new("Explosion")
explode.Parent = hit
explode.Position = hit.Position
hit:BreakJoints()
Debris:AddItem(hit, 5)
end
end
end)
Обратите внимание, что вам может потребоваться изменить код explode
. В вашем вопросе неясно, что делать, если мы ударим по Плееру, поэтому я оставил все как есть.
Вы можете использовать hit
для части игрока, по которому мы попали, humanoid
для гуманоида игрока и characterModel
для персонажа игрока.
@Yorick Да, это может быть неверно для NPC без гуманоида, но поскольку мы хотим найти только игрока, все должно быть в порядке. Однако в большинстве случаев NPC будут использовать гуманоидов, потому что им нужно ходить или делать то, что могут делать только гуманоиды (по крайней мере, без изобретения гуманоидов заново).
это также будет считать аксессуары/инструменты хитбоксом, что поставит некоторых игроков в невыгодное положение по сравнению с другими. @Райан
@Yorick Вы можете включить, будут ли аксессуары учитываться при столкновении игрока, в настройках игры. Вы должны установить его на внутреннее столкновение, что означает, что только реальная установка будет запускать событие .Touched, и вы можете иметь аксессуары настолько больших, насколько захотите, не влияя при этом на впечатления игрока, кроме, возможно, видимости. Дополнительную информацию см. в разделе Границы столкновений.
Событие Touched привязано к владению сетью, поэтому не имеет значения, создали ли вы для этого настройку коллизии. если клиент владеет сетевым аксессуаром (а он так и есть), он вызовет событие, что поставит в невыгодное положение некоторых игроков.
вы можете проверить, является ли часть удара частью внутри персонажа, проверив, является ли родительский элемент персонажем, используя метод GetPlayerFromCharacter.
local Players = game:GetService("Players");
script.Parent.Touched:Connect(function(hit)
local Character = hit.Parent
local Player = Players:GetPlayerFromCharacter(Character);
if (not Player) then return; end -- exit function, no player touched
local explode = Instance.new("Explosion", hit);
explode.Position = hit.Position;
hit:BreakJoints();
Debris:AddItem(hit, 5);
end);
hit.Parent
может дать ложноотрицательный результат, если часть вложена, как Character.Part.Part
. Он вернет false, хотя в вашем методе он все еще является частью персонажа. Хотя это работает, если часть равна Character.Part
, а дальше, например, Character.Part.Part.Part
, она вернет false. Я бы посоветовал вам использовать hit:FindFirstAncestorOfClass("Model")
, чтобы мы могли найти родительский класс, являющийся классом модели, но это также может привести к сбою, если у нас есть Character.Model.Model
, но в моем ответе все еще есть эта проблема.
@RyanLuu Я не согласен, потому что аксессуары/инструменты не должны быть частью хитбокса ;)
это может быть ложью для NPC