[unreal4入门系列之十四] 在UE4中添加碰撞触发事件
一、在HUD中显示消息
1) 在MyHUD.h中定义一个结构来表示我们的消息:
#pragma once
#include "GameFramework/HUD.h"
#include "MyHUD.generated.h"
//该结构体表示我们要显示的消息属性
struct Message
{
FString m_Message; //消息内容
float m_Time; //显示的时间
FColor m_Color; //文本的颜色
Message() : m_Time(6.0f), m_Color(FColor::White) //默认属性
{
}
Message(FString message, float time, FColor color)
:m_Message(message), m_Time(time), m_Color(color)
{
}
};
2) 添加消息数组。UE4中用TArray来表示动态数组,因此将我们的AMyHUD类修改成:
UCLASS()
class DEMO1_API AMyHUD : public AHUD
{
GENERATED_UCLASS_BODY()
public:
// 下面这个重载函数每帧会被调用一次,在这个函数的定义里面来渲染字体
virtual void DrawHUD() override;
void AddMessage(Message msg);
// 添加字体属性(随后我们在蓝图编辑器中设置字体类型)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HUDFont) UFont* hudFont;
private:
TArray<Message> m_Messages;
};
上面定义了一个表示消息的TArray数组,当有消息要被显示的时候,将其添加到该数组中。当该消息经过了一段时间后消息,就会从TArray数组中删除。有关TArray的知识,后面也会继续介绍。
在AMyHUD.cpp中添加如下代码:
#include "Demo1.h"
#include "MyHUD.h"
AMyHUD::AMyHUD(const class FObjectInitializer& PCIP) : Super(PCIP)
{
}
void AMyHUD::DrawHUD()
{
// 先调用父类DrawHUD()函数
Super::DrawHUD();
// 从后往前迭代数组,这样做的好处是可以避免删除一个元素引起因为当前的迭代器无效引起的错误
for (int i = m_Messages.Num() - 1; i >= 0; --i)
{
float outputWidth, outputHeight, pad = 10.0f; //pad是文本和消息框的间距
//下面的函数根据字体和字体大小计算当前这段消息的宽度、高度,用于计算其消息框的宽度和高度
GetTextSize(m_Messages[i].m_Message, outputWidth, outputHeight, hudFont, 1.0f);
float messageH = outputHeight + 2.0f*pad;
float x = 0.0f, y = i*messageH;
//黑色背景
DrawRect(FLinearColor::Black, x, y, Canvas->SizeX, messageH);
DrawText(m_Messages[i].m_Message, m_Messages[i].m_Color, x + pad, y + pad, hudFont);
// 消耗显示时间
m_Messages[i].m_Time -= GetWorld()->GetDeltaSeconds();
//如果显示时间已消耗完,将其移除
if (m_Messages[i].m_Time < 0)
{
m_Messages.RemoveAt(i);
}
}
}
void AMyHUD::AddMessage(Message msg)
{
m_Messages.Add(msg);
}
二、在NPC中添加触发事件
为了让我们靠近NPC才显示对话框,我们需要创建一个比角色原来的碰撞体要大一点的碰撞盒用来检测是否靠近NPC。我们会创建一个大的球体包围住NPC,这样当我们靠近NPC它就会作出反应并显示消息出来。
1) 在NPC.h文件中添加如下代码:
#pragma once
#include "GameFramework/Character.h"
#include "NPC.generated.h"
UCLASS()
class DEMO1_API ANPC : public ACharacter
{
GENERATED_UCLASS_BODY()
public:
//在目录Collision下创建球体属性(随处可见,蓝图只读),用于靠近NPC的碰撞体检测
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Collision)
USphereComponent* ProxSphere;
//在目录NPCMessage下创建字符串属性(随处可见,蓝图可读写)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = NPCMessage)
FString NpcMessage;
//接近NPC时调用该函数
UFUNCTION(BlueprintNativeEvent, Category = "Collision")
void Prox(AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 otherBodyIndex, bool bFromSweep,
const FHitResult & SweepResut);
};
2) 在NPC.cpp中添加如下代码:
#include "Demo1.h"
#include "NPC.h"
#include "Avatar.h"
#include "MyHUD.h"
ANPC::ANPC(const class FObjectInitializer& PCIP)
: Super(PCIP),
ProxSphere(PCIP.CreateDefaultSubobject<USphereComponent>(this, TEXT("Proximity Sphere"))),
NpcMessage("Hi!!") //设置默认消息,而且它是可以在UE4中被编辑的
{
//把球体贴合到根组件,这样球体就会跟随着NPC
ProxSphere->AttachTo(RootComponent);
//设置球体半径
ProxSphere->SetSphereRadius(200.0f);
//将检测靠近球体跟Prox函数进行重叠绑定。当球体与其他actor有交叉时就会调用Prox函数
ProxSphere->OnComponentBeginOverlap.AddDynamic(this, &ANPC::Prox);
}
//注意!虽然我们的头文件中声明是ANPC::Prox(),但是这里要写ANPC::Prox_Implementation
//当球体与其他actor发生重叠时就会调用该函数
void ANPC::Prox_Implementation(AActor* otherActor, UPrimitiveComponent* otherComp, int32 otherBodyIndex, bool bFromSweep,
const FHitResult & sweepResult)
{
//通过强制转换成AAVatar是否成功来判断是否玩家角色
if (Cast<AAvatar>(otherActor) == nullptr)
{
return;
}
//获得第一人称控制器
APlayerController* PController = GetWorld()->GetFirstPlayerController();
if (PController)
{
//获得HUD界面
AMyHUD* hud = Cast<AMyHUD>(PController->GetHUD());
hud->AddMessage(Message(NpcMessage, 5.f, FColor::White));
}
}
三、运行
最后你可以编译看看自己的代码是否没有问题,如果没有问题,在打开的UE4编辑器中点击运行,每当你靠近一个NPC,左上角就会显示其消息,如下图所示:
转自:http://www.52vr.com/article-565-1.html
[unreal4入门系列之十四] 在UE4中添加碰撞触发事件相关推荐
- [unreal4入门系列之十二] 在UE4中创建非玩家角色(NPC)
现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 创建C++类 1) 在UE编辑器中,打开文件-新建C+ ...
- C++编程入门系列之十四(类与对象:构造函数和析构函数)
C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米上一节中给大家讲解了类的声明.成员的访问控制和对象,今天鸡啄米给大家讲C++编程入门时同样必须掌握的构造函数和析构函数.从上一讲开始已经 ...
- LSTM长短记,长序依赖可追忆(深度学习入门系列之十四)
摘要:如果你是一名单身狗,不要伤心,或许是因为你的记忆太好了.有时,遗忘是件好事,它让你对琐碎之事不再斤斤计较.然而每当自己记不住单词而"问候亲人"时,也确实气死个人.于是你懂得了 ...
- [unreal4入门系列之十六] UE4中的集合:TSet容器
一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容器--TSet<T>.类似于TArray<T>, ...
- 【深度学习之美】LSTM长短记,长序依赖可追忆(入门系列之十四)
14.1 遗忘是件好事还是坏事? 如果我问你,遗忘,是件好事,还是坏事? 或许你会说,当然是件坏事啊,我可羡慕记忆力好的人了. 可我要告诉你,如果你到现在还记得,两岁时,隔壁家的小女孩"横刀 ...
- [unreal4入门系列之八] 使用VS编译UE4编辑器并添加物体到场景中
接下来,我们将会创建一个放置我们的游戏角色的基本场景. 编译UE4编辑器 1) 现在,我们创建一个空白的UE4项目来开始.首先点击桌面的Epic Games Launcher,打开启动器,点击左上角的 ...
- [unreal4入门系列之十五] UE4中的动态数组:TArray容器
为什么使用UE4提供的容器类? 如果你用过C++的STL库,你就知道STL提供了各种各样的容器/数据结构,使得你对处理很多数据的时候非常快捷高效.UE4同样也提供了类似的库,库里面的类型是以T开头的, ...
- [unreal4入门系列之十] UE4添加角色到场景中
现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中.要这样做,我们必须从UE4的GameFramework类继承它. 一. 打开上次创建的关卡 如果你已经关闭了项目,并且保存了上次创建的 ...
- 【ASE入门学习】ASE入门系列二十四——轴向溶解
武器出现消失效果复刻,涉及知识点:轴向溶解.光边溶解.Surface材质.UV2(第二套UV).Animation动画制作.简单光粒子制作 至此自发光四个部分说明完毕(第一部分是自反光贴图自身)把这4 ...
最新文章
- 致首次创业者:如果做到了这三点,想不成功都难(转)
- Java程序员时刻铭记的Git常用命令
- c++十进制转二进制_二进制与十进制相互转换的原理
- layui框架的优缺点
- Windows下搭建Octopress博客
- 在html中滚动条显示的属性,html滚动条textarea属性设置本 textarea怎么显示滚动条...
- 架构之美第五章-架构概述
- 中兴f477v2超级管理员_中兴f677v2联通光猫超级密码及登录地址
- 部分常用GIS网站论坛推荐
- 使用Hbuilder搭建MUI框架
- 大数据杀熟 算法_大数据杀熟这事,究竟有多没谱?
- 幸福工厂(Satisfactory)中文破解版
- RK3066 实现LED闪烁的代码分析
- linux查进程ps和top,linux进程查看top与ps
- java计算机毕业设计用户行为自动化书籍推荐系统MyBatis+系统+LW文档+源码+调试部署
- oracle 此处不允许序号
- DVM,ART,JVM之间的关系
- 刺猬文│以太坊交易信息解析方法
- 智能制造的实现,少不了APS排产系统
- spoon java_如何以及为什么使用Spoon分析,生成和转换Java代码
热门文章
- 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML
- 如何从字符串中删除文本?
- 我在哪里可以在线找到Android源代码? [关闭]
- 如何将struct System.Byte byte []转换为C#中的System.IO.Stream对象?
- 如何将键/值对添加到JavaScript对象?
- CentOS 7 快速部署 ELK
- 新书问答:Company-Wide Agility
- shelve 之VS. pickle
- 广告域名审核之后跳转技术:点击域名A页面iframe框架下的链接,域名A跳转到域名B...
- Mysql Explain 详解