На youtube полно уроков, но большинство из них либо устарели, либо не работают, либо забывают какую-нибудь маленькую деталь. В итоге полдня потрачено на то, чтобы найти рабочую версию, под текущий выпуск студии.
Декабрь 2023 года. Наткнулся на правильный вариант создания питомца на функции PivotTo. Он на видео ниже.
Старый вариант убирать не буду, он всё ещё рабочий.
Начнём с того, что создадим самого пэта. Для этого берём обычный кирпич. Добавляем ему SpecialMesh. Красим и добавляем материал. Из ToolBox перетаскиваем готовую рожицу из вкладки Images прямо на нашего Pet-а.
Снимаем галку Anchor — т.к. питомец должен передвигаться и галку Collisions, т.к. должен проходить сквозь препятствия. Добавляем BodyGyro отвечающий за направление взгляда и BodyPosition отвечающий за текущую позицию. В них выставляем значение «inf,inf,inf» (без кавычек) для параметров MaxTorque и MaxForce.
Ну и теперь пришла очередь скриптования. Добавляем в него script, переименовываем его в Follow и заносим в него код:
while true do -- выполнять до бесконечности wait() -- ждём чего-то local HumPR = script.Parent.Parent:WaitForChild("HumanoidRootPart") -- ищем подключившегося игрока local BodyPosition = script.Parent:WaitForChild("BodyPosition") -- сохраняем свою текущую позицию local BodyGyro =script.Parent:WaitForChild("BodyGyro") -- сохраняем своё текущее направление -- перемещаемся в направлении "за плечо игрока" BodyPosition.Position = HumPR.Position + HumPR.CFrame.lookVector*-2 + HumPR.CFrame.upVector*3 + HumPR.CFrame.rightVector*2 -- и смотрим туда же куда и игрок BodyGyro.CFrame = HumPR.CFrame * CFrame.new(3,0,-3) end
Т.к. использую сторонний код, то и расположение объектов будем использовать так же как и в нём. В ReplicatedStorage создаём папку PetLibrary и переносим туда нашего питомца.
И нам нужен второй скрипт — для порождения самого питомца. В глобальной папке ServerScriptService создаём скрипт с именем PetOnEnter:
game.Players.PlayerAdded:Connect(function(Player) -- ожидаем подключения игрока Player.CharacterAdded:Connect(function(Character) -- ожидаем назначения ему модели wait(5) -- обычная пацза на 5 секунд local RS = game:GetService("ReplicatedStorage") -- будем обращаться к системному сервису local PetLibrary = RS:WaitForChild("PetLibrary") -- берём из него ссылку на нашу папку local PetClone = PetLibrary:WaitForChild("Pet") -- берём оттуда нашего пэта local Follow = PetClone:WaitForChild("Follow") -- создаём клон нашего пэта PetClone.Parent = Character -- запихиваем пэта в модель нашего игрока -- Follow.Disable = false print (PetClone.Parent.Name) -- просто печатаем имя игрока с пэтом для отладки end) end)
Должно в итоге выглядеть примерно так:
Можем запускать и посмотреть на результат. Через 5 секунд после старта появляется питомец и летит к нам. После чего болтается у нас за плечом.