Как выполнить перевод скрипта с версии R15 на версию R6?

Как переписать данный скрипт для работы с R6, если ранее возникали проблемы, связанные с его функционированием при смерти персонажа? 

Вот мой текущий код, который взаимодействует с персонажем, а также включает второй скрипт для подсветки игрока: 
<pre><code class="lua">local RunService = game:GetService("RunService")

local plr = game.Players.LocalPlayer
local char = plr.Character or plr.CharacterAdded:Wait()
local root: BasePart = char:WaitForChild("HumanoidRootPart")
local cam = workspace.CurrentCamera

-- Clone character
char.Archivable = true
local fakeChar = char:Clone()
local fakeRoot: BasePart = fakeChar:WaitForChild("HumanoidRootPart")
fakeRoot.CanCollide = false
fakeChar.Name = "Fake" .. plr.Name
fakeChar.Parent = workspace

local scaleFactor = 0.999
local classesToRemove = {"Decal", "Texture", "SurfaceAppearance", "LocalScript", "Script", "Humanoid", "Clothing", "ShirtGraphic"}

for _, desc in fakeChar:GetDescendants() do
	if not desc:IsA("MeshPart") then continue end
	
	desc.CastShadow = false
	desc.Transparency = 0.9999999
	desc.Color = Color3.new(1, 1, 1)
	desc.Material = Enum.Material.Glass
	desc.TextureID = "rbxassetid://5307016674"
	desc.CollisionGroup = "CharacterHighlightMask"
	
	for _, child in desc:GetChildren() do
		if child:IsA("SurfaceAppearance") then child:Destroy() end
	end
end
fakeChar:ScaleTo(scaleFactor)

local fakeMotor6DTable: {Motor6D} = {}
for _, desc in ipairs(fakeChar:GetDescendants()) do
	if desc:IsA("Motor6D") then
		table.insert(fakeMotor6DTable, desc)
	end
end

local mainMotor6DTable: {Motor6D} = {}
for _, desc in ipairs(char:GetDescendants()) do
	if desc:IsA("Motor6D") then
		table.insert(mainMotor6DTable, desc)
	end
end
  • 5 сентября 2024 г. 13:23
Ответы на вопрос 1
При переходе с Roblox версии R15 на R6 вам нужно внести несколько изменений, так как в R6 используется более простая система соединений между частями, и отсутствуют некоторые компоненты, которые есть в R15 (например, дополнительные Motor6D). В R6 персонажи имеют только два ограничения: "HumanoidRootPart" и "Torso". 

Вот переписанная версия вашего скрипта для версии R6:

```lua
local RunService = game:GetService("RunService")

local plr = game.Players.LocalPlayer
local char = plr.Character or plr.CharacterAdded:Wait()
local torso: BasePart = char:WaitForChild("Torso")
local cam = workspace.CurrentCamera

-- Clone character
char.Archivable = true
local fakeChar = char:Clone()
local fakeTorso: BasePart = fakeChar:WaitForChild("Torso")
fakeTorso.CanCollide = false
fakeChar.Name = "Fake" .. plr.Name
fakeChar.Parent = workspace

local scaleFactor = 0.999
local classesToRemove = {"Decal", "Texture", "SurfaceAppearance", "LocalScript", "Script", "Humanoid", "Clothing", "ShirtGraphic"}

for _, desc in fakeChar:GetDescendants() do
	if not desc:IsA("MeshPart") then continue end
	
	desc.CastShadow = false
	desc.Transparency = 0.9999999
	desc.Color = Color3.new(1, 1, 1)
	desc.Material = Enum.Material.Glass
	desc.TextureID = "rbxassetid://5307016674"
	desc.CollisionGroup = "CharacterHighlightMask"
	
	for _, child in desc:GetChildren() do
		if child:IsA("SurfaceAppearance") then child:Destroy() end
	end
end
fakeChar:SetPrimaryPartCFrame(torso.CFrame) -- устанавливаем положение аналогично оригиналу
fakeChar:ScaleTo(scaleFactor)

-- Получаем Motor6D соединения
local mainMotor6DTable: {Motor6D} = {}
for _, desc in ipairs(char:GetDescendants()) do
	if desc:IsA("Motor6D") then
		table.insert(mainMotor6DTable, desc)
	end
end

-- Удаляем Motor6D в поддельном персонаже (из-за отсутствия в R6)
for _, m in ipairs(mainMotor6DTable) do
	m:Destroy()
end
```

### Изменения и пояснения:
1. **HumanoidRootPart и Torso:** В R6 используется только `Torso`, поэтому вам нужно соответственно менять ссылки на `HumanoidRootPart` на `Torso`.
  
2. **Отсутствие Motor6D:** В R6 нет таких сложных соединений, как в R15. Тогда как R15 имеет более сложную иерархию соединений (например, Motor6D для каждой конечности), в R6 их меньше, и вы можете решить, что их просто нет в `fakeChar`.

3. **Установка положения:** Вам нужно установить положение `fakeChar` (используя `SetPrimaryPartCFrame`), чтобы он появился в том же месте, что и оригинальный персонаж. Таким образом, он будет следовать тому же положению, что и оригинал.

4. **Удаление ненужных компонентов:** Убедитесь, что в `fakeChar` нет лишних компонентов, таких как Motor6D, которые могут вызвать ошибки в R6.

Проверьте данный скрипт на практике, чтобы убедиться в его корректной работе в вашем проекте.
Похожие вопросы