笔者最近在用 UE4 模仿经典的魔塔游戏,作为一个刚接触 UE4 不久的人,到目前为止的开发过程并不顺利,笔者完全是在摸索中进行的。
比如这两天遇到的动态加载 Actor 的问题,笔者已经制作好一个 TileMap,想要在上面放置各种道具、装备、怪物等,却不知道怎么通过代码加载。这个问题困扰了笔者两三天,在各种 Google、百度却找不到解决办法之后,只找到了一些相关的信息,笔者平心静气,想到了官方文档中有相关的教程,就是那个 First Person Shooter Tutorial,其中的子弹就是动态加载的,也许可以从中找到答案。
于是笔者就认真地跟着教程做了一遍,果然有想要的东西:
笔者一开始并没有理解这个 ProjectileClass 的用意,但是在后面的步骤中用到了它:
而上面这段代码正是笔者想要的,因为之前已经通过搜索了解到是这样加载的,但是一直没有成功,因为笔者一开始试着加载一个骷髅怪 (在代码中为 Monster 类,继承自 Pawn 类),上面的代码笔者加在了怪物类里。在后来跟着官方教程做的时候,笔者意识到自己的做法是错误的,因为怪物还没有放置到 World 中,GetWorld() 肯定得不到想到的 World,更不用说生成了。
在仔细分析了官方教程中的代码后,笔者决定仿效在 Unity 中类似的做法,创建一个空的 Actor C++ 类,将需要的代码放到这个空的 Actor 类中。然后笔者发现之前提到的 ProjectileClass,它在 SpawnActor 函数中作为第一个参数:
- AFPSProjectile * Projectile = World - >SpawnActor(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
但是笔者只找到了它的定义,却没有找到在哪里给它初始化或赋值,于是笔者回头看之前的步骤,发现最有可能给它赋值的地方是在蓝图中:
笔者注意到这一步的时候,并不敢确定就是在这里给 ProjectileClass 初始化的,于是笔者就在代码中修改了一下:
- // Projectile class to spawn.UPROPERTY(EditDefaultsOnly, Category = Projectile) TSubclassOf ProjectileClassTest;
把 ProjectileClass 改为 ProjectileClassTest,编译,然后笔者确定了自己的猜想:
官方文档中说的很清楚,EditDefaultsOnly 意味着这个属性只能在蓝图中编辑。但是笔者不想这么做,就没有像官方教程中那个也创建一个蓝图,而是这样做的:
- UPROPERTY(EditAnywhere, Category = Monster) TSubclassOf MonsterClass;
将 EditDefaultsOnly 改为 EditAnywhere,这样就省了创建蓝图的步骤,直接在编辑器中进行初始化,现在先这样做,实现出来,后面再优化吧:
编译,Play,笔者在 World Outliner 窗口中看到了实例 Monster:
但是此时还看不到它,因为笔者还没有为它成功设置 Flipbook 动画,于是就搜索怎么加载资源,找到了 LoadObject 函数:
- UPaperFlipbook * fb = LoadObject(NULL, TEXT("/Game/Animations/enemy01"), NULL, LOAD_None, NULL);
- VisibleComponent - >SetFlipbook(fb);
保存,编译,执行,终于看到骷髅怪了:
其实这一步并没有那么顺利,因为笔者一开始不知道正确的路径怎么写,不是 "/Game/Animations/enemy01",而写成了 "/Content/Animations/enemy01",因为在 Content Browser 中 Animations 确实是在 Content 中,但是并没有成功加载,后来改成了 "/Game/Animations/enemy01",才成功加载!
真是一路艰辛,"一把辛酸泪" 啊!不过当最终解决了问题,看到想要的结果时,笔者的心情无比的畅快!
虽然还有很多不懂的东西,但是笔者还是很有信心的,也从中学到了不少东西,笔者会在以后的学习和开发中,不断的总结,并发表到博客中,也希望能帮到其他初学者。当然文中可能有错误之处,如果遇到,请多包涵,并留言提醒笔者,大家共同进步,所谓赠人玫瑰,手有余香。
来源: http://www.92to.com/bangong/2016/12-07/13999332.html