diff --git a/docs/config.toml b/docs/config.toml index 75493e0..497a96d 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -17,6 +17,9 @@ enableMissingTranslationPlaceholders = false [languages.zh_cn] contentDir = "content/schinese" languageName = "简体中文" + [languages.ru] + contentDir = "content/russian" + languageName = "Русский" # Add more languages here diff --git a/docs/content/russian/Asset Management/Asset Browser/FilterQueries.md b/docs/content/russian/Asset Management/Asset Browser/FilterQueries.md new file mode 100644 index 0000000..2b960c3 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Browser/FilterQueries.md @@ -0,0 +1,19 @@ ++++ +title = "Фильтр запросов" ++++ + + +------------------ + +Вы можете использовать синтаксис SQL для поиска ресурсов с определенными свойствами, такими как текстуры с разрешением более 1024. +Для этого вам нужно включить режим запроса из меню дополнительных функций: +![](/img/asset_browser/extras_icon.png) + +В Инспекторе текстур (правая панель) вы можете включить/выключить смешивание MipMap, установив флажок Use Mipmap Blending. Когда вы включите MipMap Blending, вы увидите все уровни mip выбранной текстуры рядом друг с другом в окне предварительного просмотра. +![](/img/mipmap_editor/tex_editor_post_mip.PNG) + +При нажатии на MipMap Blend Amounts откроется новое окно, в котором вы можете настроить количество смешивания для каждого уровня MIP. +![](/img/mipmap_editor/mipmap_blend_window.PNG) + +Затем вы можете выбрать MipMap Blend Color и нажать кнопку Recompile (2), чтобы применить смешивание. Результат будет сразу виден в окне предварительного просмотра, а также в игре. +![](/img/mipmap_editor/tex_editor_compiled.PNG) diff --git a/docs/content/russian/Asset Management/Asset Browser/_index.md b/docs/content/russian/Asset Management/Asset Browser/_index.md new file mode 100644 index 0000000..270efcf --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Browser/_index.md @@ -0,0 +1,8 @@ ++++ +title = "Обозреватель ассетов" +description = "" +weight = 1 ++++ + +Asset browser shows assets +5256+2+56 \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/_index.md b/docs/content/russian/Asset Management/Asset Types/_index.md new file mode 100644 index 0000000..83820f7 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/_index.md @@ -0,0 +1,7 @@ ++++ +title = "Типы ассетов" +description = "" +weight = 2 ++++ + +{{%children style="h5" description="true"%}} \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/animations.md b/docs/content/russian/Asset Management/Asset Types/animations.md new file mode 100644 index 0000000..0d62dcb --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/animations.md @@ -0,0 +1,187 @@ ++++ +title = "Анимации" +description = "" +weight = 1 ++++ + +### Modding the Animation System + +#### Exporting Animation for Bannerlord + +##### Default Animation Settings + +* Frame rate: 30 FPS(Optimal) or 60 FPS +* Humanoid or Creature Skeleton(Rig) Settings +* Max supported bone count: 64 +* Bones that are not used should contain “_notused” at the end of the string. Also root bone (highest bone in the hierarchy) should contain this only for the animations. +![](/img/animation_system/image2.jpg) + +##### FBX export settings (Autodesk Maya) +These settings are applied to Maya. Similar kind of software might contain the same settings. When we export the new rig for the first time, the exported FBX file should contain the skeleton and the mesh. + +##### First time setup (Skeleton + Mesh) +![](/img/animation_system/image4.jpg) +![](/img/animation_system/image3.jpg) + +##### Exporting Animation Only Settings +We make sure to disable mesh and skin related options before we export the animations. ”Use scene name” is very important to check when exporting for both animations and rigs. Also make sure that the root bone contains “_notused” at the end of the string. +![](/img/animation_system/image6.jpg) + +We make sure that we don’t send any kind of “Constraints and Skeleton Definitions”. Constraints, Connections and Unit settings should be set as the image below. Our engine also uses the “Z” as the up axis. +![](/img/animation_system/image5.jpg) + +##### Defining New Animations +After exporting your animation, to reference it in the game, you need to add new animation clips from the resources browser which references that animation. To do so, you should use the "Animation Clip" button inside the " Create" parent build. Most important properties of these clips are: + +* id: ID(unique name) of the anim clip to be used in other systems +* source1: Start keyframe of the animation clip +* source2: End keyframe of the animation clip +* anim_data_name: The source animation resource that was imported to the engine for this clip +* duration: Duration of this animation clip in seconds + +A typical animation contains some optional attributes as well. Most common one is blend_in_period, which sets the duration for blending to the existing animation and reaching 100% weight. blend_out_period is the opposite of this blending, but it has an important difference. Blending out actually means that the animation ends earlier than the given duration, and the rest of the animation will only be used for blending out to another animation. But blend duration is only set by blend_in_period. Having a longer blend_out_period than the next animation’s blend_in_period doesn’t extend this blend duration. It just helps the blend to look smoother, since during that blend, if both animations play at the same time, it looks visually more appealing. An animation with 0 blend_out_period simply pauses during the blending to the next animation, and it causes a sudden stop/velocity change in bone rotations. + +An animation has several more optional attributes: + +* priority: Priority simply allows/disallows animations to be played as an interrupt while another animation is in progress. Higher priority animations are played over lower or equal priorities as interrupts. +* param1, param2, param3: Params are used in cases when the engine requires additional data. They may have quite different meanings. +* sound_code: Plays a sound when the animation is played. +* step_points: These are step points for sound. +* voice_code: Plays a voice when the animation is played. +* facial_anim_id: Morphs the face to this when the animation is played. +* left_hand_pose, right_hand_pose: These morph the hands to their values when the animation is played. +* combat_parameter_id: This gives an additional set of information to the engine (see combat_parameters.xml) +* blends_with_action: This attribute references another action (warning: action, not animation) to blend the animation with. This is valid only when the engine requires two animations to be blended with (i.e. shield blocking up/down, weapon swings requiring balanced and unbalanced versions etc.). +* continue_to_action: This attribute calls another action (warning: action, not animation) to be played soon after this animation is finished. Animation is considered to be finished always when the duration (blend_out_period) is reached. + +Animations usually contain two other nodes: flags and clip_usage_data. clip_usage_data is a common data pointer that may refer to blend_data, displacement_data, bipedal_movement_and_ik_data, and quadrupedal_movement_data. Their usage is mostly for specific cases and their details are out of this explanation’s scope. Flags are used for nearly all animations though and require some explanation. Possible flags that can be used for an animation are: + +* disable_agent_agent_collisions: Disables collisions between agents. +* ignore_all_collisions: Disables all collisions. +* Ignore_static_body_collisions: Disables collisions with static bodies. +* use_last_step_point_as_data: 4th step point is considered as data instead of a sound point. +* make_bodyfall_sound: Creates a fall sound when the body touches the ground. +* client_prediction: Prevents animations from being sent through the network. +* keep: Doesn’t end the animation when it is finished and keeps it as paused instead. +* restart: Forces the animation to start from the beginning if the same animation is already being played by that skeleton. +* client_owner_prediction: Prevents animations from being sent through the network only for the agents that are controlled by that client. +* make_walk_sound: Plays hardcoded walk sounds. +* disable_hand_ik: Prevents hand inverse kinematics to be applied during the animation. +* blends_according_to_look_slope: Allows animation to be blended with another animation according to the look slope, with this one being downward. +* synch_with_horse: Plays the animation without using its original duration, it instead matches the progress with the mount’s animation. +* use_left_hand_during_attack: Allows the combat system to check the left hand as the collider during an attack. +* lock_camera: Prevents players from controlling the camera during this animation. +* lock_movement: Prevents agents to move during this animation. +* synch_with_movement: Plays the animation without using its original duration, it instead matches the progress with the agent’s movement animations. +* enable_hand_spring_ik: Allows a spring-like inverse kinematics to be applied to hands for applying lower body movement’s forces on them. +* enable_hand_blend_ik: Allows inverse kinematics to try to keep the hands a bit at the starting location when this animation starts by blending the original position and the animation position. +* synch_with_ladder_movement: Plays the animation without using its original duration, it instead matches the progress with the agent’s movement on the ladder. +* do_not_keep_track_of_sound: Prevents engine from holding a reference to a sound when it is played. +* reset_camera_height: Reduces the additional camera height for this animation. +* disable_auto_increment_progress: Prevents the animation from being played and keeps it paused at the current progress instead. Progress might have to be set manually from the code. +* enforce_lowerbody: Prevents previous channel and movement animations to be played during this animation. +* enforce_all: Valid for channel 0 only. Prevents channel 1 and movement animations to be played during this animation. +* cyclic: Animation loops and never ends. +* enforce_root_rotation: Abdomen (root) rotation is taken from this animation instead of the previous channel or movement animation for internal calculations. +* allow_head_movement: Allows agent’s head to move according to look direction. +* disable_foot_ik: Disables foot inverse kinematics for this animation. +* affected_by_movement: Allows movement adder animations to be added on top of this animation to give a better shaky feeling. +* update_bounding_volume: Disables bounding box optimization, should be used when the agent moves outside its regular boundaries with this animation. +* align_with_ground: Aligns agent's frame with the ground during this animation. +* ignore_slope: Prevents quadruped agents to align with the ground during this animation. +* displace_position: Updates world position of the agent during the animation using the displacement data. +* enable_left_hand_ik: Forces the left hand to stay on this animation’s target frame even during blending with other animations using inverse kinematics. +* ignore_scale_on_root_position: Allows abdomen (root) position to stay at the same position with the original scale, allowing the agents to interact with objects better. +* randomization_weight: Randomizes the animation inside its alternative group with this value. Higher value allows the animation to be selected more frequently. + +##### Modifying/Adding New Actions +Agent animations are mapped to action sets as actions. In order to set a new animation to an existing action, first you need to define a new animation clip through the resource browser. Animation clips define the animation start and end seconds, FPS and various properties. Then you need to map it under action_sets.xml for the specific action set. If a new action is needed to be created, first you need to add it as a new line under action_types.xml, and then do the same steps above. + +Non-agent animations are not mapped as actions. For those, you just need to add the animation clips through the resource browser and then start using it in the code. + +Each action has several attributes. These attributes are hardcoded so that the engine can understand certain properties of the action. The attributes are: + +type (default: actt_other): + +* actt_other, +* actt_defend_fist, +* actt_defend_shield, +* actt_defend_forward_2h, +* actt_defend_up_2h, +* actt_defend_right_2h, +* actt_defend_left_2h, +* actt_defend_forward_1h, +* actt_defend_up_1h, +* actt_defend_right_1h, +* actt_defend_left_1h, +* actt_defend_forward_staff, +* actt_defend_up_staff, +* actt_defend_right_staff, +* actt_defend_left_staff, +* actt_ready_ranged, +* actt_release_ranged, +* actt_release_throwing, +* actt_reload, +* actt_ready_melee, +* actt_release_melee, +* actt_parried_melee, +* actt_blocked_melee, +* actt_fall, +* actt_jump_start, +* actt_jump, +* actt_jump_end, +* actt_jump_end_hard, +* actt_kick, +* actt_weapon_bash, +* actt_passive_usage, +* actt_equip_unequip, +* actt_idle, +* actt_guard, +* actt_mount, +* actt_dismount, +* actt_dash, +* actt_mount_quick_stop, +* actt_hit_object, +* actt_sit, +* actt_sit_on_the_floor, +* actt_ladder_raise, +* actt_ladder_raise_end, +* actt_rear, +* actt_strike_light, +* actt_strike_medium, +* actt_strike_heavy, +* actt_strike_knock_back, +* actt_mount_strike + +usage_direction (optional): + +* ud_attack_up, +* ud_attack_down, +* ud_attack_left, +* ud_attack_right, +* ud_defend_up, +* ud_defend_down, +* ud_defend_left, +* ud_defend_right, +* ud_defend_any, +* ud_attack_any + + +action_stage (optional): + +* as_attack_ready, +* as_attack_quick_ready, +* as_attack_release, +* as_reload_phase_1, +* as_reload_phase_2, +* as_defend, +* as_defend_parry + + +Using the modified actions is pretty straightforward, you just need to change the action to animation mapping under action_sets.xml and that will probably be enough. But if you want to create a new action, or create a new behavior for an existing action, possible ways of integrating it within the game would be: + +* Calling the action from the code: Agent class has the necessary functions to do that. For performance reasons, make sure to cache the index of the action using the ActionIndexCache class. +* Using it in movement_sets.xml: This file contains two sets: movement_sets and full_movement_sets. A movement_set contains all the animations required for a character to move in all directions in a single stance and state. A full_movement_set contains a group of movemen_sets in order to satisfy all stances and all states: walking, running, crouch walking and crouch running with left and right stances. Please keep in mind that crouch does not have a left stance, and as such some weapon usages enforce only right stance to be used in all cases (i.e. ranged weapons in Native). full_movement_sets contain their conditions as attributes: left_stance and movement_mode. +* Using it in item_usage_sets.xml: new combat actions should be given from here as long as they don't require a combat system change. Idle, guard, weapon usage, kick usage actions can be set from here for every item with certain conditions. In addition to that the actions defined under movement_sets.xml are also referenced from here. There are too many conditions and attributes for the usage_sets to explain them here, but the existing examples should help you understand how everything works. One important and not so straightforward detail is that, all of the usages defined here are traversed from top to bottom, and the first usage that satisfies the condition is used. So it is important to keep the usages that have more limits at the top of the list, and fallback usages at the bottom. +* Using it in monster_usage_sets.xml: Just like item_usage_sets.xml, this file contains possible actions that agents can do without depending on an item type. Those can be strikes, jumps, falls and mountings. For quadruped agents there are a few more possibilities: upper_body_movements, movements and movement_adders. This file requires a closer explanation, but its structure is similar to item_usage_sets.xml and the examples shown there should be self explanatory. Again for all cases, usages are traversed from the top and first usage that satisfies the conditions is used. Since the conditions vary a lot for different conditions of actions, sometimes a condition can be used outside of its meaning (i.e. meaning of is_heavy becomes a speed condition for quadruped falls and strikes). And some directions may not be applied for certain conditions (some actions check 4 directions, some check front_left and front_right instead of front, and some check only cross directions: front_left, front_right, back_left and back_right), so it is advised that you experiment a bit if you try to go beyond what the Native code gives you. For the full possible body_parts, please check bone_body_types.xml, which mainly holds some attributes for body parts related to combat collision checks. + diff --git a/docs/content/russian/Asset Management/Asset Types/asset_naming_conventions.md b/docs/content/russian/Asset Management/Asset Types/asset_naming_conventions.md new file mode 100644 index 0000000..106e727 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/asset_naming_conventions.md @@ -0,0 +1,89 @@ ++++ +title = "Соглашения об именах" +description = "" +weight = 1 ++++ + +Чтобы различать и систематизировать ресурсы, а также упростить процесс создания ресурсов, необходимо учитывать некоторые предопределенные правила. + +##### Меши + +Все сетки, импортированные из одного файла геометрии (например, fbx), сгруппированы по их именам. Чтобы добавить сетку LOD, просто добавьте **".lod\"** к имени вашей сетки. Здесь **n** - количество LOD. +Рассмотрим файл fbx, как показано ниже: + +asset.fbx : + +- wall_damaged +- wall_damaged_v2 +- wall_damaged_v2.lod1 +- wall_damaged.lod1 +- wall_damaged.lod2 + +Две сетки будут импортированы из файла asset.fbx: wall_damaged, wall_damaged_v2. У этих мешей будет один и два объекта соответственно. Если ваше программное обеспечение для моделирования не поддерживает точки в именах (например, Maya), вы также можете использовать "\_" вместо "." указать lods (e.g. wall_damaged_v2_lod1). +В сетке не может быть более одного материала, поэтому на этапе импорта сетки будут разделены на подсетки в соответствии с использованием материалов для полигонов. К именам автоматически сгенерированных сеток будут добавлены порядковые номера. Рассмотрим сетку **wall_damaged** из трех разных материалов. Имя импортированной сетки будет **wall_damaged**, и она будет иметь три подсетки с именами **wall_damaged.1**, **wall_damaged.2**, **wall_damaged.3**. + +{{% notice info %}} +Во время импорта сетки материалы, определенные в файлах геометрии, не создаются. Вы должны создавать материалы вручную с тем же именем, на которое они ссылаются из файлов геометрии. +{{% /notice %}} + +##### Физические формы + +Вы можете экспортировать физические формы, как обычные сетки. Единственная разница между сеткой и физической формой состоит в том, что имена физических фигур начинаются с префикса "bo_". Вы также можете экспортировать аналитические капсулы и сферы. + +**Капсулы** + +Если имя узла начинается с **"bo_capsule"**, он будет импортирован как аналитическая форма капсулы. Размеры этой капсулы определяются следующими правилами: + +- Локальные оси XY приняты за радиальную плоскость капсулы +- Локальная ось Z принимается за направление капсулы (высота) +- Масштаб объекта по оси XY должен быть равен + +Используются только ориентация и протяженность узлов капсулы. Любой прикрепленный к ним контент (например, сетка) игнорируется. + +**Сферы** + +Если имя узла начинается с **"bo_sphere"**, он будет импортирован как аналитическая сфера. Размеры этой сферы определяются размерами узла. Центр узла также будет центром формы сферы. +Используются только ориентация и размеры узлов сферы. Любой прикрепленный к ним контент (например, сетка) игнорируется. + +**Составные фигуры** + +Вы можете комбинировать разные типы фигур для создания более сложных фигур. Чтобы экспортировать составную форму, вы должны создать узел, имя которого начинается с **"bo_composite"**. К этому узлу можно добавлять дочерние узлы с разными типами форм. + +- bo_composite_building1 + - bo_capsule1 + - bo_capsule2 + - bo_sphere + - bo_building_walls + +Эта форма будет импортирована как один ассет с именем **bo_composite_building1**. + +##### Текстуры + +Вы можете предоставить основные подсказки для своей текстуры, следуя этим правилам: + +- Albedo textures ends with _d +- Normal textures ends with _n +- Specular textures ends with _s +- Heightmap textures ends with _h + +Несмотря на то, что эти правила не являются обязательными, они помогут движку определить лучшие правила компиляции во время первого импорта и помогут некоторым функциям редактора работать (например, автозаполнение обычного слота текстуры материала). Если ваши текстуры не соответствуют им, вы можете изменить настройки импорта позже. + +##### Скелеты + +Большинство внутренних ресурсов организовано таким образом, что скелеты, сетки и анимации, использующие эти скелеты, хранятся в отдельных файлах. Поэтому мы следуем некоторым правилам именования, чтобы правильно устанавливать перекрестные ссылки между этими файлами. Если вы также планируете импортировать скелеты, сетки и анимацию из разных файлов: + +- Иерархия костей скелетов должна совпадать +- Каждый костный узел должен иметь свое имя, оканчивающееся жестко запрограммированным номером кости (например, _0, _1), чтобы номера костей скелетов, происходящих из разных файлов, совпадали, независимо от процесса экспорта вашего программного обеспечения для моделирования или инструмента экспорта. Вот эти правила, которым должно следовать каждое имя кости: + - Добавленные индексы костей должны начинаться с нуля + - Индексы прикрепленных костей не должны быть больше или равны количеству костей + - Две кости не могут иметь одинаковый костный индекс + +{{% notice info %}} +Если вы хотите экспортировать только ассеты, связанные со скелетом (например, сетку со скелетом или анимацию), но не сам скелет, что имеет место, если у вас есть файл, из которого вы импортировали скелет, и вы регулярно импортируете новые сетки для этого скелета из разных файлов - вам следует добавить **_notused** к имени скелета, чтобы движок автоматически игнорировал его и импортировал только другие ассеты. +{{% /notice %}} + +Скелеты получают свои имена от корневого узла иерархии костей в вашем файле геометрии. Это сделано для того, чтобы вы могли называть свои скелеты чем-нибудь, кроме имени корневой кости. Если ваша корневая кость не имеет родительского узла, вы можете создать фиктивный узел и сделать свою корневую кость его дочерним элементом. Переименовав фиктивный узел, вы сможете переименовать свой скелет, не затрагивая имена костей. + +{{% notice info %}} +Некоторые программы автоматически экспортируют анимацию с заранее заданными именами (например, 3DS Max -> take_001). Это приведет к тому, что несколько скелетных анимаций будут импортированы с одним и тем же именем, если у вас есть более одного скелета, определенного в вашем файле геометрии, поскольку движок интерпретирует данные анимации, определенные для каждого скелета, как разные ассеты. Из-за этого вы получите предупреждение о **duplicate asset**. Чтобы избежать этого, лучше всего экспортировать один скелет на файл геометрии. Вы также можете отключить **animation import** в настройках импорта этого файла. +{{% /notice %}} \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/bodies.md b/docs/content/russian/Asset Management/Asset Types/bodies.md new file mode 100644 index 0000000..23790b2 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/bodies.md @@ -0,0 +1,35 @@ ++++ +title = "Тела" +description = "" +weight = 1 ++++ + +Тела определяют физические границы объектов. Их можно назначить объектам в сценах или префабах. Пользователи могут редактировать флаги тела, чтобы изменить свое поведение. + +##### Флаги тела + +* Two Sided: заставляет физический движок использовать обе стороны многоугольников для этого тела. +* AI Limiter: используется для пометки тел, которые будут использоваться только против агентов AI, за исключением игрока. +* Destructible Door: используется автоматическим генератором навигационной сетки, чтобы не помещать навигационную сетку под разрушаемую дверь. +* Disabled: отключает физику для этого префаба или экземпляра объекта. +* Barrier: обеспечивает беспрепятственный выход агентов изнутри тела. +* Exclude Path Snap: точки контура не привязываются к этим телам. +* Don't Collide With Camera: камера игрока не сталкивается с этими телами. +* Dynamic: физический движок имитирует движение этого объекта. +* Moveable: этот флаг указывает, что это тело и его сущность-владелец могут двигаться. +* Ladder: должна быть предоставлена сеткам лестницы, чтобы они функционировали должным образом. +* Has Steps: следует давать телам лестниц, чтобы агент мог по ним правильно подняться. (Тело лестницы должно быть отделено от других частей объекта). + + Агент физики требует для работы гладких и низкополигональных физических объектов. Ракетные требуют большей точности, чтобы лучше моделировать застрявшие ракеты. Приведенные ниже флаги можно использовать, чтобы иметь два разных тела для каждого объекта, что является лучшим из обоих миров. Если ни один из флагов не выставлен, на тела реагируют и ракеты, и агенты. + +* Только агент: только агенты реагируют на эти тела. +* Только метательные снаряды: на эти тела реагируют только метательные снаряды. + + +##### Окклюдеры + +Окклюдеры - это тела, которые размещаются на поверхностях сетки, чтобы система рендеринга не отображала содержимое с другой стороны этой поверхности. Они не участвуют в физическом моделировании. Большие города и деревни в основном выигрывают от аккуратно размещенных окклюдеров. Пользователь может размещать окклюдеры прямо на сцене или прикреплять их к объектам и префабам. + +{{% notice info %}} +Имена импортированных тел окклюдера должны начинаться с фразы «occ_». +{{% /notice %}} \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/materials.md b/docs/content/russian/Asset Management/Asset Types/materials.md new file mode 100644 index 0000000..cde9378 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/materials.md @@ -0,0 +1,8 @@ ++++ +title = "Материалы" +description = "" +weight = 1 ++++ + +Материалы определяют характеристики рендеринга сеток. Они содержат информацию о шейдере и текстуре, а также флаги рендеринга (определяемые шейдером и глобальные). +Сетка может состоять из одного материала. Начальное значение материала сетки будет назначено через его имя материала в сторонних приложениях для редактирования сетки. Материалы можно создавать и редактировать с помощью обозревателя материалов, к которому можно получить доступ через обозреватель ресурсов. Материал также можно редактировать во время выполнения с помощью сценариев и поведения. Дополнительную информацию о редактировании материалов и материалах по умолчанию для движка можно найти в [Редакторе материалов]({{< ref "material_editor.md" >}}). \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/meshes.md b/docs/content/russian/Asset Management/Asset Types/meshes.md new file mode 100644 index 0000000..0095d97 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/meshes.md @@ -0,0 +1,11 @@ ++++ +title = "Сетки" +description = "" +weight = 1 ++++ + +Сетки содержат позиции полигонов и атрибуты, которые будут использоваться на этапе рендеринга. Каждая сетка имеет один материал, который определяет их поведение при рендеринге. Они сгруппированы внутри MetaMesh по их уровню LOD. Кроме того, на одном уровне LOD может быть несколько сеток с разными материалами. Дополнительную информацию об импорте сеток в движок можно найти в [Редакторе материалов]({{< ref "asset_naming_conventions.md" >}}). + +##### LOD система + +Современные движки используют системы LOD (уровня детализации), чтобы гарантировать, что объем доли GPU, используемой более близкими частями экрана, больше, чем дальние. Это достигается за счет уменьшения качества сетки по отношению к расстоянию до камеры. Эта система гарантирует, что соотношение многоугольников к пикселям на экране будет максимально одинаковым. Расстояния LOD по умолчанию следующие: 15, 22.5, 30, 50, 70, 130, 210 метров. Эти расстояния предназначены для наилучшего качества графики и могут быть уменьшены с помощью параметров «Качество среды» и «Качество персонажа». \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/overriding_assets.md b/docs/content/russian/Asset Management/Asset Types/overriding_assets.md new file mode 100644 index 0000000..bc534e4 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/overriding_assets.md @@ -0,0 +1,91 @@ ++++ +title = "Добавление и переопределение ассетов" +description = "" +weight = 1 ++++ + +В RGL _(игровой движок)_ вы можете легко переопределить существующие ассеты или создать новые в редакторе для вашего пользовательского режима. Механизм переопределения работает путем замены существующих ресурсов на те, которые вы указали в каталоге ресурсов вашего модуля. Он пытается сопоставить ваши пользовательские ассеты с теми, которые ранее были зарегистрированы другими модулями по их именам. Это происходит в зависимости от порядка загрузки модулей. + +Если **Module A** и **Module B** загружены в дополнение к модулю **Native** соответственно, список конечных ресурсов и их источников будет следующим: + + + + + + + + + + + + + + +
Native + Module A + Module B + Result +
adobe_wall
tarnished_metal
ground_mud
marble
-
adobe_wall
tarnished_metal
-
-
metal_plate
adobe_wall
-
ground_mud
-
-
Module B::adobe_wall
Module A::tarnished_metal
Module B::ground_mud
Native::marble
Module A::metal_plate
+ +В настоящее время модифицируемые типы ассетов: + +- [Материалы](#overriding-materials) +- [Сетки](#overriding-meshes) +- [Текстуры](#overriding-textures) +- [Физические объекты](#overriding-physics-shapes) + +### Иерархия папок + +Система ассетов обрабатывает некоторые папки в каталоге модуля специально в соответствии с их именами. Вот список этих папок и их использование: + +- **Assets** : Включает редактируемые файлы *.tpac в котором хранятся метаданные каждого ассета. +- **AssetSources** : Включает исходные файлы импортированных ассетов (.psd, .fbx). +- **AssetPackages** : Включает *.tpac файлы только для чтения. Генерируется, когда модуль упакован для сборки клиента. +- **EmAssetPackages** : Включает *.tpac файлы только для чтения. Генерируется, когда модуль упакован для сборки редактора. +- **DsAssetPackages** : Включает *.tpac файлы только для чтения. Генерируется при упаковке модуля для серверных сборок. +- **RuntimeDataCache** : Включает автоматически сгенерированные данные, необходимые движку для каждого ассета. Может быть удален, но может потребоваться время для создания с нуля во время запуска. + +### Разрешения на редактирование + +Система ассетов ищет разные папки в зависимости от версии исполняемого файла игры. В зависимости от наличия этих папок он решает, можно ли изменить модуль или его можно использовать только в режиме только для чтения. Если вы хотите распространить свой модуль, вы можете упаковать свои ассеты и поделиться упакованными папками, не распространяя тысячи файлов и их источников. У вас есть три варианта упаковки ваших активов: + +- **Client** : Другие могут активировать ваш модуль, чтобы играть. Вы должны распространить папку **AssetPackages**. +- **Editor** : Другие могут использовать ваш модуль в редакторе, но не могут его изменять. Используется, если вы хотите, чтобы другие извлекали модули из вашего модуля. Вы должны распространять папку **EmAssetPackages**. +- **Server** : Используется для серверных сборок. Все данные, не относящиеся к серверу, удаляются. Вы должны поставлять папку **DsAssetPackages**. + +Вы также можете поделиться своим модулем так же, как вы его используете, чтобы другие могли его изменять. В этом случае вы должны распределить папки **Assets**, **AssetSources** и, возможно, **RuntimeDataCache**. + +### Переопределение материалов +Переопределение материалов может быть выполнено путем создания нового материала с тем же именем, что и материал, который вы хотите переопределить. +Перейдите в каталог ресурсов вашего модуля и щелкните правой кнопкой мыши в пустое место на панели браузера. Создайте новый материал и переименуйте его в то же имя, что и у материала, который вы хотите переопределить. + +{{% panel footer="Материал существующей сетки замещенный модулем ModuleA" %}}![](/img/modding/assets/material_override.png){{% /panel %}} +На этом этапе все ссылки на материалы в системе будут перенаправлены на ваш пользовательский материал. +

+ +### Переопределение сеток +Модели можно импортировать из файлов нескольких форматов (например, Trf, Fbx). Ресурсы, импортированные из одного файла, группируются по именам в соответствии с <>правилами именования ресурсов<>. Представьте себе файл fbx следующим образом: + +- Model.fbx + - wall(Mesh) + - wall.lod1(Mesh) + - wall.lod3(Mesh) + - bo_wall(Physics Shape) + +Согласно соглашениям об именах ресурсов, первые три ресурса будут сгруппированы в одну сетку, в которой три подсетки принадлежат разным LOD. В конце будут импортированы два ресурса из Model.fbx : wall(Mesh) и bo_wall(Physics shape). + +Следуя этим правилам, вы можете экспортировать новый файл геометрии (например, fbx), который содержит группу сеток, имена которых начинаются с **wall**. В этом случае новая сетка **wall** будет создана из этих подсеток, а существующая сетка будет полностью заменена той, которую вы указали. Имя файла геометрии не учитывается. Стоит отметить, что переопределение сетки происходит на уровне сетки. Невозможно переопределить одиночную подсетку с помощью переопределения модуля. + +{{% panel footer="Существующая сетка куба с именем **testbox** заменена чайником модулем ModuleA" %}}![](/img/modding/assets/metamesh_override.png){{% /panel %}} +

+ +### Переопределение текстур +Переопределение текстур очень похоже на материалы. Вам необходимо импортировать новую текстуру с тем же именем текстуры, которую вы хотите переопределить. Вы также можете переименовать любую уже импортированную текстуру во что-то, что соответствует имени текстуры, которую нужно переопределить. + +{{% panel footer="Существующая текстура альбедо(естественный цвет объекта) с именем **roman_ground_d** переопределена модулем ModuleA с белой текстурой" %}}![](/img/modding/assets/texture_override.png){{% /panel %}} +

+ +### Переопределение физических фигур +Для переопределения физических фигур необходимо импортировать физическую форму с тем же именем ресурса, который вы хотите заменить. Установите флажок <>Asset naming conventions<>, чтобы увидеть возможность импорта физических фигур. + +{{% panel footer="Существующая форма тора, переопределенная модулем ModuleA с пользовательской формой аквилы" %}}![](/img/modding/assets/physics_shape_override.png){{% /panel %}} \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/overriding_scenes_prefabs.md b/docs/content/russian/Asset Management/Asset Types/overriding_scenes_prefabs.md new file mode 100644 index 0000000..283894d --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/overriding_scenes_prefabs.md @@ -0,0 +1,19 @@ ++++ +title = "Переопределение сцен и префабов" +description = "" +weight = 1 ++++ + +Вы можете переопределить существующие сцены и префабы, создав новые с тем же именем. + +{{% notice info %}} +Вы должны помнить, что переопределение префабов может нарушить существующие скрипты, если вы измените иерархию сущностей. Убедитесь, что вы сохранили иерархию сущностей, чтобы избежать возможных критических ошибок, если ваша сущность используется существующими скриптами. +{{% /notice %}} + +### Префабы + +Определения префабов хранятся в XML-файлах, расположенных в папке **Prefabs** в каталоге каждого модуля. + +### Сцены + +Сцены хранятся в двух отдельных папках **SceneObj** и **SceneEditData** в каталоге каждого модуля. Папка **SceneObj** хранит файлы, необходимые для открытия сцены в клиентском режиме, а **SceneEditData** хранит файлы, необходимые для операций редактирования. \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/path.md b/docs/content/russian/Asset Management/Asset Types/path.md new file mode 100644 index 0000000..235ed87 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/path.md @@ -0,0 +1,7 @@ ++++ +title = "Пути" +description = "" +weight = 1 ++++ + +"Пути" в RGL _(игровой движок)_ используются для определения непрерывных точек в сцене. Они имеют уникальные имена и могут использоваться логикой игрового процесса по разным причинам. Пути определяют, как движутся осадные машины в миссиях. Кроме того, для полевых боевых миссий кандидаты на начальные точки возрождения определяются через путь. Логика появления выбирает две позиции для команд в зависимости от размера битвы. Подробную информацию о редактировании пути можно найти в [Редактирование пути]({{< ref "path_editing.md" >}}). \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/prefabs.md b/docs/content/russian/Asset Management/Asset Types/prefabs.md new file mode 100644 index 0000000..1f06778 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/prefabs.md @@ -0,0 +1,15 @@ ++++ +title = "Сущности и префабы" +description = "" +weight = 1 ++++ + +Сущности в RGL _(игровой движок)_ - это контейнеры для всех сеток, частиц, компонентов скрипта, окклюдеров и физических объектов. Они также могут содержать другие сущности в качестве дочерних. У них есть собственная трансформация, определяющая их положение, масштаб и вращение в мире. + +##### Префабы + +Префабы - это объекты шаблона, которые не разрывают соединение с префабом даже после того, как он сохранен в сцене. Сложные объекты могут быть построены один раз и сохранены как сборные для использования в любое время и в любой сцене. Более поздние обновления префаба также повлияют на уже сделанные сцены. В Bannerlord почти все объекты миссий и реквизиты сцены являются сборными. + +##### Правила соединений + +После того как префаб помещен в сцену, все значения в префабе (цвета сетки, преобразования дочерних объектов, значения скрипта) связаны с исходным префабом и будут обновляться после каждого изменения исходного. Любое изменение в сцене для этих значений разорвет связь. Помните, что любая операция «Добавление» к префабу в сцене разорвет соединение префаба полностью. Примеры: добавление новой сетки, системы частиц, источника света, дочернего объекта или компонента скрипта. \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/scripts.md b/docs/content/russian/Asset Management/Asset Types/scripts.md new file mode 100644 index 0000000..dfe0ea8 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/scripts.md @@ -0,0 +1,19 @@ ++++ +title = "Скрипты" +description = "" +weight = 1 ++++ + +Компоненты сценария - это исполняемые сценарии, которые прикрепляются к объектам и могут использоваться для реализации различных функций игрового процесса. В Bannerlord большая часть игровой логики написана через компоненты скрипта. Например стулья, брошенное оружие, осадные машины. Есть много разных обратных вызовов, которые могут быть унаследованы и заполнены этими компонентами скрипта. + +##### Обратные вызовы + +* **Constructor**: В конструкторе необходимо присвоить значения по умолчанию его общедоступным переменным (переменные, которые могут быть изменены создателем сцены). В конструкторе компонент скрипта не назначается ни объекту, ни сцене. Кроме того, вы не должны писать никакой логики, которая имеет побочный эффект, потому что, даже если он создан, компонент сценария может быть удален после открытия сцены из-за системы обновления уровней. +* **OnPreInit**: Вызывается после того, как компонент сценария назначается его сущности-владельцу в сцене. Как только вы перейдете в этот обратный вызов, вы можете быть уверены, что пользовательские переменные из этого экземпляра скрипта установлены. Однако другие компоненты сценария других сущностей еще не могут быть назначены. Таким образом, в предварительной инициализации не должно быть никакого логического кода, который полагается на другие компоненты скрипта. Например, в предварительной инициализации ManagedObject регистрируется в массиве управляемых объектов в текущем экземпляре миссии. +* **OnInit**: Вызывается после загрузки миссии и инициализации всех скриптовых компонентов сущностей. Вы можете использовать любой тип логического кода внутри этого обратного вызова. Скрипты, созданные во время выполнения, также получают этот обратный вызов. +* **OnEditorInit**: Версия инициализации для редактора. Вызывается при загрузке сцены из редактора. Помните, что в редакторе нет миссии или состояния игры. +* **OnTick**: Вызывается для каждого компонента сценария в каждом кадре миссии из одного и того же потока. +* **OnEditorTick**: Версия функции OnTick для редактора. +* **IsOnlyVisual**: Если у вас есть компонент сценария, который является только визуальным и не имеет логического кода, который должен выполняться на выделенном сервере, вы должны вернуть true в этой функции. Это гарантирует, что этот тип сценариев не будет работать на выделенном сервере. +* **OnEditorVariableChanged**: Вызывается в редакторе всякий раз, когда пользователь изменяет общедоступную переменную в этом компоненте скрипта. Этот обратный вызов может использоваться для любого изменения состояния визуальной логики, если художнику нужна мгновенная обратная связь на сцене редактора. +* **OnRemoved**: Вызывается при удалении объекта или компонента скрипта. Если у вас есть какие-либо выделенные объекты, которые хранятся где-то еще (например, статические контейнеры), вы можете использовать этот обратный вызов, чтобы убедиться, что они не просочились. \ No newline at end of file diff --git a/docs/content/russian/Asset Management/Asset Types/skeletons.md b/docs/content/russian/Asset Management/Asset Types/skeletons.md new file mode 100644 index 0000000..c1303f0 --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/skeletons.md @@ -0,0 +1,5 @@ ++++ +title = "Скелеты" +description = "" +weight = 1 ++++ diff --git a/docs/content/russian/Asset Management/Asset Types/textures.md b/docs/content/russian/Asset Management/Asset Types/textures.md new file mode 100644 index 0000000..9c29d7e --- /dev/null +++ b/docs/content/russian/Asset Management/Asset Types/textures.md @@ -0,0 +1,11 @@ ++++ +title = "Текстуры" +description = "" +weight = 1 ++++ + +Текстуры можно импортировать через "Обозреватель ассетов". Их можно назначить материалам через "Редактор материалов". Слоты текстур материалов PBR можно найти в [Редакторе материалов]({{< ref "material_editor.md" >}}). + +{{% notice info %}} +Максимальное значение разрешения текстур ландшафта - 2048 на 2048. +{{% /notice %}} \ No newline at end of file diff --git a/docs/content/russian/Asset Management/_index.md b/docs/content/russian/Asset Management/_index.md new file mode 100644 index 0000000..da60d9a --- /dev/null +++ b/docs/content/russian/Asset Management/_index.md @@ -0,0 +1,7 @@ ++++ +title = "Управление ассетами" +description = "" +weight = 1 ++++ + +{{%children style="h5" description="true"%}} \ No newline at end of file diff --git a/docs/content/russian/Asset Management/faq.md b/docs/content/russian/Asset Management/faq.md new file mode 100644 index 0000000..d661187 --- /dev/null +++ b/docs/content/russian/Asset Management/faq.md @@ -0,0 +1,42 @@ ++++ +title = "Часто задаваемые вопросы" +weight = 3 ++++ + +##### Как установить инструменты? + +Вы можете скачать «Mount & Blade Bannerlord Modding Tools» в разделе «Инструменты» Steam. Обратите внимание, что инструменты используют некоторые файлы, загруженные в самой игре. Таким образом, инструменты и игра должны быть одной версии и установлены на одном жестком диске. + +##### Как запустить инструменты? +Вы можете использовать опцию ```SinglePlayer``` из ```Launcher```, и как только вы окажетесь в начальном меню, вы можете либо нажать кнопку ```Editor```, либо комбинацию клавиш ```Ctrl + E```, чтобы запустить редактор. + +##### Как создать ваш собственный модуль? +У нас есть встроенная функция в редакторе, которая создает новый модуль и заполняет его примерами XML-файлов, зарегистрированных в модуле, для упрощения добавления нового контента. После открытия редактора вы можете использовать опцию «Create New Module» в меню «File» на верхней панели инструментов. Обратите внимание, что вам необходимо перезапустить игру, чтобы зарегистрировать модуль из Launcher. + +##### Как редактировать оригинальные ресурсы? +Вы не можете редактировать оригинальные ресурсы, вы можете переопределить их в своем собственном модуле. Подробности смотрите на http://docs.modding.bannerlord.com/asset-management/asset-types/overriding_assets/ + +##### Я не могу добавить новые меши, текстуры и т.д. +Вы не можете добавлять ресурсы в оригинальные модули, вы должны добавить их в свой собственный модуль. В начале вам необходимо создать новый модуль: http://docs.modding.bannerlord.com/asset-management/quickguide_create_a_mod/ +Подробнее о добавлении новых ассетов: http://docs.modding.bannerlord.com/asset-management/asset-types/overriding_assets/ + +##### Примеры сцен на которые стоит обратить внимание + +- empire_village_003 +- khuzait_castle_002 +- sturgia_town_b +- battle_terrain_v +- empire_castle_keep_a_l3_interior +- empire_house_c_tavern_a +- empire_dungeon_a +- arena_empire_a +- Main_map + +##### Где найти примеры ассетов? +Вы можете просмотреть исходные ресурсы из браузера ресурсов, но для них нет исходных файлов, и вы не можете их экспортировать. Вскоре мы предоставим несколько примеров исходных файлов. + +##### У меня есть моды с DLL, и мои инструменты для создания модов не запускаются. +Если у вас есть какие-либо моды с включенными DLL, обязательно скопируйте их также в папку ```Modules\MOD_NAME\bin\Win64_Shipping_wEditor```. + +##### Мои инструменты моддинга не запускаются +Убедитесь, что на вашем компьютере установлен Visual Studio 2013 Redist x64. Также проверьте, совпадают ли номера версий базовой игры и инструментов моддинга. Если все вышеперечисленные проверки не работают, вы можете создать новую тему в разделе «Bug & Crashes» на форумах по моддингу (https://forums.taleworlds.com/index.php?forums/bug-crash-reports.784/). \ No newline at end of file diff --git a/docs/content/russian/Asset Management/generating_and_loading_ui_sprite_sheets.md b/docs/content/russian/Asset Management/generating_and_loading_ui_sprite_sheets.md new file mode 100644 index 0000000..eec20cf --- /dev/null +++ b/docs/content/russian/Asset Management/generating_and_loading_ui_sprite_sheets.md @@ -0,0 +1,232 @@ ++++ +title = "Создание и загрузка UI таблиц спрайтов" +weight = 3 ++++ + +#### Вступление +Спрайты - это двухмерные изображения, которые в основном используются в пользовательском интерфейсе игры. Таблицы спрайтов - это коллекция таких изображений. Другими словами, спрайты упаковываются вместе, чтобы сформировать лист спрайтов. В этой документации будут выполняться следующие шаги: + +* Добавление новых спрайтов. +* Создание листов спрайтов из добавленных вами спрайтов. +* Импорт листов спрайтов в ваш модуль. +* Использование спрайтов в файлах UI XML. +* Загрузка и выгрузка категорий спрайтов. + +#### Предпосылки +* Подмодуль создан в INSTALLATION_PATH\Mount & Blade II Bannerlord\Modules\ +* Известно как собрать проект в Integrated Development Environment (IDE) например Visual Studio. +* Mount & Blade II: Bannerlord - Modding Kit загружен в Steam. + +#### Добавление спрайтов +* Создайте новую папку с именем GUI в Modules\YOUR_MODULE_NAME\ +* Создайте новую папку с именем SpriteParts во вновь созданной папке GUI. +* Создайте новую папку с именем ui_{YOUR_CATEGORY_NAME} в созданной папке SpriteParts. В этой документации он будет называться **ui_mycategory**. +* Примечание. Контент внутри ui_{YOUR_CATEGORY_NAME} будет помещен в одну категорию под названием YOUR_CATEGORY_NAME. Все спрайты в категории загружаются и выгружаются вместе. Предлагается разделить ваши спрайты на категории (вместо того, чтобы иметь только одну категорию), чтобы избежать загрузки ненужных спрайтов. Например, вы можете создать новый экран в игре, который требует загрузки определенных спрайтов. Эти спрайты можно упаковать в категорию, и как только этот экран будет открыт, вы сможете загрузить только соответствующие спрайты, а затем, когда экран будет закрыт, вы сможете выгрузить их (см. Раздел «Загрузка и выгрузка категорий спрайтов»). +* Поместите свои спрайты в папку ui_{YOUR_CATEGORY_NAME}. Например, этот спрайт добавлен и назван **mysprite.png**: + + + +#### Генерация таблиц спрайтов +Чтобы сгенерировать листы спрайтов, запустите TaleWorlds.TwoDimension.SpriteSheetGenerator.exe расположенный в INSTALLATION_PATH\Mount & Blade II Bannerlord\bin\Win64_Shipping_wEditor. Если вы выполнили указанные выше действия, после запуска SpriteSheetGenerator.exe вы должны увидеть следующее окно: + + + +SpriteSheetGenerator.exe создаст две папки с именами Assets и AssetSources в Modules\YOUR_MODULE_NAME. Он также создаст файл SpriteData.xml (с префиксом имени вашего модуля) в разделе Modules\YOUR_MODULE_NAME\GUI. + +#### Импорт созданной таблицы спрайтов +Чтобы использовать спрайты в ваших таблицах спрайтов, вы также должны импортировать их из браузера ресурсов. Выполните следующие действия, чтобы импортировать лист спрайтов: + +* Убедитесь, что вы встроили свой проект в Modules\YOUR_MODULE_NAME\bin\Win64_Shipping_wEditor (в дополнение к Win64_Shipping_Client). Если ваш проект не собран должным образом, вы получите сбой при запуске. +* Запустите Mount & Blade II: Bannerlord - Modding Kit из Steam. +* Убедитесь, что ваш режим выбран в разделе «Моды» на панели запуска, затем нажмите «Играть». +* В главном меню нажмите Alt + `, чтобы открыть консоль. +* Введите resource.show_resource_browser и нажмите Enter. + + + +При этом должен открыться браузер ресурсов: + + + +Сверните папку Native в левой части браузера ресурсов, чтобы легко увидеть ваш модуль. Затем выберите свой модуль. + + + +Откройте папку GauntletUI в вашем модуле. Затем нажмите кнопку «Сканировать новые файлы ресурсов», на которую указывает красная стрелка внизу (стрелка справа). + + + +Откроется новое окно: + + + +Убедитесь, что ваша категория выбрана (в примере это ui_mycategory), затем нажмите кнопку «Импорт». Затем вы должны увидеть что-то похожее на это: + + + +Закройте браузер ресурсов и игру. +Теперь вы должны увидеть новый файл с именем ui_{YOUR_CATEGORY_NAME}_1_tex.tpac в Modules\YOUR_MODULE_NAME\Assets\GauntletUI. + +#### Использование спрайтов в UI XML файлах +Теперь вы можете использовать спрайты в таблицах спрайтов, которые вы создали (вам также необходимо загрузить соответствующую категорию, которая объясняется ниже в разделе «Загрузка и выгрузка категорий спрайтов»). Спрайты используются в XML-файлах пользовательского интерфейса. Вы можете ссылаться на свои спрайты по их именам. Вы можете найти имена своих спрайтов в файле SpriteData.xml (с префиксом имени вашего модуля), который находится в Modules\YOUR_MODULE_NAME\GUI. +В качестве примера мы создадим новый UI XML-файл. Для этого вернитесь в папку с именем GUI в разделе Modules\YOUR_MODULE_NAME и создайте новую папку с именем Prefabs. Создайте новый файл с именем MyXml.xml в папке Prefabs. Теперь вы можете ссылаться на свои спрайты в этом файле как Sprite="mysprite". Например, содержимое файла MyXml.xml может быть: + +```xml + + + + + + + + + +``` + +#### Загрузка и выгрузка категории спрайтов +Чтобы использовать добавленные вами спрайты, вам необходимо их загрузить. У вас есть два варианта: + +1. Загрузка и выгрузка вручную +* Разработчик имеет больше возможностей для контроля. Они могут выбирать, когда категории спрайтов загружаются и выгружаются. Таким образом, они могут управлять использованием памяти и производительностью. +* Требуется написание кода. Этот вариант более сложный, чем вариант AlwaysLoad. + +2. Использование опции AlwaysLoad +* Категории спрайтов загружаются при запуске автоматически. +* Категории хранятся в памяти до закрытия игры. Таким образом, нет необходимости загружать их вручную каждый раз, когда они используются. +* Уменьшено время загрузки пользовательского интерфейса за счет увеличения использования памяти. +* Легко использовать. + +##### 1. Загрузка и выгрузка вручную +Здесь мы покажем, как загружать и выгружать категории спрайтов вручную. В приведенном ниже примере мы переопределяем методы OnGameStart и OnGameEnd класса MBSubModuleBase для добавления и удаления глобального слоя MyScreen соответственно. Обратите внимание, что конструктор MyScreen загружает категорию спрайтов и пользовательский интерфейс XML, которые мы создали в предыдущих разделах. Мы также выгружаем категорию спрайтов внутри метода OnFinalize. + +Если вы собираетесь скопировать приведенный ниже код, не забудьте изменить пространство имен и имя функции Main. Они должны совпадать с полями в вашем SubModule.xml. Другими словами, вы должны изменить SpritesheetDocumentation (пространство имен) на YOUR_MODULE_NAME и Main (имя функции Main) на YOUR_MAIN_FUNCTION_NAME в этом поле SubModule.xml: + +```xml + +``` + +В противном случае они не будут распознаны, и игра вылетит при запуске. + +```C# +using TaleWorlds.Core; +using TaleWorlds.MountAndBlade; +using TaleWorlds.Engine.Screens; +using TaleWorlds.Engine.GauntletUI; +using TaleWorlds.GauntletUI.Data; +using TaleWorlds.TwoDimension; + +namespace SpritesheetDocumentation +{ + public class Main : MBSubModuleBase + { + private MyScreen _myScreen; + + protected override void OnSubModuleLoad() + { + + } + + protected override void OnGameStart(Game game, IGameStarter gameStarterObject) + { + base.OnGameStart(game, gameStarterObject); + _myScreen = new MyScreen(); + ScreenManager.AddGlobalLayer(_myScreen, true); // add MyScreen on game start + } + + public override void OnGameEnd(Game game) + { + base.OnGameEnd(game); + _myScreen.OnFinalize(); + ScreenManager.RemoveGlobalLayer(_myScreen); // remove MyScreen on game end + } + } + + public class MyScreen : GlobalLayer + { + private GauntletLayer _gauntletLayer; + private IGauntletMovie _gauntletMovie; + private SpriteCategory _category; + + public MyScreen() + { + var spriteData = UIResourceManager.SpriteData; + var resourceContext = UIResourceManager.ResourceContext; + var resourceDepot = UIResourceManager.UIResourceDepot; + + _category = spriteData.SpriteCategories["ui_mycategory"]; // select which category to load, put your category name here + _category.Load(resourceContext, resourceDepot); // load the selected category + + _gauntletLayer = new GauntletLayer(2); + Layer = (ScreenLayer)_gauntletLayer; + + _gauntletMovie = _gauntletLayer.LoadMovie("MyXml", null); // load the ui xml in Prefabs folder + } + + public void OnFinalize() + { + // unload ui xml, sprite category, layer, etc. + _gauntletMovie = null; + _category.Unload(); + _gauntletLayer = null; + } + } +} +``` + +##### 2. Использование опции AlwaysLoad +Вместо того чтобы вручную загружать категории спрайтов, как в разделе «Загрузка и выгрузка вручную», вы можете выбрать, какие категории спрайтов должны загружаться автоматически при запуске включив параметр AlwaysLoad для этих категорий. Если разработчик не выгружает их вручную, категории, для которых включена опция AlwaysLoad, будут храниться в памяти до закрытия игры, чтобы вам не приходилось загружать их вручную каждый раз, когда они используются. Включение параметра AlwaysLoad уменьшает время загрузки пользовательского интерфейса (поскольку эти категории загружаются только один раз при запуске), но увеличивает использование памяти (поскольку эти категории будут храниться в памяти, даже если они не используются). Эта опция очень полезна для категорий, которые часто загружаются и выгружаются (например, категория которая используется на экране, который часто открывается и закрывается). + +Примечание. Эта функция была выпущена с версией e1.6.2. Если вы используете более раннюю версию и все еще хотите использовать опцию AlwaysLoad, переключите игру и набор инструментов для моддинга на версию e1.6.2 или более новую. + +Чтобы включить параметр AlwaysLoad для категории, выполните следующие действия: + +Создайте новый XML-файл с именем Config.xml в папке Modules\YOUR_MODULE_NAME\GUI\SpriteParts. Скопируйте и вставьте в Config.xml следующее: + +```xml + + + + + +``` + +Замените ui_{YOUR_CATEGORY_NAME} своей категорией. Затем сгенерируйте таблицы спрайтов, выполнив действия, описанные в разделе «Создание таблиц спрайтов» выше. Чтобы проверить, все ли в порядке, откройте файл с именем {YOUR_MODULE_NAME} SpriteData.xml, который находится в Modules\YOUR_MODULE_NAME\GUI. Там вы должны увидеть, что опция AlwaysLoad включена для категорий, которые вы выбрали в Config.xml: + +```xml + + + + ui_{YOUR_CATEGORY_NAME} + + 1 + + + + ... + +``` + +Вам не нужно изменять/добавлять какой-либо код для загрузки новой категории таблицы спрайтов. + +#### Заключение +Убедитесь, что вы создали экран и загрузили UI XML-файл, который вы создали в разделе «Использование спрайтов в UI XML-файлах», чтобы увидеть результат ниже. + +Примечание. Если вы добавили категорию спрайтов с опцией AlwaysLoad и не использовали код, опубликованный в разделе "Загрузка и выгрузка вручную", вы можете написать свой собственный код для создания экрана и загрузки UI XML. Если вы не знаете как это сделать, тогда вы можете скопировать код из раздела "Загрузка и выгрузка вручную" (также прочтите подробности в этом разделе) и удалить следующие строки, поскольку вы использовали параметр AlwaysLoad и они вам не нужны для загрузки категорий вручную: + +```C# +var spriteData = UIResourceManager.SpriteData; +var resourceContext = UIResourceManager.ResourceContext; +var resourceDepot = UIResourceManager.UIResourceDepot; + +_category = spriteData.SpriteCategories["ui_mycategory"]; // select which category to load, put your category name here +_category.Load(resourceContext, resourceDepot); // load the selected category +``` + +Вы также можете удалить поле _category и удалить его ссылки. + +* Убедитесь, что вы встроили свой проект в Modules\YOUR_MODULE_NAME\bin\Win64_Shipping_Client. +* Запустите игру (не Modding Kit) из Steam и убедитесь, что ваш модуль выбран в разделе «Моды» в лаунчере, затем нажмите «Play». +* Создайте новую кампанию или загрузите совместимый файл сохранения, чтобы открыть карту кампании. Оба они начнут игру. Обратите внимание, что в написанном нами коде экран добавляется после запуска игры (проверьте метод OnGameStart). +* После того как вы запустите игру, создав новую кампанию, вы должны увидеть этот экран: + + \ No newline at end of file diff --git a/docs/content/russian/Asset Management/horse_reins_simulation_creation.md b/docs/content/russian/Asset Management/horse_reins_simulation_creation.md new file mode 100644 index 0000000..84c77fe --- /dev/null +++ b/docs/content/russian/Asset Management/horse_reins_simulation_creation.md @@ -0,0 +1,61 @@ ++++ +title = "Имитация поводьев лошади" +weight = 3 ++++ + +### Введение + +В этом руководстве объясняется, как добавить симуляцию к поводьям комплекта конской брони. + +Ранее мы использовали только одну сетку для конской брони, однако поводья висели в воздухе и не двигались под действием силы тяжести. Затем мы решили добавить симуляцию к поводьям, что означало внесение некоторых изменений в систему. Вместо одной сетки, конские доспехи теперь содержат 3-и сетки. Разделим их на 2-е группы. + +#### Группа 1: + +- **Конские доспехи / сбруя**: Комплект доспехов, связанный с телом лошади, как показано на изображении 2b (который имеет собственную симуляцию, но мы пока не будем это учитывать). Пример: horse_harness_x +- **Оригинальные поводья**: Часть, которая отделена от первоначальной единой сетки, о которой мы упоминали выше, и она видна на изображении 2c. Мы сохранили этот немоделированный кусок для случаев, когда имитируемый кусок не нужен; это когда камера находится далеко от лошади и комплект брони начинает переключаться на LOD 1 и на остальные LODы. Пример: horse_harness_x_rein + +#### Группа 2: + +- **Имитация поводья**: Когда камера приближается к лошади, всадник держит поводья, и поводья двигаются согласно физике. Пример: horse_harness_x_rein_rope + +В этом уроке в основном объясняется, как создать третью сетку, которая является «имитируемой частью поводья». Но прежде чем углубиться в пошаговые инструкции, мы хотели бы прояснить несколько моментов. + +| | | +| ------ | ----------- | +| | | +| **Рисунок 1a**; *Normally each component has a different name but we will refer to the parts of our mesh either as headpiece or rein as shown in Image 1b.* | **Рисунок 1b**; *For simplicity and due to functionality we will only use “head piece” and “reins”.* | + +Мы назвали конскую сбрую как "horse_harness_x", в качестве примера ниже (отмечены светло-серым), при объяснении группировки (эти имена выбраны только в качестве примеров. Имейте в виду, что в папке есть меши с именами "horse_harness_x", "horse_harness_x_rein", "horse_harness_x_rein_rope" которые уже в игре. + + | | +------- | ------- | -------- + | | +**Рисунок 2a**; *This is the initial stage where you model the horse harness/armor and rein according to horse anatomy. The rein should be modelled so that it is positioned within the rider’s reach (we have modelled the armor sets in 3ds Max).* | **Рисунок 2b**; *horse_harness_x.* | **Рисунок 2c**; *horse_harness_x_rein (headpiece is part of this mesh which will later be duplicated to become horse_harness_x_rein_rope).* + +В следующей главе мы поговорим о том, как создать третий компонент; «Имитация поводья» комплекта брони. + +### Имитация поводья: Horse_harness_x_rein_rope + +Для смоделированной части требуется еще один скелет, который является частью нашего набора для моддинга, доступного в Mount & Blade II Bannerlord\modding_resources (смотри рисунок 3). + + + +**Рисунок 3**; *horse_harness_rein_skeleton which contains 22 bones is on the left. On the right we have a demonstration of how the horse_harness_x_rein_rope is supposed to fit on the skeleton.* + +#### Шаги по созданию моделирующей сетки: +1. Продублируйте меш "horse_harness_x_rein". +2. Переименуйте в "horse_harness_x_rein_rope". +3. Настройте новую сетку ("horse_harness_x_rein_rope") так, чтобы она идеально сидела на "horse_harness_rein_skeleton" (когда вы закончите, сетка должна выглядеть так, как на изображениях 5a и 5b). +4. Скин "horse_harness_x_rein_rope" в соответствии с "horse_harness_rein_skeleton". На рисунке 4 показан список костей рассматриваемого скелета. +5. Установите альфа-вершину моделируемой области на "100". Установите остальные не смоделированные вершины на "0" (см. изображение 6). + + | | | +------- | ------- | -------- | -------- + | | | +**Рисунок 4**; *bones of horse_harness_rein_skeleton.* | **Рисунок 5a**; *side view of horse_harness_x_rein_rope compared to horse_harness_x_rein.* | **Рисунок 5b**; *top view of horse_harness_x_rein_rope (selected mesh) compared to horse_harness_x_rein.* | **Рисунок 6**; *alphas of the selected vertices (red/lighter) are set to “100” since they belong to the simulated region of the rein. The part where the rider holds and the head piece (see Image 1b) are not simulated, hence they are set to “0”.* + +### Экспорт мешей в игру + +Экспортируйте меши в формате fbx в указанную папку: + +[Game Folder]\Modules\[Mod Folder]\AssetSources \ No newline at end of file diff --git a/docs/content/russian/Asset Management/how_to_add_custom_fonts.md b/docs/content/russian/Asset Management/how_to_add_custom_fonts.md new file mode 100644 index 0000000..d735346 --- /dev/null +++ b/docs/content/russian/Asset Management/how_to_add_custom_fonts.md @@ -0,0 +1,162 @@ ++++ +title = "Как добавить собственные шрифты" +weight = 3 ++++ + +#### Вступление + +В этой документации будут выполняться следующие шаги: + +* Настройка файлов и путей +* Генерация шрифтов +* Размещение файлов в папке модуля +* Создание таблиц спрайтов +* Как использовать шрифты в Bannerlord + +#### Предварительные условия + +* TrueTypeFont file for the font. E.g. (OpenSans-Regular.ttf) +* Mount & Blade II: Bannerlord - Modding Kit downloaded from steam +* Knowledge on generating UI Spritesheets (see: [GENERATING AND LOADING UI SPRITE SHEETS](http://docs.modding.bannerlord.com/asset-management/generating_and_loading_ui_sprite_sheets/)) + +#### Настройка файлов и путей + +* Go to Mount & Blade II Bannerlord\GUI\GauntletUI\Fonts\. +* Make sure the two files below exist in the directory. We will use them to generate our font data. + * **GenerateFont.bat** + * **GenerateFontSettings.txt** +* Move your **.ttf** font file to the directory. +* For our example, we will use a font file named **OpenSansRegular.ttf**. +* Open the file: "**GenerateFontSettings.txt**". +* "**GenerateFontSettings.txt**" default values are: + +```text +-fontpath {FONT\_PATH.ttf} +-outputpath {OUTPUT\_PATH.png} +-atlassize 2048 2048 +-size 64 +-angle 8 +-range 16 +-padding 16 +-smooth 0 +-smoothingConstant 0.5-mode 1 +``` + +* Here, we need to change the placeholder variables **{FONT\_PATH.ttf}** and **{OUTPUTPATH.png}** with actual paths. +* The paths here are relative to the directory: **…\bin\Win64_Shipping_wEditor** directory unless you specify a full path. +* Please note that if you want to use paths that contain spaces, you need to put them inside quotes. +* Setting -fontpath: + * In our example, the variable should be: **-fontpath OpenSansRegular.ttf**. +* Setting -outputpath: + * This variable determines where the **.png** file should be placed. We should use a **.png** file path to a non-existent file which will be created in the process of generating atlas. + * In our example we set the -outputpath variable as: **-outputpath OpenSansRegular.png**. +* The contents of **GenerateFontSettings.txt** should now look like this: + +```text +-fontpath OpenSansRegular.ttf +-outputpath OpenSansRegular.png +-atlassize 2048 2048 +-size 64 +-angle 8 +-range 16 +-padding 16 +-smooth 0 +-smoothingConstant 0.5-mode 1 +``` + +_Если сгенерированный файл .png не содержит всех символов для вашего шрифта, рассмотрите возможность увеличения_ **-atlassize**. + +#### Генерация шрифтов + +* Теперь, когда файлы добавлены и установлены правильные пути для генератора, запустите **GenerateFont.bat**. +* Если все настроено правильно, программа не выдаст никаких ошибок и сгенерирует 3 файла в каталоге, который вы определили в **-outputpath**. + * В нашем примере это 3 файла: + * **OpenSansRegular.fnt** + * **OpenSansRegular.bfnt** + * **OpenSansRegular.png** +* If you see any errors in the batch script, make sure that the **-fontpath** and **-outputpath** variables are set correctly. +* В нашем примере 3 сгенерированных файла расположены в каталоге **...\bin\Win64_Shipping_wEditor**, поскольку мы указываем относительный путь. + +#### Размещение файлов в папке модуля + +* На предыдущем шаге мы создали 3 файла. Теперь нам нужно поместить эти файлы в наш модуль. + +##### Файлы шрифтов + +* Go to **{YOURMODULE}\GUI\Fonts** folder. If your module doesn't have a **Fonts** folder, create it. +* Move the generated **.fnt** and **.bfnt** files to the **Fonts** folder, in our example they are named **OpenSansRegular.fnt** and **OpenSansRegular.bfnt**. + +##### Файл изображения + +* Go to **{YOURMODULE}\GUI\SpriteParts** folder. If your module doesn't have any **GUI** or **SpriteParts** folders, create them. +* In the **SpriteParts** folder, create an empty folder named **ui\_custom\_fonts**. +* If you don't have a **Config.xml** in your **SpriteParts** folder, create it too. +* At this stage, **SpriteParts** folder should have a folder named **ui\_custom\_fonts** and a file named **Config.xml**. +* Now we can move our **.png** file to the ui\_custom\_fonts folder. In our example, the file is named **OpenSansRegular.png**. + +##### Конфигурация + +* Чтобы иметь возможность использовать наш шрифт в игре, нам нужно указать в нашем **Config.xml** файле, что наш шрифт должен загружаться автоматически. +* Содержимое Config.xml должно включать этот конфиг: + +```xml + + + + + + + + +``` + +* Note that **ui\_custom\_fonts** here comes from the name of the folder you created in **{YOURMODULE}\GUI\SpriteParts**. + +#### Генерация таблиц спрайтов + +* Теперь необходимо сгенерировать таблицы спрайтов шрифта, используя файл **.png**, созданный в последнем процессе. +* Мы кратко расскажем, как добавить новый шрифт в таблицы спрайтов. Подробное объяснение см. [GENERATING AND LOADING UI SPRITE SHEETS](http://docs.modding.bannerlord.com/asset-management/generating_and_loading_ui_sprite_sheets/). + * Запустите генератор таблицы спрайтов, просто запустив **Mount & Blade II Bannerlord\bin\Win64\_Shipping\_wEditor\TaleWorlds.TwoDimension.SpriteSheetGenerator.exe**. + * Если все было настроено правильно, вывод генератора таблицы спрайтов должен выглядеть так: + + * Вы должны импортировать шрифт через браузер ресурсов в игре. Что было объяснено в [документе](http://docs.modding.bannerlord.com/asset-management/generating_and_loading_ui_sprite_sheets/) выше. + +#### Использование недавно добавленных шрифтов + +* Если мы все сделали правильно, мы сможем использовать наши недавно добавленные шрифты в игре. +* Чтобы использовать шрифт, мы можем объявить его имя в кисти, например: + +```xml + + +