На них и так есть, на стационарных картинках не видно просто. Точно также, как кубмапы на скриншотах не выглядят, как отражения. Об этом уже двадцать раз писалось.
GP, ты давным-давно помогал сделать мувер с приаттаченной тенью. Там была проблема с тем, что тень пропадала, если мувер уходил из вида. Это проблема решалась, если ставить тени bStasis=true. Но появлялась другая проблема: при смене разрешения, тень превращалась в огромное черное прямоугольное пятно и не фиксилась, пока bStasis не поставить обратно на false. Я тут бился, пытаясь это исправить. Projector оказался нативной функцией, так что я там не смог найти никаких переменных, по которым можно было бы определить, багнулся он или нет. В конечном итоге поставил интервал на проверку ширины окна.
Код
//============================================================================= // ShadingMover - mover with a shadow attached //============================================================================= class ShadingMover extends Mover placeable;
var(ShadowProjector) vector LightDirection; var(ShadowProjector) int LightDistance; var(ShadowProjector) int MaxTraceDistance; var(ShadowProjector) int CullDistance; var(ShadowProjector) bool bGradient; var(ShadowProjector) float UpdateFrequency; var(ShadowProjector) byte ShadowDarkness; var LocalShadowProjector Proj; var GUIController GUI; var bool ProjStasis; var bool TimerState; var int prevScreenWidth;
replication { reliable if(true) ProjStasis; }
simulated event KeyFrameReached(){
local GUIController GUIController; //I've no idea what I'm doing if (Level.NetMode != 1){ foreach AllObjects(class'GUIController',GUIController){ GUI=GUIController; } } else{ GUI=None; }
Это работает и оффлайн и онлайн, но у меня большие сомнения в том, что это лучший способ это сделать. Вопросы такие: Есть ли какой-то ивент, который вызывается во время смены разрешения\состояния(полный\окно) экрана? Если нет, можно ли в дополнение к ширине\высоте экрана узнать состояние? Можно ли получить эти данные не итерируя через все объекты? Можно ли делать проверку не через Timer а в тике (в плане затраты ресурсов)? Правильно ли я вообще SetTimer и Timer использую?
Роботает - ну и славно. Как понял перебор всех акторов происходит один раз, а таймер раз на секунду грузит такой мелочью не будет... да ты бы и заметил. Такого ивента чтоб запускалса при смене разрешения в класе актора... нет. Может где-то в том-же gui или еще где, но не во всех акторах это точно.
Проблема в том, что если просто нажать альт-таб и потом вернуться обратно, разрешение не меняется и тени остаются багнутыми. Я уже весь исходный код обыскал на наличие чего-то связанного с потерей фокуса на окне, но это похоже только в нативном коде есть.
Добавлено (29 Марта 16, 00:17) --------------------------------------------- oops
А вчем там суть была? не помню уже что сделали... Пропадает когда его не видно? А отключали его в stasis навсегда, или только когда не видно? Всплыла еще одна идея, но знаю сроботает ли: можно сам проэктор (не текстуру) редерить в хад куда-то... так как самого актора не видно то и мусора не будет, но обновлятса может. Скинь тестовою карту что я кидал (если кидал), ато у меня такие вещи затерты давно.
можно как-то сделать проверку на то, что он в поле зрения
В принцыпе да:
Код
/* PlayerCanSeeMe returns true if any player (server) or the local player (standalone or client) has a line of sight to actor's location. */ native(532) final function bool PlayerCanSeeMe();
Непомню почему, но для lens flare я переделывал по своему такую функцыю. Вроде-бы там не учитываетса направление куда ирок смотрит. У себя просто кроме прямого трейса проверял еще находитса ли актор впереди игрока: угол между вектором от игрок->актор и вектором нправления игрока должен быть меньше 90гр, тоесть вместе 180 гр, полусфера впереди игрока.
ОК. Но стоп, а как ты это сюда приделал? Включаеш stasis только если не видно, или как? Если так, то как тогда те муверы которые оставались в стазисе при альт-табе?
Добавлено (30 Марта 16, 00:44) --------------------------------------------- Олсо идея с насильным рендером не пройшла, если актор не виден долгое время и пропадает, то он и рендеритса в "канавас" перестает. Есть еще дибильноватая идея на один тик ставить каждый мувер игроку перед рожей перед игроком, чтоб они отрендерелись.
ОК. Но стоп, а как ты это сюда приделал? Включаеш stasis только если не видно, или как? Если так, то как тогда те муверы которые оставались в стазисе при альт-табе?
Ставлю bStasis на true, если не видно, иначе на false Хз как так получается, но оно само фиксится после альт-таба. Возможно сам вызов функции заставляет прожектор рефрешиться.
Добавлено (01 Апреля 16, 16:36) --------------------------------------------- weeeeeeeeeeeeeeeeeeeeeeeeeeee
Добавлено (01 Апреля 16, 16:52) ---------------------------------------------
Добавлено (01 Апреля 16, 16:52) --------------------------------------------- oh god
Добавлено (01 Апреля 16, 17:01) ---------------------------------------------
Добавлено (01 Апреля 16, 18:22) --------------------------------------------- все, я ее доделал
Нашел еще один способ поднять фпс: для всех поверхностей, которые не будут видны игрокам (задние стены зданий например), ставим unlit=true. Это не только уменьшает размер файла карты (лишние текстуры освещения не создаются), но и поднимает фпс на 10-20 в зависимости от размера карты.