IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> UE4 C++下实现按住左键持续开火 -> 正文阅读

[游戏开发]UE4 C++下实现按住左键持续开火

首先我们有一个以character为基类的角色类AShooterCharacter。角色类中已有一个FireWeapon函数实现在游戏内开火。这个函数在每次按下鼠标左键时会被调用一次,类似于半自动步枪。接下来要实现按住开火,松开停火。

最快速简单的实现如下

//在SetupPlayerInputComponent内绑定
	PlayerInputComponent->BindAction("FireButton", IE_Pressed, this, &AShooterCharacter::FireButtonPressed);
	PlayerInputComponent->BindAction("FireButton", IE_Released, this, &AShooterCharacter::FireButtonReleased);
//在AShooterCharacter.h内定义 FTimerHandle类AutoFireTimer和射击间隔AutomaticFireRate

void AShooterCharacter::FireButtonPressed()
{   //设置Timer循环调用FireWeapon
	GetWorldTimerManager().SetTimer(AutoFireTimer, this,
			&AShooterCharacter::FireWeapon,AutomaticFireRate,true);
}

void AShooterCharacter::FireButtonReleased()
{   //清空AutoFireTimer设定的Timer
	GetWorldTimerManager().ClearTimer(AutoFireTimer);
}

这个方法利用UE4的Timer功能实现自动按一定间隔循环开枪直至松开左键。但是实际游戏中存在着各种角色无法开枪的可能,例如死亡,子弹耗尽,收到某些效果射速改变或不让开枪。上面的方法即不利于实现上述的效果也不方便由蓝图去操作。所以应设置一个布尔变量bShouldFire表示是否能继续开枪,再定义一个布尔变量bFireButtonPressed检测鼠标左键状态,两者共同决定是否开枪。

//在SetupPlayerInputComponent内绑定
	PlayerInputComponent->BindAction("FireButton", IE_Pressed, this, &AShooterCharacter::FireButtonPressed);
	PlayerInputComponent->BindAction("FireButton", IE_Released, this, &AShooterCharacter::FireButtonReleased);

void AShooterCharacter::FireButtonPressed()
{
	bFireButtonPressed = true;
	StartFireTimer();
}

void AShooterCharacter::FireButtonReleased()
{
	bFireButtonPressed = false;
}

void AShooterCharacter::StartFireTimer()
{
	if (bShouldFire)
	{
		FireWeapon();
		bShouldFire = false;
		GetWorldTimerManager().SetTimer(AutoFireTimer, this,
			&AShooterCharacter::AutoFireReset,AutomaticFireRate);
	}
}

void AShooterCharacter::AutoFireReset()
{
	bShouldFire = true;
	if (bFireButtonPressed)
	{
		StartFireTimer();
	}
}

StartFireTimer()和AutoFireReset()相互调用来实现循环开枪,只用修改bShouldFire就能阻止角色继续开火,而不是调用GetWorldTimerManager().ClearTimer(AutoFireTimer)来使角色停火。例如玩家开枪时枪射速变慢,原本要先ClearTimer再SetTimer,现在只用修改AutomaticFireRate的值即可,对外部蓝图实现效果也更方便。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:33:36  更:2021-10-06 12:33:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:47:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码