Меню

Как изменить цвет полоски здоровья



Как изменить цвет полоски здоровья

Создание полоски здоровья, меняющей цвет

front Дата: Понедельник, 12.10.2009, 16:23 | Сообщение # 1

Автор: Xmk, на основе полоски оружия из Симбиона

Для этого нам понадобятся стандартные файлы:
config/ui/maingame.xml
config/ui/ui_custom_msgs.xml
scripts/bind_stalker.script

1. Создаём файл new_hud_health.script в папке gamedata/scripts и пишем в него:

200?’200px’:»+(this.scrollHeight+5)+’px’);»> local hud_name = «hud_health»

— записываем переменную
function save_variable(variable_name, value)
xr_logic.pstor_store(db.actor, variable_name, value)
end

— загружаем переменную
function load_variable(variable_name, value_if_not_found)
return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

— удаляем переменную
function del_variable(variable_name)
if db.storage[db.actor:id()].pstor[variable_name] then
db.storage[db.actor:id()].pstor[variable_name] = nil
end
end

— координаты(параметры) x, y, width, height
local pbg = —/ bg
local plv = —/ lv

local skl_w = -1 —/ текущая длина шкалы
local wide = false —/ текущий режим экрана

local color = 0
local change_color = false
local change_wpn = false
local hud_show = false

function update(bShow)
local hud = get_hud()
local cs_bg = hud:GetCustomStatic(«hud_health_bg»)
local cs_lv = hud:GetCustomStatic(«hud_health_lv»)

if (load_variable(«opt_hp»,true) == false or bShow == false) then
if cs_bg then hud:RemoveCustomStatic(«hud_health_bg») end
if cs_lv then hud:RemoveCustomStatic(«hud_health_lv») end
return
save_variable(«opt_hp»,false)
end

local hp = db.actor.health

if (hp == nil or hp == 0) then
if hud_show == false then —/ рамку можно не стирать при смене оружия
if cs_bg then hud:RemoveCustomStatic(«hud_health_bg») end
end
if cs_lv then hud:RemoveCustomStatic(«hud_health_lv») end
return
end

— проверка смены режима экрана
if wide

= db.wide then
wide = db.wide
if cs_bg then hud:RemoveCustomStatic(«hud_health_bg») end
if cs_lv then hud:RemoveCustomStatic(«hud_health_lv») end
cs_bg, cs_lv = nil, nil
end

local cur_hud = «hud_health_bg»
if cs_bg == nil then
hud:AddCustomStatic(cur_hud, true)
cs_bg = hud:GetCustomStatic(cur_hud)
local wnd = cs_bg:wnd()
if wnd then
pbg = read_params(cur_hud)
wnd:SetWndPos(pbg.x,pbg.y)
wnd:SetWidth (pbg.w)
wnd:SetHeight(pbg.h)
wnd:SetAutoDelete(true)
end
end

cur_hud = «hud_health_lv»
if cs_lv == nil then
hud:AddCustomStatic(cur_hud, true)
cs_lv = hud:GetCustomStatic(cur_hud)
local wnd = cs_lv:wnd()
if wnd

Источник

как изменить цвет полоски здоровья ?

Здравствуйте. Например у дружественных героев или крипах зелёная полоска. У других она красная (противников). Я видел, что как-то меняют цвет этой полоски на синий, темно-зелёный цвет. Помогите!

В папках игры ройся найдешь цвет.

где именно? вот пример:

В настройках игры Видео\Аудио есть строчка «Эффект цветовой слепоты»
Это вроде то, что нужно

Для вражеской команды:
dota_enemy_color_r 1.0 (по умолчанию значение 1.0) — красный
dota_enemy_color_g 0 (по умолчанию значение 0) — зелёный
dota_enemy_color_b 0 (по умолчанию значение 0) — синий

Пишем команду и значение от 0 до 1.0 (т.е. 0.1, 0.2 и тд)
Можно намешать любой цвет, главное указать верные пропорции

Для своей команды:
dota_friendly_color_r 0 (по умолчанию значение 0) — красный
dota_friendly_color_g 1.0 (по умолчанию значение 1.0) — зелёный
dota_friendly_color_b 0 (по умолчанию значение 0) — синий

