Наличие фокуса (когда то, на что смотрит персонаж, как-либо выделяется, подсветкой или надписью) довольно распространенная особенность в играх. Но копаясь в документации по UDK, не могу найти даже намека на то, как его реализовать.
Может тебе поможет триггер, который срабатывает на взгляд? В уроках Огасоды такой пример разбирался. Серия про кизмет. Там Огасода ставил триггер возле Айронгарда, когда смотришь на него то он машет рукой и над ним меняется надпись.
STARS, Да, я в курсе, что есть такой триггер. Но дело в уровне, на котором он работает. Триггер и кизмет уровня разработчика контента, а мне нужен фокус в принципе для всей игры, это уже уровень программирования скриптов. Т.е., есть игры (RPG'шные квесты) где очень много пикапных (берущихся в инвентарь) объектов, и чтобы реализовать фокус для них вашим способом, придется к каждому цеплять такой триггер, что будет очень утомительно (даже с помощью архетипов) для создателей игровой вселенной)) Порывшись в документации пришел к выводу что готовой заготовки в скриптах для фокуса нет. Правда, есть функция-итератор TraceActors (в классе Actor) с помощью которой, в принципе, можно было бы написать функцию реализующую фокус. Но у нее присутствуют побочные эффекты, с которыми в данный момент бьюсь. Если выйдет что-нибудь осмысленное и рабочее, отпишусь здесь))
Добавлено (22 Сен 2013, 18:01) --------------------------------------------- И так, если кому-либо нужен фокус в игре, то предлагаю свое решение:
Код
/// Ваш паун
var Actor FocusedPickUpItem;
event PostBeginPlay() { Super.PostBeginPlay();
/// настройка таймера для проверки фокуса SetTimer(0.5, true, NameOf(FocusChecking)); /// будет проверять каждые пол секунды
}
function FocusChecking() { local Actor MyTestActor; local rotator rTemp; local vector EndLocation, StartLocation, VectorOfSight, VectorToItem; local vector MyExtent; local TraceHitInfo MyHitInfo; local float f, DistanceToSight, OldDistanceToSight;
/// инициализация вектора для трассировки с нулевым расширением MyExtent.X=0; MyExtent.Y=0; MyExtent.Z=0;
/// Сбрасываем результат прежнего поиска FocusedPickUpItem=None; If ( Controller != None ) { /// продвинутый метод (поиск на разных высотах, в зависимости от положения камеры) Controller.GetPlayerViewPoint( StartLocation, rTemp ); StartLocation=Location; StartLocation.Z=StartLocation.Z+125; /// подъем по оси Z до уровня глаз перса EndLocation=StartLocation + 200*vector(rTemp); VectorOfSight=EndLocation-StartLocation; } else { /// примитивный метод (поиск на одной высоте) StartLocation=Location; StartLocation.Z=StartLocation.Z+125; /// подъем по оси Z до уровня глаз перса EndLocation=StartLocation + 200*vector(Rotation); VectorOfSight=EndLocation-StartLocation; }
/// прострел поиска на 200 усл. ед. foreach VisibleCollidingActors (class 'Actor', MyTestActor, 200, , true, MyExtent, true, , MyHitInfo) { /// Расчет дистанции до предмета VectorToItem=MyTestActor.Location-StartLocation; f=ACos(Normal(VectorToItem) dot Normal(VectorOfSight)); DistanceToSight=Sin(f)*VSize(VectorToItem); /// Сохранение в FocusedPickUpItem самого близкого предмета к линии взгляда If (OldDistanceToSight==0) { OldDistanceToSight=DistanceToSight; FocusedPickUpItem=MyTestActor; } else { If (OldDistanceToSight>DistanceToSight) { FocusedPickUpItem=MyTestActor; OldDistanceToSight=DistanceToSight; } } } }
simulated function DrawHUD(HUD H) { local vector OnScreen; local color ColorOfLine;
super.DrawHUD (H);
/// отображение на экране имени предмета в фокусе if (FocusedPickUpItem!=None) { OnScreen = H.Canvas.Project (FocusedPickUpItem.Location); H.Canvas.SetPos(OnScreen.X-30, OnScreen.Y-40); H.Canvas.DrawText(FocusedPickUpItem.Name,,1,1,);
} }
Код вставляется в класс вашего пауна (Pawn и производные от него), переопределяет две родительские функции: PostBeginPlay - для запуска таймера, периодически вызывающего главную функцию FocusChecking, чтобы проверить, не попали ли новые предметы в "кругозор" вашего перса. Вторая родительская функция DrawHUD, вызывается, чтобы отобразить на экране имя выбранного предмета. В коде, класс выбираемых предметов указан как Actor, в реальной ситуации, вряд ли понадобится такой, самый общий класс, так что заменяйте его подклассами этого класса, на которых вам надо сфокусироваться. В место функции TraceActor использовал VisibleCollidingActors, так как от первой так и не добился необходимой для данной задачи работы. На реальной карте проверял, код работает, хоть и не всегда просто из кучи близко-расположенных объектов выбрать какой-либо один требующийся. Если возникнут вопросы, спрашивайте, постараюсь следить за темой некоторое время.
Сообщение отредактировал Argentum - Пт, 16 Авг 2013, 11:46
Документация с примером http://udn.epicgames.com/Three/DevelopmentKitGemsAddingOnScreenIndicators.html Камера вешается на кнопку активации или по событию всё это хозяйство активировать. у меня на событии висит - есть пить не просит