Top.Mail.Ru
Ответы

Нужна помощь с кодом roblox studio

Привет. Недавно начал интересоваться языком lua и движком роблокса в частности. В процессе обучения роблокс студии возник странный баг, об который я долго ломал голову. Не знаю, подходящее ли это место для подобных вопросов, но процесс "получения членства" роблокс форума такооой затянутый, что решил спросить здесь. Ниже мой код:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
game.ReplicatedStorage.RemoteEvents.Weapons.Cross.Cross_hit1.OnServerEvent:Connect(function(player) --если пойман сигнал ремоут ивента
	task.wait(0.15)
	
	local hitbox = Instance.new("Part")
	
	hitbox.Massless = true
	hitbox.Anchored = false
	hitbox.Transparency = 0.7
	hitbox.Color = Color3.new(1, 0, 0)
	hitbox.CanCollide = false
	hitbox.CastShadow = false
	hitbox.Size = Vector3.new(6, 4.5, 6)
	hitbox.Parent = workspace
	hitbox.CFrame = player.Character.HumanoidRootPart.CFrame * CFrame.new(0, -0.5,-2.2) --CFrame хитбокса = CFrame главного парта игрока, но координата Z смещена но -2.2, Y смещена на -0.5 (вниз) (относительно главного парта персонажа)
	
	local hit = false
	
	local weld = Instance.new("WeldConstraint")
	weld.Part0 = player.Character.HumanoidRootPart
	weld.Part1 = hitbox
	weld.Parent = hitbox
	
	task.wait(0.01)
	
	local function hitboxHandler()

		while wait(0) and hitbox ~= nil do
			local partsInRegion = workspace:GetPartsInPart(hitbox) --возвращаем все объекты, которые находятся в hitbox
			for index, part in pairs(partsInRegion) do
				local enemy = part.Parent
				if enemy and enemy:FindFirstChild("Humanoid") and enemy.Name ~= player.Name and enemy.Humanoid.Health > 0 then
					if hit then return end --hit = true если объект был ударен, следовательно если так то енд
					if hitbox then

						enemy:FindFirstChild("Humanoid"):TakeDamage(40)
						hit = true
					end
				end
			end
		end
	end
	
	task.spawn(function()
		wait(0.27)
		game.Debris:AddItem(hitbox, 0.01)  --функция удаляет парт с задержкой 0.01
		hitbox = nil
	end)

	hitboxHandler()
end)

Код ловит сигнал ремоут ивента и создает "хитбокс" атаки игрока (для этой цели я выбрал создавать обычный парт и соединять его с персонажем с помощью weld). В коде прописано, что урон наносится один раз и только тому объекту, который находится внутри хитбокса (который парт). Наличие этого объекта постоянно проверяется, пока хитбокс не исчезает (цикл while wait(0) and hitbox ~= nil do). Собственно, со статичными объектами все работает отлично, но когда я протестировал оружие на движущемся противнике, столкнулся с этим:

https://cloud.mail.ru/public/hEoj/kaMaJV9cy

Красный куб, что возникает при ударе - хитбокс. И, как отчетливо видно на видео, враг, который меня преследует, ни разу ни находится в его приделах. Тем не менее, враг все равно получает урон. Странно... Тут же и демонстрация работы оружия на статичном противнике:

https://cloud.mail.ru/public/UFEw/3NGj8VH3M

Как видите, никаких странностей. Враг получает урон только тогда, когда находится внутри хитбокса атаки, или когда хитбокс атаки задевает его при повороте камеры игрока. (Большой полупрозрачный объект, что проваливается сквозь пол при смерти врага - сделан в качестве "индикации", и на проблему никак не влияет.)

Прошу прощения за качество видео, заранее спасибо за потенциальную помощь. Я еще совсем новичок в кодинге и подобных вещах, поэтому мог допустить некоторые ошибки. И, если же я все же ошибся в выборе платформы для своего вопроса, прошу вас сильно не ругаться.)



Видео по теме