Источник

Как изменить цвет полоски здоровья

Думал что туда и написал 😀

Думал что туда и написал 😀

Многие дотеры думаю, что это форум доты, всу уже привыкли.

Думал что туда и написал 😀

Многие дотеры думаю, что это форум доты, всу уже привыкли.

Мне кажется ваше заявление ошибочно, дотеры и думать, чистейший оксюморон

Многие дотеры думаю, что это форум доты, всу уже привыкли.

Мне кажется ваше заявление ошибочно, дотеры и думать, чистейший оксюморон

Многие дотеры думаю, что это форум доты, всу уже привыкли.

я уверен в том, что думаю

Многие дотеры думаю, что это форум доты, всу уже привыкли.

я уверен в том, что думаю

Мне кажется ваше заявление ошибочно, дотеры и думать, чистейший оксюморон

Тебе кажется, а я уверен в том, что думаю я продуктивнее тебя минимум процентов на 40 в среднем:). Дальше думай сам

Мне кажется ваше заявление ошибочно, дотеры и думать, чистейший оксюморон

А если человек играет в доту против ботов, у него ещё есть надежда?

Источник

Как изменить цвет интерфейса в CS:GO, настройка HUD

  • Изменить цвет жизней, брони и оружия
  • Настроить размер HUD
  • Настроить радар
  • поменять расположение иконок

Чтобы изменить настройки HUD нужно зайти в консоль игры.

1)Включаем консоль: Настройки ==> Параметры игры ==> Включить консоль разработчика.

2)Открываем консоль нажатием клавиши тильда “

” “Ё” и вводим в консоль нужные нам команды.

Изменение цвета HUD

cl_hud_color 2 – светло-голубой

cl_hud_color 3 – синий

cl_hud_color 4 – сиреневый

cl_hud_color 5 – красный

cl_hud_color 6 – оранжевый

cl_hud_color 7 – жёлтый

cl_hud_color 8 – светло-зелёный

cl_hud_color 9 – бирюзовый

cl_hud_color 10 – розовый

cl_loadout_colorweaponnames 1 -если у вас есть скин, то шрифт такого же цвета ,что и качество оружие.(Например: тайное – красного цвета)
cl_loadout_colorweaponnames 0 – шрифт стандартного цвета

Настройка радара

cl_radar_rotate 1 – поворачивается следом за движением игрока.
cl_radar_rotate 0 – неподвижен (всегда повёрнут в одну сторону).

cl_radar_always_centered 0 – камера радара движется вслед за перемещениями персонажа.
cl_radar_always_centered 1 – камера радара неподвижна.

cl_hud_radar_scale (от 0.8 до 1.3) – изменение размера радара (1 – стандарт).

Изменение расположения элементов

Изменение размера и внешнего вида HUD

cl_hud_healthammo_style 1 – в панели здоровья и брони отображаются только цифры.
cl_hud_healthammo_style 0 – в панели здоровья и брони отображаются шкала и цифры.

cl_showloadout 1 – в правому углу иконки всего оружия, которое находится у игрока.
cl_showloadout 0 – иконки оружия не отображаются.

Источник

Fallout 4 «Шильдики — плавающие полоски здоровья»

Название: Шильдики — плавающие полоски здоровья
Автор: Expired6978

Для роботы мода нужен Fallout 4 Script Extender (F4SE)

Описание:
Мод добавляет плавающие полоски здоровья в мир для любого NPC который находиться в бою.

Как это работает:
Плагин F4SE вводит дополнительный слой в HUD и регистрирует специальный компонент худ внутри этого слоя.
Слой обновляется на каждом кадре-основы и преобразует положение головы актера, чтобы положение экрана и масштаб двигался по глубине .

Как изменить цвета панели?
Это можно сделать в текстовом файле «Data\F4SE\Plugins\F4EE\hudextension.ini».
Оставив цвет на «-1» то мод будет использовать цвета по умолчанию ( Цвет вашего hud’, или красный цвет)

Могу ли я изменить какие полоски я буду видеть?
Да, вы можете выбрать, какие вы хотите видеть полоски то ли только тиммейтов или врагов, не враждебные, и любые другие комбинации. Все это вы можете изменить в Data\F4SE\Plugins\F4EE\hudextension.ini

