Creation kit как сделать дверь



Skyrim — Creation Kit: Строим свой дом

Этот туториал расскажет вам как создать собственный дом в Creation Kit. Мы создадим дом в районе Рифтена.

Итак, откройте Конструктор (Creation Kit) и подключите файл Skyrim.esm. Для этого пройдите по следующим вкладкам — File -> Data. Чтобы подключить Skyrim.esm нужно просто поставить галочку в соответствующем чекбоксе. Нажимаем ОК. Конструктор начнет грузится и может подвиснуть — это нормально, не отключайте его. На все возникшие «предупреждения» жмем «отмена».

После того как Конструктор загрузился ищем окно под названием «Cell View». Во вкладке «World Space» находим Tamriel, выбираем. Т.к. наш дом будет рядом с Рифтеном находим «RiftenCitySouthGateExterior», загружаем. В окне, которое находится над «Cell View» должно появиться изображение — 3D мир Скайрима. Перемещаться по 3D миру Скайрима — зажмите колесо мыши и двигайте в нужном вам направлении. Колесиком мыши (крутя колесо вперед и назад) мы можем увеличивать и уменьшать изображение. Если зажать клавишу «Shift» то можно поворачивать изображение. Также рекомендую нажать на клавишу «A» или кликнуть на лампу, которая находится вверху экрана, это отключит тени, так удобней работать. Далее нужно выбрать место для нашего дома. Я выбрал место среди деревьев. (Выделено красным прямоугольником).

Далее нам нужно выбрать фундамент нашего дома. Для этого раскройте панель «World Objects» в Окне объектов «Object Window», затем панель «Static», затем панель «Architecture». Я хочу, чтобы мой дом вписывался в общий пейзаж — я выбираю вкладку «Riften», вы можете выбрать другой. Находим RTFarmhouse02 и перетаскиваем в окно просмотра. Итак, ЛКМ — перемещает дом, ПКМ — крутит дом. Если нажать «F» дом (и любой другой предмет) опустится на землю, если ему ничего не мешает. Клавиши «Z, X, Y» перемещают дом по соответствующим осям. Пользуясь всем, что я перечислил выше вы сможете спокойно разместить дом в любом месте, которое вам нравится. Сейчас нужно установить наружную дверь. Идем в World Objects -> Door -> Architecture -> RiftenDoor02 и размещаем ее в проеме. (там уже будут стоять двери, но нужно поставить новые).

Мы разместили дом в игре, но в него нельзя войти, т.к. внутри ничего нет. Нам нужно создать интерьер. На панели инструментов выбираем «Wordld» и далее Cells.

В открывшимся окне в «World Space» выбираем «Interiors». В любом месте списка кликаем правой кнопкой мыши и выбираем «new». Появится окно, в нем нужно ввести ID. Игрок фактически не увидит его, но важно сделать его уникальным. Я введу Diablo1ru. Вы вводите что нибудь свое. После того, как вы это сделаете, ваша новая ячейка добавиться в список. Удостоверьтесь, что выбрана ваша ячейка и затем мы можем изменить некоторые настройки, касающиеся нашей ячейки. Сделайте следующее:

  • Common Data Tab (Вкладка общие сведения): Отметьте галочкой Can’t Travel From Here
  • Lighting (Освещение): Измените Ambient RGB все на 25
  • Interior Data: Выберите название, которое вы хотите, чтобы видел игрок (например, Мой первый дом, Дом Довакина и т.д.)

Остальное пока оставьте.

Теперь вернемся в меню «Static», (Object Window) откуда мы брали наружный объект здания. Опять выбираем его, правый клик мыши, нажимаем «Use Info». У нас появляется список, выбираем: «Tamriel SarethiFarmExterior 27, -18 1». В окне просмотра появляется другая картинка, приближаем камеру к зданию и выбираем дверь, кликая по ней два раза. В появившемся окне нажимаем «View Linked Door»

Закрываем лишние окна. Отводим камеру подальше, выделяем все и полностью копируем интерьер (Ctrl + C). Загрузите вашу новую ячейку из списка «Interior» в окошке «SWorld Space» в окне «Cell View».

Вставляем интерьер в нашу локацию. Далее удаляем оттуда (клавиша DELETE по выбраному объекту) всех НПС, стрелочку, крестик и дверь. Во время удаления появится предупреждение, нажимайте «да» (yes). Должно быть как на скриншоте:

