Полезное

Мы Вконтакте

Discord канал

#
Аватара пользователя
Пользователь
Сообщения: 3
Здравствуйте, ребята. Я новичок в кодинге под ue и пишу логику для гексагональной сетки. Разделил функции по разным классам : HexManager наследованный от UObject, содержит функции, которые переводят координаты из одной системы координат в другую, HexLevel содержит уровень с информацией о клетках и так далее. В HexBoard соединяется вся логика с помощью указателей и выглядит это вот так:
Код:
UCLASS()
class FIRSTDUNGEON_API AHexBoard : public APawn
{
   GENERATED_BODY()

public:
   // Sets default values for this pawn's properties
   AHexBoard();
   UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Hex property")
      EMapKind MapKind;
   UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Hex property")
      UHexManager* HexManager;
   UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Hex property")
      UHexLevelManager* HexLevelManager;
   UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HexBoard")
      int32 width=3;
   UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HexBoard")
      int32 height=3;
   UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HexBoard")
      TArray<FRowEncapsulate> HexField;
protected:
   // Called when the game starts or when spawned
   virtual void BeginPlay() override;

public:
   UPROPERTY(EditAnywhere, BlueprintReadWrite)
      float HexSize=103.f;

   UFUNCTION(BlueprintCallable)
      void SetFieldSize();

   UFUNCTION(BlueprintCallable, BlueprintPure)
      TArray<FVector> GetHexPositions() const;
   UFUNCTION(BlueprintCallable, BlueprintPure)
      FVector GetHexPosition(int32 Q, int32 R) const;


   // Called every frame
   virtual void Tick(float DeltaTime) override;

   // Called to bind functionality to input
   virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

};


Инициализация происходит следующим образом:
Код:
AHexBoard::AHexBoard()
{
   PrimaryActorTick.bCanEverTick = true;
   MapKind=EMapKind::Reactangle;
   HexManager = NewObject<UHexManager>(UHexManager::StaticClass());
   UE_LOG(LogTemp, Error, TEXT("%s is hexmanager name"), *HexManager->GetName());
   HexLevelManager = NewObject<UHexLevelManager>();
}

Получаю указатель на HexBoard следующим образом и даже что-то нахожу.
Изображение
Но когда пытаюсь воспользоваться HexManager'ом получаю Accessed None trying to read. Также, видно на скрине, что почему-то в указателе на HexManager ничего не содержится.
Изображение
Что я делаю не так и ,если в ue так не принято, как лучше поступить с сохранением общей логики?
Аватара пользователя
Пользователь
Сообщения: 31
Конструктор вроде не срабатывает при запуске игры. Исходя из этого используйте BeginPlay.
Аватара пользователя
Пользователь
Сообщения: 195
HexManager = NewObject< UHexManager >(); а если так ?
Аватара пользователя
Пользователь
Сообщения: 2319
конструктор срабатывает
обьект созданный без "оутера" мусорщик метит как PendingKill и потом затирает...
Код:
HexManager = NewObject< UHexManager >(this);

а еще лучше чтоб сериализировалось как положено
Код:
HexManager =CreateDefaultSubobject< UHexManager >(TEXT("HexManager"));

так как имя сгенерированного обьекта при NewObject<> недетерминированно может быть, и при десериализации обьекта может быть краш...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 195
Код:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Hex property")
UHexManager* HexManager;

GB его не убьёт, поэтому можно писать и так HexManager = NewObject< UHexManager >();
Но лучше делать это в BeginPlay(), чтобы создалось только в нужном объекте а не во всех временных в конструкторе


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

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