Как мне удалить его?
Удалить файлы, включенные в архив:
Data\Interface\HUDExtension.swf
Data\F4SE\Plugins\hudextension.ini
Data\F4SE\Plugins\hudextension.dll

Установка:
— с помощью установщика модов или в ручную скопируйте файлы с архива в папку Data с игрой;
— в файле fallout4.ini (documents/mygames/fallout4/):измените [Archive]sResourceDataDirsFinal=STRINGS, на:[Archive]sResourceDataDirsFinal=STRINGS, TEXTURES, MUSIC, SOUND, INTERFACE, MESHES, PROGRAMS, MATERIALS, LODSETTINGS, VIS, MISC, SCRIPTS, SHADERSFX

Источник

Unity: отрисовываем множество полосок здоровья за один drawcall

Недавно мне нужно было решить задачу, достаточно распространённую во многих играх с видом сверху: рендерить на экране целую кучу полосок здоровья врагов. Примерно вот так:

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

Я не буду никого стыдить за код, но достаточно сказать, что некоторые из решений были не совсем блестящими, например, кто-то добавлял к каждому врагу объект Canvas (что очень неэффективно).

Метод, к которому я в результате пришёл, немного отличается от всего того, что я видел у других, и не использует вообще никаких классов UI (в том числе и Canvas), поэтому я решил задокументировать его для общества. А для тех, кто хочет изучить исходный код, я выложил его на Github.

Почему бы не использовать Canvas?

По одному Canvas для каждого врага — это очевидно плохое решение, но я мог использовать общий Canvas для всех врагов; единственный Canvas тоже бы привёл к батчингу вызовов отрисовки.

Однако мне не нравится связанный с таким подходом объём выполняемой в каждом кадре работы. Если вы используете Canvas, то в каждом кадре придётся выполнять следующие операции:

  • Определять, какие из врагов находятся на экране, и выделять каждому из них из пула полоску UI.
  • Проецировать позицию врага в камеру, чтобы расположить полоску.
  • Изменять размер «заливки» части полоски, вероятно, как Image.
  • Скорее всего изменять размер полосок в соответствии с типом врагов; например, у крупных врагов должны быть большие полоски, чтобы это не выглядело глупо.

Как бы то ни было, всё это загрязняло бы буферы геометрии Canvas и приводило к перестройке всех данных вершин в процессоре. Я не хотел, чтобы всё это выполнялось для столь простого элемента.

Вкратце о моём решении

Краткое описание процесса моей работы:

  • Прикрепляем объекты полосок энергии к врагам в 3D.
    • Это позволяет автоматически располагать и усекать полоски.
    • Позицию/размер полоски можно настраивать в соответствии с типом врага.
    • Полоски мы направим на камеру в коде с помощью transform, который всё равно есть.
    • Шейдер гарантирует, что они всегда будут рендериться поверх всего.
  • Используем Instancing для рендеринга всех полосок за один вызов отрисовки.
  • Используем простые процедурные UV-координаты для отображения уровня заполненности полоски.

А теперь давайте рассмотрим решение подробнее.

Что такое Instancing?

В работе с графикой уже давно используется стандартная техника: несколько объектов объединяются вместе, чтобы они имели общие данные вершин и материалы и их можно было отрендерить за один вызов отрисовки. Нам нужно именно это, потому что каждый вызов отрисовки — это дополнительная нагрузка на ЦП и GPU. Вместо выполнения по одному вызову отрисовки на каждый объект мы рендерим их все одновременно и используем шейдер для добавления вариативности в каждую копию.

Можно делать это вручную, дублируя данные вершин меша X раз в одном буфере, где X — максимальное количество копий, которое может быть отрендерено, а затем использовав массив параметров шейдера для преобразования/окраски/варьирования каждой копии. Каждая копия должна хранить знание о том, каким нумерованным экземпляром она является, чтобы использовать это значение как индекс массива. Затем мы можем использовать индексированный вызов рендера, который приказывает «рендерить только до N», где N — это число экземпляров, которое на самом деле нужно в текущем кадре, меньшее, чем максимальное количество X.