Затем поместите дверь, подобную той, что мы использовали раньше на входе в здание, в проем стены, где должна быть дверь. Теперь возвращаемся к нашему экстерьеру (Cell view -> World Space -> Tamriel -> RiftenCitySouthGateExterior -> находим здание). Двойной клик на наружной входной двери и выберите закладку «Teleport». Отметьте окошко Teleport и затем выберите ячейку «Diablo1ru» (тот самый уникальный ID, вы могли прописать свой) из выпадающего списка «Cell». Выберите «RiftenDoor02» в окне reference и жмите OK. Теперь переместите желтый маркер телепорта от стены и опустите его на землю (клавиша F). Стрелочка НЕ должна указывать в дверь!

Читайте также:  Как сделать закругленную дверь

Теперь нужно сохранить наш плагин в папку Skyrim -> Data.

Теперь можно смело подключать плагин в SkyrimLaucher и идти любоваться домом, который вы создали собственноручно. В следующем мини-уроке я расскажу как обставить интерьер собственными предметами, а не скопированными.

Источник

Creation kit как сделать дверь

Я хотел сделать урок по навмешам, но решил поговорить о скриптах, так как видел мало уроков по ним.
В этом уроке мы создадим рычаг со скриптом, который открывает одну из трех дверей.
Этот урок для профи, но думаю и новички, что то почерпнут из него.

В игре в принцепи все рычаги одинаковые, но мы возьмём двемерский рычаг, ID — (DweLever01)

В окне визуализации или предварительного просмотра, кто как называет, в общем я думаю если вы читаете такой урок вы должны знать такую мелочь.
Как мы видим, рычаг в центральном положении указывает прямо вверх. Однако, как только он будет загружен в игре, положение по умолчанию будет изменено, оставшись с правой стороны. У рычага есть анимация и эти анимации можно изменить с помощью скрипта и функции:

В окне визуализации мы видим внизу, что у рычага есть шесть анимаций:

1.PushDown
2.PushUp
3.FullPush
4.PullDown
5.PullUp
6.FullPull

Что бы увидеть это информацию, нужно просто открыть окно визуализации и нажать на рычаг в активаторах.

И так же есть два события анимации:

События вам не надо искать, это просто две стрелки, которые поворачивают или вправо рычаг или влево.

Анимация происходит, когда мы потянули рычаг вправо, или задвинули влево.
Я объясню подробней:
Анимации:

1.»PushDown» используется для перемещения рычага из среднего положения в левое положение.
2.»PushUp» для перемещения слева в середину.
3.»FullPush» для перемещения слева направо.
4.»PullDown» используется для перехода от среднего положения направо.
5.»PullUp» для перехода от права к середине.
6.»FullPull» для перемещения справа налево.

Теперь, когда мы знаем, как анимация рычага работает, мы можем приступить к созданию скрипта для него.

Начинаем создание скрипта:

Этот урок рассчитан на продвинутых модмейкеров, которые уже умеют работать со скриптами, тех кто не понимает этого, прошу прекратить прочтение данного урока и изучать мат. часть. Тут я не буду упоминать такие мелочи как прикреплять скрипт к объекту, как перетащить объект в мир и подобное.

В скрипте, в начале должно быть extends, чтобы расширить ObjectReference, потому что рычаг будет иметь ссылки на объекты. Таким образом, наша первая строчка скрипта должно выглядеть так:

Scriptname (ID скрипта) extends ObjectReference

Вы также можете поместить свои комментарии в фигурные скобки, чтобы описать то, что делает скрипт. Комментарии в фигурных скобках

появляются при наведении курсора мыши на скрипт в Creation Kit.

Scriptname (ID скрипта) extends ObjectReference

Затем вы должны задать свойства и переменные. Хотя это и не так обходимо в начале создания вашего скрипта, но всё же я объясню.

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

курсора на данный скрипт в Creation Kit. Эти свойства, мы поставим в наш скрипт:

ObjectReference property Door01 auto

ObjectReference property Door02 auto

ObjectReference property Door03 auto

Так же позже мы кажем ссылка на эти двери в Properties, но позже.

После свойств, мы можем объявить наши переменные:

Int LeverPosition = 1
;Текущее положение рычага.

Int LeverPositionOld
;Предыдущие положение рычага.

Мы будем использовать эти переменные для отслеживания положений рычага. Вы могли заметить, что переменная «LeverPosition» отличается от «LeverPositionOld».

Мы присвоили значение по умолчанию «LeverPosition». Это означает, что даже прежде, чем что-либо произойдёт, значение «LeverPosition» уже будет изменено на 1, а значение по умолчанию 0.

Положение рычага по умолчанию используется с правой стороны. Так что мы должны указать это в нашем скрипте, и начальное значение LeverPosition будет 1. В нашем скрипте мы будем менять значения этих двух переменных -1, 0, 1 много раз. Значение 1 означает, поворот (в право), 0 будет означать среднее положение, и -1 повернуть в позицию (слева).

Со свойствами и переменными мы разобрались. Сейчас мы переходим на фактическую работу скрипта.

