Полезное

Мы Вконтакте

Discord канал

#
1 ... 345678
Аватара пользователя
Пользователь
Сообщения: 2069
скажем есть граф зависимости обьектов иерархический
синими стрелками от родителя к детям
и есть
булевая обьекта говорит о направлении какой-то зависимости.
Изображение
если true то влияет на родителя...
каждый обьект знает о своем родителе и первом поколении детей.
задача перебрать рекурсивно все обьекты следуя иерархической последовательности с учетом зависимости.
и вызвать какое-то событие в порядке зависимостей.
тоесть зависимость имеет высшый приоритет, елси ее нет решает иерархия

тоесть как решается пример обьекта 1 c картинки:
Obj1(Obj2)
так как на 1 влияет только 2

обьект 3:
Obj3(Obj1(Obj2),Obj4)
на него влияют 1 и 4
1ый влияет по иерархии, а 4 по зависимости... %)

ммм...
получаем что-то типа:

Код:
class Obj //класс обьекта
{
  bool bAffectOnParent; //влияние на родителя
  bool bCalcDone=false; //булевая которую нужно поставить тру
  Obj* Parent; //родитель, переменная не учавствует в примере просто есть на всякий случай...
  TArray<Obj*> Childs; //дети
  //... функции установки родителей и детей не важны
}

//вызываем функцию с самым первым по иерархии обьектом как параметром
// все обьекты должны получить "bCalcDone =true" в порядке зависимости
void CalcAllChildes(Obj* ParentObj)
{
   for (int i = 0; i < ParentObj.Childs.Num(); i++)
   {
      if(ParentObj.Childs[i] ->bAffectOnParent )//определяем влияние
      {
         CalcAllChildes(ParentObj.Childs[i]); //рекурсия
         // рекурсия углубляется до до независимого обьекта
         // и считает по порядку все зависимости которые вляияют на текущий обьект
      }
      else
      {
         //что делать если не влияет на родителя?
         //именно этот обьект на родителя не влияет
         //но его дети могут влиять на него
         //но считать его сейчас слишком рано, потому что еще текущий обьект не решен...
         //см картинку obj-3
         // надо както потом его вызвать?
      }
   }
   ParentObj.bCalcDone =true; //отмечаем обьект посчитанным или вызываем нужный ивент - конечная цель
   //это работает когда все дети влияют на родителя
   // но наджо как-то решать переход с зависимостей на иерархию, когда зависимости нет
   //- черная стрелка на картинке
   
}

предложения?
_________________
we need to go deeper
Последний раз редактировалось Snake 08 фев 2018, 13:18, всего редактировалось 2 раз(а).
Аватара пользователя
Пользователь
Сообщения: 2069
Код:
void CalcAllChildes(Obj* ParentObj)
{
   for (int i = 0; i < ParentObj.Childs.Num(); i++)
   {
      if(ParentObj.Childs[i] ->bAffectOnParent )//определяем влияние
      {
         CalcAllChildes(ParentObj.Childs[i]); //рекурсия
      }
   }
   ParentObj.bCalcDone =true;
   for (int i = 0; i < ParentObj.Childs.Num(); i++)
   {
     if(!ParentObj.Childs[i] ->bAffectOnParent )
     {
        CalcAllChildes(ParentObj.Childs[i]); //еще одна рекурсия
     }
   }
}

исправил тупняк был...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 23
Все я снова чета делаю не так =) Посаны памагите:

Короче тема такая, я делаю драг Widget'а в вьюпорте, и использую локальные координаты виджета из FPointerEvent для оффсета, только вот почему-то не работает так как надо, я так понмиаю там значения не подходят, только во что их конвертировать я не понимаю, может округлить в какую-то сторону? или количество цифр после точки урезать? Или возможно я не учитываю разрешение вьюпорта? я честно сказать не ошен понимаю.

В Виджете
Код:
FReply UInventoryWidget::NativeOnMouseButtonDown(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent)
{
    controller->PanelDrag(this, this->GetCachedGeometry().AbsoluteToLocal(InMouseEvent.GetScreenSpacePosition()));
    return FReply::Handled();
}


Переменные в контроллере
Код:
    UUserWidget* DraggingPanel;
    FVector2D DraggingPanelOffset;
    void PanelDrag(UUserWidget* panel, FVector2D offset) { DraggingPanel = panel; DraggingPanelOffset = offset; }


это фреймтик в контролере
Код:
void AController::Tick(float DeltaTime)
{
    if (DraggingPanel)
    {
        MoveDraggingPanel();
    }
}


