用手机可以做网站吗,重庆锅炉网站建设费用,wordpress图片去水印,网站建设平台还有没有趋势一、前言 我们在蓝图中可以很方便的添加各种需要的组件#xff0c;那么在C代码中要如何实现呢。在代码中分静态和动态加载#xff0c;而无论静态和动态#xff0c;加载的内容有资源和资源类#xff0c;资源类通常为带资源的蓝图类。
二、实现 在实现静态或动态加载时…一、前言 我们在蓝图中可以很方便的添加各种需要的组件那么在C代码中要如何实现呢。在代码中分静态和动态加载而无论静态和动态加载的内容有资源和资源类资源类通常为带资源的蓝图类。
二、实现 在实现静态或动态加载时都需要提前在构造函数里创建所需的类型代码如下 MyScene CreateDefaultSubobjectUSceneComponent(TEXT(MyScene));MyMesh CreateDefaultSubobjectUStaticMeshComponent(TEXT(MyStaticMesh));MyParticle CreateDefaultSubobjectUParticleSystemComponent(TEXT(MyParticle));MyBox CreateDefaultSubobjectUBoxComponent(TEXT(MyBox));MyAudio CreateDefaultSubobjectUAudioComponent(TEXT(MyAudio));
然后设置其父子级 //设置父子级RootComponent MyScene;//将MyScene作为默认的根组件MyMesh-SetupAttachment(MyScene);MyParticle-SetupAttachment(MyScene);MyBox-SetupAttachment(MyScene);MyAudio-SetupAttachment(MyBox);
2.1、静态加载资源 静态加载必须也在构造函数里代码如下 //静态加载资源static ConstructorHelpers::FObjectFinderUStaticMeshTempStaticMesh(TEXT(/Script/Engine.StaticMesh/Game/StarterContent/Shapes/Shape_Pipe.Shape_Pipe));MyMesh-SetStaticMesh(TempStaticMesh.Object);static ConstructorHelpers::FObjectFinderUParticleSystemTempParticle(TEXT(/Script/Engine.ParticleSystem/Game/StarterContent/Particles/P_Fire.P_Fire));MyParticle-SetTemplate(TempParticle.Object);static ConstructorHelpers::FObjectFinderUSoundWaveTempSoundWave(TEXT(/Script/Engine.SoundWave/Game/StarterContent/Audio/Collapse01.Collapse01));MyAudio-SetSound(TempSoundWave.Object);
其中”TEXT里面的路径获取方法如下
首先在编辑器的内容里找到资源然后鼠标右键点击“复制引用”如图2.1.1所示然后将复制的引用添加到上述的TEXT里面即可。 图2.1.1 2.2、静态加载类 静态加载的类也要在构造函数里代码如下注意类和资源不同地方在于类后面必须加上“_C”否则会出现编译报错或运行崩溃的不可控情况。 //静态加载类,复制引用后文件名后面必须加上_C,不然会运行崩溃static ConstructorHelpers::FClassFinderAActorTempMyActor(TEXT(/Script/Engine.Blueprint/Game/StarterContent/Blueprints/Blueprint_WallSconce.Blueprint_WallSconce_C));MyActor TempMyActor.Class; 另外这里创建的加载的类并不能马上就显示在场景中还只是在内存中如果在变量定义的时候添加了“UPROPERTY(VisibleAnywhere, BlueprintReadOnly“也只会显示在编辑界面中如果要显示在场景中还需要实例化一下但是实例化不能在构造函数中代码如下 if (MyActor){UE_LOG(LogTemp, Warning, TEXT(My Actor is:%s), *MyActor-GetName());AActor* TempSpawnActor GetWorld()-SpawnActorAActor(MyActor, FVector(100, 500, 100), FRotator::ZeroRotator);}
2.3、动态加载资源 动态加载通常用Load方法这个和Unity的方法很相似。通常不会放在构造函数里这点也和静态加载不同具体代码如下这里加载的资源会显示到场景中如代码会替换之前静态加载的资源。 //动态加载资源UStaticMesh* TempStaticMesh LoadObjectUStaticMesh(nullptr, TEXT(/Script/Engine.StaticMesh/Game/StarterContent/Shapes/Shape_NarrowCapsule.Shape_NarrowCapsule));if (TempStaticMesh){MyMesh-SetStaticMesh(TempStaticMesh);}
2.4、动态加载类
动态加载的类和静态加载类一样在复制引用名称后面也要加“_C”代码如下 //动态加载类UClass* TempClass LoadClassAActor(this, TEXT(/Script/Engine.Blueprint/Game/StarterContent/Blueprints/Blueprint_CeilingLight.Blueprint_CeilingLight_C));if (TempClass){AActor* SpawanActor GetWorld()-SpawnActorAActor(TempClass, FVector::ZeroVector, FRotator::ZeroRotator);UE_LOG(LogTemp, Warning, TEXT(Class Name:), *TempClass-GetName());}
这样加载的类也是会直接呈现在场景中。
三、总结
3.1、静态加载必须在构造函数里实现。
3.2、静态加载的类复制引用后文件名后面必须加上”_C“,不然会造成编译不通过或运行崩溃等各种问题。
3.3、静态加载的类都在内存中不能被显性的呈现在视口、场景中动态加载的类可以。