ROBLOX — #6 лезем из под земли. MoveTo не работает!

Автор: | 30 октября, 2019
Поделиться...

Вот решил я сделать красиво, чтобы у меня скелетик из под земли лез. Чтоб меня! Два дня угрохал на то, чтобы побороть разные фичи 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 — каждый раз запуск будет демонстрировать новые кульбиты у скелета, при его выталкивании из под земли.


Поделиться...

ROBLOX — #6 лезем из под земли. MoveTo не работает!: 2 комментария

  1. Александр

    А если нужно чтобы скелеты вылазили из стен или допустим у меня подземелье и нужно чтобы из земли (стен) они вылазили?

    1. Admin Автор записи

      Надо изначально сделать их «призрачными», т.е. все их составляющие сделать Cancollide = false, а как вылезут, то сделать Cancollide = true

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *