На youtube полно уроков, но большинство из них либо устарели, либо не работают, либо забывают какую-нибудь маленькую деталь. В итоге полдня потрачено на то, чтобы найти рабочую версию, под текущий выпуск студии.
Начнём с того что создадим самого пэта. Для этого берём обычный кирпич. Добавляем ему 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 секунд после старта появляется питомец и летит к нам. После чего болтается у нас за плечом.