В большинстве современных API код для этого уже есть, поэтому вручную это делать не требуется. Эта операция называется «Instancing»; по сути, она автоматизирует описанный выше процесс с заранее заданными ограничениями.

Движок Unity тоже поддерживает instancing, в нём есть собственный API и набор макросов шейдеров, помогающие в его реализации. Он использует определённые допущения, например, о том, что в каждом экземпляре требуется полное 3D-преобразование. Строго говоря, для 2D-полосок оно нужно не полностью — мы можем обойтись упрощениями, но поскольку они есть, мы будем использовать их. Это упростит наш шейдер, а также обеспечит возможность использования 3D-индикаторов, например, кругов или дуг.

Класс Damageable

У наших врагов будет компонент под названием Damageable , дающий им здоровье и позволяющий им получать урон от коллизий. В нашем примере он довольно прост:

Объект HealthBar: позиция/поворот

Объект полосы здоровья очень прост: по сути, это всего лишь прикреплённый к врагу Quad.

Мы используем scale этого объекта, чтобы сделать полоску длинной и тонкой, и разместим её прямо над врагом. Не беспокойтесь о её повороте, мы исправим его с помощью кода, прикреплённого к объекту в HealthBar.cs :

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

Во-первых, instancing в Unity всегда использует полный transform каждого объекта, и поскольку мы всё равно передаём все данные, можно их и использовать. Во-вторых, задание масштаба/поворота здесь гарантирует, что ограничивающий параллелограмм для усечения полоски всегда будет верным. Если бы мы сделали задание размера и поворота обязанностью шейдера, то Unity мог бы усекать полоски, которые должны быть видимы, когда они находятся близко к краям экрана, потому что размер и поворот их ограничивающего параллелограмма не будут соответствовать тому, что мы собираемся рендерить. Разумеетсяя, мы могли бы реализовать свой собственный способ усечения, но обычно при возможности лучше использовать то, что у нас есть (код Unity является нативным и имеет доступ к большему количеству пространственных данных, чем мы).

Я объясню, как рендерится полоска, после того, как мы рассмотрим шейдер.

Шейдер HealthBar

В этой версии мы создадим простую классическую красно-зелёную полоску.

Я используют текстуру размером 2×1, с одним зелёным пикселем слева и одним красным справа. Естественно, я отключил mipmapping, фильтрацию и сжатие, а для параметра addressing mode задал значение Clamp — это значит, что пиксели нашей полоски всегда будут идеально зелёными или красными, а не растекутся по краям. Это позволит нам изменять в шейдере координаты текстуры для сдвига линии, разделяющей красный и зелёный пиксели вниз и вверх по полоске.

(Так как здесь всего два цвета, я мог просто использовать в шейдере функцию step для возврата в точке одного или другого. Однако в этом методе удобно то, что при желании можно использовать более сложную текстуру, и это будет работать аналогично, пока переход находится в середине текстуры.)

Для начала мы объявим необходимые нам свойства:

_MainTex — это красно-зелёная текстура, а _Fill — значение от 0 до 1, где 1 — это полное здоровье.

Далее нам нужно приказать полоске рендериться в очереди overlay, а значит, игнорировать всю глубину в сцене и рендериться поверх всего:

Следующая часть — это сам код шейдера. Мы пишем шейдер без освещения (unlit), поэтому нам не нужно беспокоиться об интеграции с различными моделями поверхностных шейдеров Unity, это простая пара вершинного/фрагментного шейдеров. Для начала напишем бутстреппинг:

По большей мере это стандартный bootstrap, за исключением #pragma multi_compile_instancing , которая сообщает компилятору Unity, что нужно компилировать для Instancing.

Вершинная структура должна включать в себя данные экземпляров, поэтому мы сделаем следующее:

Также нам нужно задать, что именно будет находиться в данных экземляров, кроме того, что за нас обрабатывает Unity (transform):

Так мы сообщаем, что Unity должен создать буфер под названием «Props» для хранения данных каждого экземпляра, и внутри него мы будем использовать по одному float на экземпляр для свойства под названием _Fill .

Можно использовать и несколько буферов; это стоит делать, если у вас есть несколько свойств, обновляемых с разной частотой; разделив их, можно, например, не менять один буфер при изменении другого, что более эффективно. Но нам этого не требуется.

