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中绑定键盘的方式 ...
随机推荐
- mybatis学习 -每天一记 mybatis insert null 报错
mybatis 插入数据,model的属性存在null,插入报错 在使用mybatis 进行insert时,如果字段值存在null的情况,会出现插入失败的情况,解决方案: 如果使用spring boo ...
- 如何用Bat批处理自制自解压文件
转载▼http://blog.sina.com.cn/s/blog_48462a890102e0nu.html 1.在桌面上新建一个文本文档,如:“新建 文本文档.txt”,方法是:在桌面的空 ...
- 1_Python历史及入门
前提:简述CPU 内存 硬盘 操作系统 应用程序CPU:计算机的运算核心和控制核心,好像人类的”大脑“内存:负责数据与CPU直接数据交流处理,将临时数据和应用程序加载到内存,然后在交由CPU处理. 造 ...
- 44_redux_comment应用_redux版本_同步功能
项目结构: components里面的东西没变,将app.jsx移动至containers中 /* * 包含所有action的type名称常量 * */ //添加评论 export const ADD ...
- Nginx 安装学习笔记(1.安装和启动)
centos7 编译安装和启动.停止https://www.cnblogs.com/xingyunblog/p/9072553.html 一.安装nginx 1.下载 wget http://ngin ...
- PeopleSoft进程卡在“已排队”状态诊断和解决
进程卡在“已排队”状态的原因很多.最常见的原始是进程调度器服务挂掉了(可以在“进程监视器”页面的“服务器”tab页中查看). 除此之外,还可以进行下面诊断:1. 检查下面3张表:PSPRCSRQSTP ...
- 关于第一个launcher开发笔记
本笔记主要记录阅读关于launcher代码是的相关知识点. viewpager的简单使用(适配器模式):https://www.cnblogs.com/fuly550871915/p/4922953. ...
- spring @Autowired与@Resource的区别
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...
- Spring事务mysql不回滚:mysql引擎修改
若Spring中@Transactional 注解开启且配置没问题的话,很可能是mysql数据库引擎不支持. mysql引擎是MyISAM的话事务会不起作用,原因是MyISAM不支持事务和外键,改成支 ...
- 关于感受野 (Receptive field) 你该知道的事
Receptive field 可中译为“感受野”,是卷积神经网络中非常重要的概念之一. 我个人最早看到这个词的描述是在 2012 年 Krizhevsky 的 paper 中就有提到过,当时是各种不 ...