Вот решил я сделать красиво, чтобы у меня скелетик из под земли лез. Чтоб меня! Два дня угрохал на то, чтобы побороть разные фичи Roblox Studio и самого скриптового движка.
Как выяснилось, движок заботится о программистах и.. не даёт спавнить живность ПОД основанием мира. Вариантов, в итоге, перепробавана была масса. И.. то один косяк, то другой. В итоге остановился на замене основания мира на широкий и тонкий кирпичь и ТОЛСТОМ подземном лифте, на котором спавнится скелет.
Приступим?
Итак, первым делом удаляем BasePlate и ставим обычный кирпич Part (или цилиндр ставим на попа, если хотим чтобы основание было круглым) с размером 1000,1,1000 и пихаем его в 0,0,0 (ну или куда хотим).
Теперь создадим лифт, т.е. толстый кирпич, на котором будет выезжать из под земли наш скелет. Толстый потому, что при подъёме наш скелетон будет пытаться вжаться в него и он не должен прожаться в нём на сквозь. Более того, т.к. у нас перемещения работают с моделями, то жмём Group его в Model. Да и всё равно что у нас там единственный кирпич. Свойство Transparent выставляем в 0,95, чтобы его чуть видно было. Ну и прожать Anchor не забываем, чтобы он не падал.
На лифт, добавляем модель скелета, желательно, чтобы он был чуть выше верхней границы лифта. Из Toolbox поиском ищем skeleton и выбираем подходящего.
После чего выделяем обоих их и.. опускаем до уровня нашего пола. Получим нечто такое:
Теперь будем скриптовать. Для начала нам нужно.. опустить лифт вместе со скелетом под «землю». Скрипт даю полностью:
wait(3) -- подождём инициализации мира pos = game.Workspace.Part.Position -- позиция цели -- скрываем лифт lift=script.Parent.Lift -- находим лифт local PrimaryPosition = lift.PrimaryPart.Position -- берём его позицию local glubina=7 -- глубина погружения local v = Vector3.new(0,-glubina,0) -- создаём вектор погружения lift:TranslateBy(v) -- перемещаем лифт -- скрываем скелета model = script.Parent.Skeleton -- ищем скелета local primaryPartCFrame = model:GetPrimaryPartCFrame() -- берём его состояние model:SetPrimaryPartCFrame(CFrame.new(primaryPartCFrame.X, primaryPartCFrame.Y-7, primaryPartCFrame.Z)) -- опускаем скелета под землю -- лифт для скелета local v = Vector3.new(0,0.1,0) -- вектор чуть вверх for i=1,glubina do -- возвращаем на нашу глубину по 1 for y= 0,10 do -- для плавного подъёма wait(0.1) -- чуть чуть ждём lift:TranslateBy(v) -- поднимаем лифт end -- и так десять раз end lift.Parent= nil -- удаляем лифт, удалением указателя его родителя game.Workspace.Skeleton.Humanoid:MoveTo(pos) -- потопали к цели
Запамятовал. На нашу землю также кидаем простой кирпич — он будет у нас показателем цели, куда надо дойти, после того как вылезли. Т.е. в итоге, мы должны иметь примерно такую картинку:
И ещё. Если вы взяли такую же модель как и я, то в нейд надо установить флажок Disable на скрипте Move
Ну что же, теперь можно посмотреть, как наш скелет выпихивается из под земли лифтом и довольный топает к своей цели.
Возможные косяки:
- Если скелет проваливается — лифт слишком тонкий или узкий
- Если скелет не идёт — скорее всего у вас «кривая» модель или он «утонул» в лифте
Проверить, что модель скелета «правильная» можно как в скрипте на видео — добавить строчку в скрипт и разместить с соответствующим именем ещё одну модель. Если он пошёл изначально — значит модель правильная.
И как вы заметили, то в скрипте используются разные варианты перемещения моделей. Это не потому, что мне так захотелось, а потому, что Studio заботится о программистах и не даёт моделям изначально проваливаться сквозь объекты и упорно старается телепортировать их на верх, либо уронить на смерть о дно мира.
И не большой «бонус» от Studio — каждый раз запуск будет демонстрировать новые кульбиты у скелета, при его выталкивании из под земли.
А если нужно чтобы скелеты вылазили из стен или допустим у меня подземелье и нужно чтобы из земли (стен) они вылазили?
Надо изначально сделать их «призрачными», т.е. все их составляющие сделать Cancollide = false, а как вылезут, то сделать Cancollide = true