Unreal Engine 4 http://uengine.ru/forum/ |
|
использование UObject в Blueprint http://uengine.ru/forum/viewtopic.php?f=19&t=36087 |
Страница 1 из 1 |
Автор: | workdenis [ 28 июн 2019, 14:58 ] |
Заголовок сообщения: | использование UObject в Blueprint |
Здравствуйте, ребята. Я новичок в кодинге под 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 так не принято, как лучше поступить с сохранением общей логики? |
Автор: | sanikoo109 [ 11 авг 2019, 20:37 ] |
Заголовок сообщения: | |
Конструктор вроде не срабатывает при запуске игры. Исходя из этого используйте BeginPlay. |
Автор: | gary_cho [ 11 авг 2019, 21:59 ] |
Заголовок сообщения: | |
HexManager = NewObject< UHexManager >(); а если так ? |
Автор: | Snake [ 15 окт 2019, 11:18 ] |
Заголовок сообщения: | |
конструктор срабатывает обьект созданный без "оутера" мусорщик метит как PendingKill и потом затирает... Код: HexManager = NewObject< UHexManager >(this); а еще лучше чтоб сериализировалось как положено Код: HexManager =CreateDefaultSubobject< UHexManager >(TEXT("HexManager")); так как имя сгенерированного обьекта при NewObject<> недетерминированно может быть, и при десериализации обьекта может быть краш... |
Автор: | gary_cho [ 15 окт 2019, 15:53 ] |
Заголовок сообщения: | |
Код: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Hex property") UHexManager* HexManager; GB его не убьёт, поэтому можно писать и так HexManager = NewObject< UHexManager >(); Но лучше делать это в BeginPlay(), чтобы создалось только в нужном объекте а не во всех временных в конструкторе |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |