TwinStickShooter的一些问题
TwinStickShooter模板应该是比较好的了解UE基本Pawn和Projectile的一个C++例子。以下是一些问题。
一、这个模板以纯C++编写,没有蓝图,所以第一步,我想测试下如何引用蓝图,以修改子弹的外观为例。
- 从ATwinStickShooterProjectile派生蓝图类,称为BP_TwinStickShooterProjectile好了,然后在BP_TwinStickShooterProjectile中修改子弹的颜色(材质了),改为红色。那么纯粹的C++如何引用并产生蓝图的实例呢?
这样实现:在pawn类中添加 TSubclassOf<ATwinStickShooterProjectile> ProjectileTemplate 成员变量,加不加UPROPERTY均可,因为我们将引用资源,资源是客观存在的,不是我们动态产生的,不会GC。然后在对应的实现文件(.cpp)的构造函数中,添加如下代码:
//设置子弹蓝图的引用
ConstructorHelpers::FClassFinder<ATwinStickShooterProjectile> AssetProjectile(TEXT("Blueprint'/Game/Blueprints/BP_TwinStickShooterProjectile.BP_TwinStickShooterProjectile_C'"));
if (AssetProjectile.Succeeded())
{
ProjectileTemplate = AssetProjectile.Class;
}
特别注意字符串后面添加"_C",即:Blueprint'/Game/Blueprints/BP_TwinStickShooterProjectile.BP_TwinStickShooterProjectile_C。这个字符串直接在编辑器中点选子弹对应的蓝图,然后copy reference,粘贴到对应的位置,然后添加后缀_C。因为这是蓝图类,后面都应该有后缀,话说UE版本号都15.1了,怎么还这个德性?
在FireShot函数中,如下修改:
UWorld* const World = GetWorld();
if (World != NULL)
{
// spawn the projectile
//World->SpawnActor<ATwinStickShooterProjectile>(SpawnLocation, FireRotation);
// 产生蓝图子弹
World->SpawnActor<ATwinStickShooterProjectile>(ProjectileTemplate, SpawnLocation, FireRotation);
}
桔色是原来模板的,注释掉,然后添加红色代码,编译,可以观察到的确生成了自定义的子弹。
其中pawn类的tick函数值得研究,例如在输入绑定时,如果BindAxis,无论是否有输入,系统就回调自己的函数,BindAction则不存在这个问题。这个例子给出了一个较好的解决方案,只绑定名称,不绑定回调函数,这样我们在需要的时候,自己调用GetInputAxis,这两种实现各有千秋,只是后一种是传统的方式,比较熟悉。
未完待续,卡壳了……
继续。
UProjectileMovementComponent有几个属性很好玩,如下:
如果设置bIsHomingProjectile = true; 生成子弹的Actor后,设置HomingTargetComponet,则子弹将以HomingTargetComponent为目标,实现跟踪效果。。。当然,还得设置UProjectileMovementComponent的HomingAccelerationMagnitude,这个值决定加速度,,犀利!
在子弹的构造函数中如下添加代码:
// 添加测试代码
ProjectileMovement->bIsHomingProjectile = true;
ProjectileMovement->HomingAccelerationMagnitude = 2500;
在Pawn的开火函数中如下添加代码:
if (World != NULL)
{
// spawn the projectile
//World->SpawnActor<ATwinStickShooterProjectile>(SpawnLocation, FireRotation);
// 产生蓝图子弹
ATwinStickShooterProjectile* Projectile = World->SpawnActor<ATwinStickShooterProjectile>(ProjectileTemplate, SpawnLocation, FireRotation);
//添加HomingTargetComponent
if (TargetHome)
{
Projectile->GetProjectileMovement()->HomingTargetComponent = TargetHome->GetRootComponent();
}
}
红色的为添加的代码,当然在测试时,要在collision中把子弹与pawn和子弹之前的响应设置为ignore,要不然,子弹产生的太快,彼此会碰撞,并且开户追踪后,子弹会击中玩家自己,效果不好,选择ignore就ok了。效果图:
nice! 有空再扒扒UMovementComponent中的碰撞的实现。
TwinStickShooter的一些问题的更多相关文章
- 一些Debug时没整理的内容
一.UShapeComponent组件的默认CollisionProfile为:OverlapAllDynamic.这会影响到由此派生的许多组件. 二.TwinStickShooter中绑定键盘的方式 ...
随机推荐
- python3百度设置高级搜索例子
#=======================================#作者:邓沛友#2018.12.16=============================coding:utf-8f ...
- Python3 多线程、多进程
python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源.. python多线程适合io操作密集型的任务(如socket server 网络并 ...
- python setup.py 包含静态文件及模板文件
package_data 和MANIFEST.in都写,include_package_data=True https://stackoverflow.com/a/3597263/8025086
- linux7 安装 zlib依赖库 与安装python 3.6
Linux 安装zlib依赖库 进入src: cd /usr/local/src 下载zlib库: wget http://www.zlib.net/zlib-1.2.11.tar.gz 解压下载的t ...
- FireDac 同时连接SQLserver2000时出现 Connection is busy with results for another command
First chance exception at $763FC632. Exception class EMSSQLNativeException with message '[FireDAC][P ...
- Loadrunner 50个Vusers并发创建3000个账号脚本调试以及场景运行
目标:用50个并发用户创建3000个账号到HP Web Server 分析: 1. Vugen录制脚本时,打开首页http://127.0.0.1:1080/WebTours/,进入注册账号界面不用重 ...
- Cacti性能优化和监控H3C交换机
1.一般使用spine比较多,spine是一个基于C语言的,非常快速的轮询引擎.它是默认的cmd.php轮询的可选替代 wget http://www.cacti.net/downloads/spin ...
- express 内存溢出问题分析定位
一.现象 1. 如下报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: n ...
- padding设置和清除
padding设置和清除 标签(空格分隔): padding padding介绍: padding:就是内边距的意思,它是边框到内容之间的距离: 另外padding的区域是有背景颜色的.并且背景颜色和 ...
- “AS3.0高级动画编程”学习:第一章高级碰撞检测
AdvancED ActionScript 3.0 Animation 是Keith Peters大师继"Make Things Move"之后的又一力作,网上已经有中文翻译版本了 ...