Наш вершинный шейдер почти полностью выполняет стандартную работу, потому что размер, позиция и поворот и так передаются в transform. Это реализуется с помощью UnityObjectToClipPos , который автоматически использует transform каждого экземпляра. Можно представить, что без instancing это обычно было бы простым использованием одного матричного свойства. но при использовании instancing внутри движка это выглядит как массив матриц, и Unity самостоятельно выбирает матрицу, подходящую к данному экземпляру.

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

UNITY_SETUP_INSTANCE_ID и UNITY_ACCESS_INSTANCED_PROP выполняют всю магию, осуществляя доступ к нужной версии свойства _Fill из буфера констант для этого экземпляра.

Мы знаем, что в обычном состоянии UV-координаты четырёхугольника (quad) покрывают весь интервал текстуры, и что разделительная линия полоски находится посередине текстуры по горизонтали. Поэтому небольшие математические расчёты по горизонтали сдвигают полоску влево или вправо, а значение Clamp текстуры обеспечивают заполнение оставшейся части.

Фрагментный шейдер не мог быть проще, потому что вся работа уже выполнена:

Полный код шейдера с комментариями доступен в репозитории GitHub.

Материал Healthbar

Дальше всё просто — нам всего лишь нужно назначить нашей полоске материал, который использует этот шейдер. Больше почти ничего делать не нужно, достаточно только выбрать нужный шейдер в верхней части, назначить красно-зелёную текстуру, и, что самое важное, поставить флажок «Enable GPU Instancing».

Обновление свойства HealthBar Fill

Итак, у нас есть объект полоски здоровья, шейдер и материал, который нужно рендерить, теперь нужно задать для каждого экземпляра свойство _Fill . Мы делаем это внутри HealthBar.cs следующим образом:

Мы превращаем CurrentHealth класса Damageable в значение от 0 до 1, разделив его на MaxHealth . Затем мы передаём его свойству _Fill с помощью MaterialPropertyBlock .

Если вы ещё не использовали MaterialPropertyBlock для передачи данных в шейдеры, даже без instancing, то вам нужно изучить его. Он не так хорошо объяснён в документации Unity, но является самым эффективным способом передачи данных каждого объекта в шейдеры.

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

Здесь нет почти ничего, кроме бойлерплейта для задания переменных, и код довольно скучный; подробности см. в репозитории GitHub.

В репозитории GitHub есть тестовое демо, в котором куча злых синих кубиков уничтожается героическими красными сферами (ура!), получая урон, отображаемый описанными в статье полосками. Демо написано в Unity 2018.3.6f1.

Эффект от использования instancing можно наблюдать двумя способами:

Панель Stats

Нажав Play, щёлкните на кнопку Stats над панелью Game. Здесь вы можете увидеть, сколько вызовов отрисовки экономится благодаря instancing (батчингу):

Запустив игру, вы можете нажать на материал HealthBar и снять флажок с «Enable GPU Instancing», после чего число сэкономленных вызовов снизится до нуля.

Отладчик кадров

Запустив игру, перейдите в меню Window > Analysis > Frame Debugger, а затем нажмите в появившемся окне «Enable».

Слева внизу вы увидите все выполняемые операции рендеринга. Заметьте, что пока там есть множество отдельных вызовов для врагов и снарядов (при желании можно реализовать instancing и для них). Если прокрутить до самого низа, то вы увидите пункт «Draw Mesh (instanced) Healthbar».

Этот единственный вызов рендерит все полоски. Если нажать на эту операцию, а затем на операцию над ней, то вы увидите, что все полоски исчезнут, потому что они отрисовываются за один вызов. Если находясь во Frame Debugger, вы снимете у материала флажок «Enable GPU Instancing», то увидите, что одна строка превратилась в несколько, а после установки флажка — снова в одну.

Источник

Читайте также:  Каким цветом бабочка адмирал

Слово "Цвет" и его описание © 2021
Внимание! Информация, опубликованная на сайте, носит исключительно ознакомительный характер и не является рекомендацией к применению. Обязательно проконсультируйтесь с вашим лечащим врачом!