Обычно события и функции ставятся в случайном порядке, на самом деле без разницы, в конце они или в начале, но для урока я поставлю

всё по порядку, а т.е в начале.

Давайте начнем с определения наших функций.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Function SetDefaultState()

if (LeverPosition == 1)
PlayAnimation(«PullUp»)
elseif (LeverPosition == -1)
PlayAnimation(«PushUp»)
endif
LeverPositionOld = LeverPosition
LeverPosition = 0
OpenDoor()

Имя функции «SetDefaultState», и мы будем использовать её много раз. Цель функции заключается в перемещении рычага в среднее

if (LeverPosition == 1)

Используется для проверки, находится ли рычаг в положении 1 (повернут вправо).

PlayAnimation(«PullUp»)

Если это так, строка сообщает команду для перемещения рычага обратно в среднее положение.

Точно так же проверяется, если рычаг находится в положении -1 (сдвинут влево) и возвращает его в среднее положение.

Дальше рассмотрим, OpenDoor строку вызова функции, что в принципе мы собираемся внести в скрипт дальше.

*******************
Если вы хотите понять скриптиг лучше, вы должны понять структуру IF-ENDIF ElseIf-это некая проверочная система. Начинается с начало «if», чтобы проверить, истинно ли условие. Если истинно, то каждая строка после «if» выполняется, если не верно,то ставится либо «ElseIf» или «ENDIF».«ElseIf» условно не является обязательным. Это полезно, если вы хотите проверить на новых условиях, когда вы знаете, что предыдущая строка не соответствуют действительности. Как и у «if», если условие «ElseIf» истинно, то все строки после него, выполняются, перед тем как вы придете к другому «ElseIf» или «ENDIF».
«ENDIF» используется, чтобы завершить выполнение всех IF-ENDIF ElseIf-структур.
********************

Для каждого «if», вы должны иметь «ENDIF», либо скрипт не будет компилироваться!

Это наша следующая функция:

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Function DisableDoors()

Door01.BlockActivation()
Door02.BlockActivation()
Door03.BlockActivation()

Функция DisableDoors используется, когда мы хотим отключить активацию дверей. Использование BlockActivation запретит открытие двери, хотя вы все же увидите подсказку: открыть дверь. Есть и другие команды, которые мы могли бы использовать, чтобы быстро отключить активацию, но я попытаюсь использовать самое простое.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Function CloseDoors()

if (Door01.GetOpenState() != 3)
Door01.SetOpen(false)
endif
if (Door02.GetOpenState() != 3)
Door02.SetOpen(false)
endif
if (Door03.GetOpenState() != 3)
Door03.SetOpen(false)
endif

Функция CloseDoors используется, когда мы хотим убедиться, что все двери закрыты. В этой строке if (Door01.GetOpenState() != 3) мы проверяем, не закрыта ли дверь Door01 (значит открытая) с помощью GetOpenState.
В следующей строке Door01.SetOpen(false) мы закрываем дверь с помощью SetOpen. Мы делаем то же самое для двух других дверей.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Function OpenDoor()

if (LeverPosition == -1)
Door01.SetOpen()
elseif (LeverPosition == 0)
Door02.SetOpen()
else
Door03.SetOpen()
endif

Функция OpenDoor заключается в том, что бы правильно открывать двери на основе текущего положения рычага. Если рычаг находится в положении -1 (слева) он откроет Door01. Если это среднее положение, то Door02. И если это не в одной из этих позиций, он откроет Door03.

События представляют собой вещи, которые происходят в игре. Когда событие происходит, скрипт получает уведомление об этом, и если есть код, написанный в скрипте с событием, то оно будет осуществляться.

Здесь мы видим код события OnReset. Скрипт обрабатывает событие, когда происходит перезапуск объекта,скрипта,либо ячейки.
Когда событие получено, скрипт выполняет две функции, которые мы создали ранее, SetDefaultState и DisableDoors.

Далее мы рассмотрим событие OnLoad. Мы сделаем в нём то же самое, что и в OnReset событии.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Auto State Inactive

Event OnActivate(ObjectReference akActivateRef)

GoToState(«Active»)
CloseDoors()
if (LeverPosition != 0)
SetDefaultState()
else
if (LeverPositionOld == 1)
PlayAnimation(«PushDown»)
LeverPosition = -1
else
PlayAnimation(«PullDown»)
LeverPosition = 1
endif
LeverPositionOld = 0
OpenDoor()
endif
Utility.Wait(1)
GoToState(«Inactive»)

State Active
EndState

А теперь мы подошли к заключительной части нашего скрипта, событию OnActivate. Это событие будет получено, когда кто-то пытается активизировать наш рычаг.

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