это функция перемещения
Код:
void AController::MoveDraggingPanel()
{
    FVector2D mouseposition;
    GetMousePosition(mouseposition.X, mouseposition.Y);
    DraggingPanel->SetPositionInViewport(mouseposition - DraggingPanelOffset);
}


вот видео
Аватара пользователя
Пользователь
Сообщения: 23
И еще вопросик случаем никто не знает переведена ли эта статья на русский где нибудь?
https://wiki.unrealengine.com/GameplayA ... an_Ability
Аватара пользователя
Пользователь
Сообщения: 2069
RepkaGaming писал(а):
И еще вопросик случаем никто не знает переведена ли эта статья на русский где нибудь?
https://wiki.unrealengine.com/GameplayA ... an_Ability

нет не переведена, и еще хуже материала по GameplayAbility крайне мало чтоб уверенно его использовать...
пробовал изучать но как-то не особо получилось.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 2069
такс чето я туплю

два вектора
FVector V1,V2;
есть два флоата - вес векторов
float w1 , w2; // значение от 0 до 1
нужно найти
float alpha; //
для
FVector outV= lerp(V1,V2,alpha);

например при весах w1=1 , w2=1 ,alpha будет равно 0,5.
аналогично если ихние значения будут равны.

а вот скажем w1=0,5 , w2=1 результирующий вектор от 0,5 должен смещаться в сторону w2 пропорционально весу...
Изображение
хм... формулу вывести надо...

P.S.: 0.5 + (((-1 * w1) + w2)*0.5); вроде работает...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 15
есть функция

Код:
void UBaseStatComponent::ChangeStat_Implementation(float val, float effectTime)
{
   FTimerDelegate timerDelegate;

   currentVal = val;
   currentTime = effectTime;

   effectTimerIndex = effectTimers.Add(FTimerHandle::FTimerHandle());

   timerDelegate.BindLambda([&]()
   {
      float lVal = currentVal;
      float lEffectTime = currentTime;
      int timerIndex = effectTimerIndex;

      value += lVal;

      if (value > 110)
      {
         GetWorld()->GetTimerManager().ClearTimer(effectTimers[timerIndex]);
      }
   });

   GetWorld()->GetTimerManager().SetTimer(effectTimers[effectTimerIndex], timerDelegate, 1.f, true, 0.1f);

}


в массив effectTimers добавляются FTimerHandle
проблема в том что сколько бы их не добавилось последний будет 0 (не валидный)
Аватара пользователя
Пользователь
Сообщения: 27
Добрый день!
Если я засуну в
Код:
BeginPlay()

или в
Код:
Tick(float DeltaTime)

какой-нибудь очень тяжелый обсчет чего-нибудь или что-нибудь, что отнимает много времени, например (просто пример) коннект к серверу или запись на диск, где надо будет ждать ответ, UE4 отнесется к этому с пониманием?=) Нет никаких принудительных средств сброса долго выполняющихся операций? Он точно сделает все, что мне надо и не зависнет или сбросит?

Вопрос, так вообще можно делать? Или для этого есть другие средства (возможности) у движка?
Аватара пользователя
Пользователь
Сообщения: 28
Например в отдельном потоке выполнять операцию.

У вас какие-то сверхвычисления, что вешают все приложение? Добавляйте проверки на валидность, ошибки и прочее. И все будет отлично работать.
Аватара пользователя
Пользователь
Сообщения: 237
rachok писал(а):
Добрый день!
Если я засуну в
Код:
BeginPlay()

или в
Код:
Tick(float DeltaTime)

какой-нибудь очень тяжелый обсчет чего-нибудь или что-нибудь, что отнимает много времени, например (просто пример) коннект к серверу или запись на диск, где надо будет ждать ответ, UE4 отнесется к этому с пониманием?=) Нет никаких принудительных средств сброса долго выполняющихся операций? Он точно сделает все, что мне надо и не зависнет или сбросит?

Вопрос, так вообще можно делать? Или для этого есть другие средства (возможности) у движка?


BeginPlay - событие, вызываемое один раз за сессию игровую. При запуске сессии.
Tick - выполняется каждый кадр.
А теперь представь, что у тебя сложные вычисления будут выполняться каждый кадр "коннект к серверу или запись на диск". Само по себе звучит странно, нет?!

Ну а вообще если такая операция не будет осуществляться каждый кадр, то проблем не будет, пусть даже процесс очень долгий.


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница