zoukankan      html  css  js  c++  java
  • [UE4]创建对象的的几种姿势(C++)

    DEMO源代码

    这个DEMO演示了在C++代码中,创建UE4的常见类型的对象,包括Actor,ActorComponent,加载资源等。

    源代码请从这里下载:https://code.csdn.net/neil3d/unrealcookbook

    使用的引擎版本为:4.11.2

    打开项目后,启动“CreateObjectDemo/CreateObjectDemoMap.umap”地图文件便可运行。

    创建组件

    在UE4中,为Actor创建组件,可使用UObject::CreateDefaultSubobject()模板函数,以下所示:
    /* <CreateObjectDemo> * 创建Component对象,要使用CreateDefaultSubobject模板函数 */ 
    MyComponent = CreateDefaultSubobject<UMyActorComponent>(TEXT("MyComponent"));

    加载资源对象

    在UE4中,项目中的所有资源文件,不要看作是文件,而要理解为“静态对象”:也就是对象序列化的产物。加载项目资源可使用“UObject::StaticLoadObject()”函数,其中重要的参数为对象的Name,而不是文件路径。UE底层提供文件读取功能,不管资源文件是存储我独立的.uasset文件,还是存储到.PAK文件中,对上层都不需要关心。
    /* <CreateObjectDemo> * 加载模型、贴图等对象,使用StaticLoadObject函数 */ 
    UStaticMesh* SM_Vase = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(), NULL, TEXT("/Game/Assets/StaticMeshes/SM_Vase")) );
    StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent"));
    StaticMeshComponent->SetStaticMesh(SM_Vase);

    创建Actor对象

    创建Actor对象,需要使用UWorld::SpawnActor()接口,以下所示:
    /* <CreateObjectDemo> * 创建AActor派生类对象不要用NewObject或new,而要用UWorld::SpawnActor() */ 
    UWorld* World = GetWorld(); FVector pos(150, 0, 20);
    AMyActor* MyActor = World->SpawnActor<AMyActor>(pos, FRotator::ZeroRotator);

    创建UObject对象

    如果你有UObject的派生类(非Actor、非ActorComponent),那你可使用NewObject()模板函数来创建其实例对象。
    /* <CreateObjectDemo> * 使用NewObject模板函数,来创建UObject派生类对象 */ 
    MyObject = NewObject<UMyObject>();

    1.CreateDefaultSubobject必须写在Actor的无参构造函数中,否则crash; 
    2.CreateDefaultSubobject中的TEXT或者FName参数在同一个Actor中不能重复,否则crash;

    UE4不推荐try catch,并且默认是不支持的,UE4推荐Assertions。 
    https://answers.unrealengine.com/questions/264921/cannot-use-try-with-exceptions-disabled.html 
    https://docs.unrealengine.com/latest/INT/Programming/Assertions/index.html

    int i=1+3;
    verify(i==2); 

    上面是verify的简单用法,运行后会直接crash,就是这么高冷。听说还可以用

    UE_LOG(Fatal, ...);

    来打断执行。 
    https://community.gamedev.tv/t/try-catch-not-preventing-crashing/8481/6

    使用actorObject->IsA,不为actorObject带上UPROPERTY()也会crash..

  • 相关阅读:
    Android_bug之 task ':app:mergeDebugResources'. > Some file crunching failed, see logs f
    linux下vi命令大全[转]
    百度地图api 常用demo
    Mac之vim普通命令使用[转]
    java写文件
    java读取文件
    Android中对Log日志文件的分析[转]
    Android实用代码模块集锦
    java 位运算
    MyEclipse自带maven找不到或自己外置安装
  • 原文地址:https://www.cnblogs.com/timy/p/8645447.html
Copyright © 2011-2022 走看看