Проще говоря, все скрипты/объекты имеют положения.Если нет определенных событий в сценарии, объект находится в «нулевом» положении.

В нашем скрипте, у нас было

Auto State Inactive
;Действия
EndState

Auto — здесь означает, что наш объект будет автоматически переведен в «неактивное» состояние, когда он загружается.»Действия» между двух строк выполняются только тогда, когда рычаг находится в неактивном состоянии.

Таким образом, вы можете видеть, что если рычаг находится в «активном» состоянии, при попытки активировать его он ничего не делает.

Обратите внимание, что все функции и события, которые находятся в «активном» или «неактивном» состоянии (то есть они находятся в нулевом состоянии) доступны из любого состояния.

Теперь давайте взглянем на код события OnActivate. Эта событие GoToState(«Active») игра сообщает рычагу, который сейчас находится в «активном» состоянии, как только мы его активировала. Это не значит, что скрипт будет прекращать обработку остальной части кода в «неактивном» состоянии, это просто означает, что последующая активация не будет обрабатывать код.

Если вы следовали тому, что я писал, всё должно получиться. Мы указываем функцию CloseDoors, чтобы убедиться все двери закрыты.

Если рычаг не находится в среднем положении, мы меняем его в среднее положение.

Если предыдущее состояние было не такое, то рычаг должен был в среднем положении. Где мы проверяем нашей переменной LeverPositionOld , предыдущую позицию. Очевидно, что мы не хотим, переключать рычаг от права, в середину и назад направо. Так что, если старые положения рычага были 1 (право), то теперь перейдут в левое положение. Если у вас было -1 (слева), всё в правильном положении.

Затем мы устанавливаем значение LeverPositionOld до 0, и указываем функцию OpenDoor.У нас не было этих двух событий после if (LeverPosition != 0) потому что они уже являются частью функции SetDefaultState.

Наш последний кусок кода

говорит о том, чтобы подождать 1 секунду (для того, чтобы проиграть анимацию), а затем вернуться в «неактивное» состояние (так что активация рычага еще раз сделает что-то).

И так это всё, теперь составляем скрипт вместе и ваш скрипт должен выглядеть примерно так:

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Scriptname (ID скрипта) extends ObjectReference

ObjectReference property Door01 auto

ObjectReference property Door02 auto

ObjectReference property Door03 auto

Int LeverPosition = 1
;Текущее положение рычага.Здесь мы устанавливаем его значение по умолчанию 1.

Int LeverPositionOld
;Предыдущие положение рычага.

if (LeverPosition == 1)
PlayAnimation(«PullUp»)
elseif (LeverPosition == -1)
PlayAnimation(«PushUp»)
endif
LeverPositionOld = LeverPosition
LeverPosition = 0
OpenDoor()

Door01.BlockActivation()
Door02.BlockActivation()
Door03.BlockActivation()

if (Door01.GetOpenState() != 3)
Door01.SetOpen(false)
endif
if (Door02.GetOpenState() != 3)
Door02.SetOpen(false)
endif
if (Door03.GetOpenState() != 3)
Door03.SetOpen(false)
endif

if (LeverPosition == -1)
Door01.SetOpen()
elseif (LeverPosition == 0)
Door02.SetOpen()
else
Door03.SetOpen()
endif

Event OnReset()
SetDefaultState()
DisableDoors()
EndEvent

Event OnLoad()
SetDefaultState()
DisableDoors()
EndEvent

Auto State Inactive

Event OnActivate(ObjectReference akActivateRef)

GoToState(«Active»)
CloseDoors()
if (LeverPosition != 0)
SetDefaultState()
else
if (LeverPositionOld == 1)
PlayAnimation(«PushDown»)
LeverPosition = -1
else
PlayAnimation(«PullDown»)
LeverPosition = 1
endif
LeverPositionOld = 0
OpenDoor()
endif
Utility.Wait(1)
GoToState(«Inactive»)

State Active
EndState

Теперь сохраните свои скрипт. Теперь вы можете применить его, поставив рычаг где-то, дважды щелкнув по нему, чтобы изменить его, и перейти к его самой правой закладке. Вы должны удалить два скрипта, которые уже находятся на нем, и заменить их на скрипт, который вы только что написали. Это должно выглядеть примерно так:

После добавления вашего скрипта, нажмите кнопку ОК, чтобы закрыть окно и теперь разместите три двери. После того как вы сделали это, вернитесь к рычагу и его вкладке со скриптом снова. Щелкните правой кнопкой мыши по скрипту и выберите пункт Свойства. Теперь вам надо просто установить ссылки на Door01, Door02 и Door03 к дверям, которые вы хотите открыть / закрыть.

Вот и все! Сохраните ваш мод и проверьте его в игре.

Источник

Поделиться с друзьями