Фокус - Форум Игроделов
Вт, 07 Май 2024, 21:37 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNREAL ENGINE и UDK » ОБЩИЕ ВОПРОСЫ » Фокус (Как его создать в игре?)
Фокус
ArgentumДата: Сб, 03 Авг 2013, 09:07 | Сообщение # 1
Нет аватара
 
Сообщений: 16
Награды: 0
Репутация: 0
Статус: Offline
Наличие фокуса (когда то, на что смотрит персонаж, как-либо выделяется, подсветкой или надписью) довольно распространенная особенность в играх. Но копаясь в документации по UDK, не могу найти даже намека на то, как его реализовать.
 
СообщениеНаличие фокуса (когда то, на что смотрит персонаж, как-либо выделяется, подсветкой или надписью) довольно распространенная особенность в играх. Но копаясь в документации по UDK, не могу найти даже намека на то, как его реализовать.

Автор - Argentum
Дата добавления - 03 Авг 2013 в 09:07
STARSДата: Пн, 05 Авг 2013, 08:12 | Сообщение # 2
Нет аватара
 
Сообщений: 112
Награды: 2
Репутация: 21
Статус: Offline
Может тебе поможет триггер, который срабатывает на взгляд? В уроках Огасоды такой пример разбирался. Серия про кизмет. Там Огасода ставил триггер возле Айронгарда, когда смотришь на него то он машет рукой и над ним меняется надпись.
 
СообщениеМожет тебе поможет триггер, который срабатывает на взгляд? В уроках Огасоды такой пример разбирался. Серия про кизмет. Там Огасода ставил триггер возле Айронгарда, когда смотришь на него то он машет рукой и над ним меняется надпись.

Автор - STARS
Дата добавления - 05 Авг 2013 в 08:12
ArgentumДата: Вс, 22 Сен 2013, 18:01 | Сообщение # 3
Нет аватара
 
Сообщений: 16
Награды: 0
Репутация: 0
Статус: Offline
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
 
Сообщение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
Дата добавления - 22 Сен 2013 в 18:01
LeshanderДата: Пн, 27 Июн 2016, 13:38 | Сообщение # 4
 
Сообщений: 9
Награды: 0
Репутация: 0
Статус: Offline
Документация с примером
http://udn.epicgames.com/Three/DevelopmentKitGemsAddingOnScreenIndicators.html
Камера вешается на кнопку активации или по событию всё это хозяйство активировать. smile
у меня на событии висит - есть пить не просит biggrin
 
СообщениеДокументация с примером
http://udn.epicgames.com/Three/DevelopmentKitGemsAddingOnScreenIndicators.html
Камера вешается на кнопку активации или по событию всё это хозяйство активировать. smile
у меня на событии висит - есть пить не просит biggrin

Автор - Leshander
Дата добавления - 27 Июн 2016 в 13:38
Форум Игроделов » UNREAL ENGINE и UDK » ОБЩИЕ ВОПРОСЫ » Фокус (Как его создать в игре?)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024