射击游戏案例(一)

2024-05-13 19:20
文章标签 游戏 案例 射击

本文主要是介绍射击游戏案例(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、使用到的资源:

1.小白人动画包(AnimStarterPack)

2.基础武器包(MilitaryWeapSilver)

 二、角色创建

2.1 添加摄像机臂和摄像机组件

 2.2 基于创建的角色C++类创建对应的蓝图类

2.3 基础项目设置 

2.4 角色按键输入​

一、使用到的资源:

以下使用到的资源都可以在虚幻商城免费资源处获取,也可以使用自己的资源。

1.小白人动画包(AnimStarterPack)

AnimStarterPack

2.基础武器包(MilitaryWeapSilver)

 二、角色创建

以Character为基类创建出需要的角色,我这里创建了一个BaseCharacter作为角色类的基类,并以这个角色类为基类创建出子类ManCharacter,将部分功能放到子类中去处理。

2.1 添加摄像机臂和摄像机组件

BaseCharacter.h中:

private:
/*
*摄像机臂
*/
UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category=Components,meta=(AllowPrivateAccess="true"))
USpringArmComponent*CameraBoom;
/*
*摄像机
*/
UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category=Components,meta=(AllowPrivateAccess="true"))
UCameraComponent*FollowCamera;

BaseCharacter.cpp中:

ABaseCharacter::ABaseCharacter()
{PrimaryActorTick.bCanEverTick = true;CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));CameraBoom->SetupAttachment(RootComponent);CameraBoom->bUsePawnControlRotation = true;FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));FollowCamera->SetupAttachment(CameraBoom);
}

在cpp中需要添加的头文件:

#include"Camera/CameraComponent.h"
#include"GameFramework/SpringArmComponent.h"

 2.2 基于创建的角色C++类创建对应的蓝图类

创建完两个组件之后,在编辑器中可以选中BaseCharacter或者ManCharacter右键创建下属的蓝图类,这个是为了方便进行可视化操作。创建出来之后,在代码里面创建的摄像机臂和摄像机组件就会显示在创建的蓝图类中。

 选中网格体的组件(骨骼体组件),为骨骼体组件赋予模型,模型对应的动画后续再进行赋予。调整模型的位置,这里的下移-88是根据胶囊体组件的高度进行调整的,旋转是因为要将模型角色的正面面向箭头组件,这样会跟移动的方向一致。

2.3 基础项目设置 

打开项目设置,找到地图和模式,将默认的GameMode设置为自己的,并将默认Pawn类,HUD,以及玩家控制器设置为自己创建的;编辑器开始地图和游戏默认地图也设置为自己创建的。

 运行,调整自己的角色在界面中的位置。

2.4 角色按键输入​

编辑器按键设置,在项目设置里面的输入模块,在这里并没有使用UE5特有的增强输入系统,还是按照UE4原有的轴绑定和按键绑定,可以先加一个角色前后左右走和上下左右看,以及跳跃的输入绑定。 

 BaseCharacter.h中:

/*
*角色移动和视角查看
*/
voidMoveForward(floatValue);
voidMoveRight(floatValue);
voidTurn(floatValue);
voidLookUp(floatValue);

BaseCharacter.cpp中:

void ABaseCharacter::MoveForward(float Value)
{if (Controller && Value != 0.0f){const FRotator ControlRotation = Controller->GetControlRotation();const FRotator NewRotation = FRotator(0.0f,ControlRotation.Yaw,0.0f);const FVector Dir = FRotationMatrix(NewRotation).GetUnitAxis(EAxis::X);AddMovementInput(Dir,Value);}
}void ABaseCharacter::MoveRight(float Value)
{if (Controller && Value != 0.0f){const FRotator ControlRotation = Controller->GetControlRotation();const FRotator NewRotation = FRotator(0.0f,ControlRotation.Yaw,0.0f);const FVector Dir = FRotationMatrix(NewRotation).GetUnitAxis(EAxis::Y);AddMovementInput(Dir,Value);}
}void ABaseCharacter::Turn(float Value)
{AddControllerYawInput(Value*0.25f);
}void ABaseCharacter::LookUp(float Value)
{const FRotator ControlRotation = Controller->GetControlRotation();const float PitchValue = ControlRotation.Pitch;//限制上下视角if (PitchValue >= 30.0f && PitchValue < 180.0f && Value < 0.0f){return;}if (PitchValue > 180.0f && PitchValue <= 280.0f && Value > 0.0f){return;}AddControllerPitchInput(Value*0.25f);
}

注:视角查看的*0.25f是控制了鼠标滑动的速度,可要可不要。

在LookUp方法中,为了不让玩家在上下视角看的时候穿裆,进行了视角限制,可以在LookUp中添加屏幕打印,查看PitchValue和Value的具体值,以便去进行范围限制。

    if (GEngine){FString Msg = FString::Printf(TEXT("PitchValue:%f,Value:%f"),PitchValue,Value);GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Blue,Msg);}

全部代码:

 BaseCharacter.h

#pragma once#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "BaseCharacter.generated.h"class USpringArmComponent;
class UCameraComponent;UCLASS()
class SHOOTINGGAME_API ABaseCharacter : public ACharacter
{GENERATED_BODY()public:ABaseCharacter();protected:virtual void BeginPlay() override;/** 角色移动和视角查看*/void MoveForward(float Value);void MoveRight(float Value);void Turn(float Value);void LookUp(float Value);public:	virtual void Tick(float DeltaTime) override;virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;private:/** 摄像机臂*/UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category=Components,meta=(AllowPrivateAccess="true"))USpringArmComponent* CameraBoom;/** 摄像机*/UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category=Components,meta=(AllowPrivateAccess="true"))UCameraComponent* FollowCamera;};

BaseCharacter.cpp

#include "ShootingGame/Public/Gameplay/BaseCharacter.h"
#include"Camera/CameraComponent.h"
#include"GameFramework/SpringArmComponent.h"ABaseCharacter::ABaseCharacter()
{PrimaryActorTick.bCanEverTick = true;CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));CameraBoom->SetupAttachment(RootComponent);CameraBoom->bUsePawnControlRotation = true;FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));FollowCamera->SetupAttachment(CameraBoom);
}void ABaseCharacter::BeginPlay()
{Super::BeginPlay();}void ABaseCharacter::MoveForward(float Value)
{if (Controller && Value != 0.0f){const FRotator ControlRotation = Controller->GetControlRotation();const FRotator NewRotation = FRotator(0.0f,ControlRotation.Yaw,0.0f);const FVector Dir = FRotationMatrix(NewRotation).GetUnitAxis(EAxis::X);AddMovementInput(Dir,Value);}
}void ABaseCharacter::MoveRight(float Value)
{if (Controller && Value != 0.0f){const FRotator ControlRotation = Controller->GetControlRotation();const FRotator NewRotation = FRotator(0.0f,ControlRotation.Yaw,0.0f);const FVector Dir = FRotationMatrix(NewRotation).GetUnitAxis(EAxis::Y);AddMovementInput(Dir,Value);}
}void ABaseCharacter::Turn(float Value)
{AddControllerYawInput(Value*0.25f);
}void ABaseCharacter::LookUp(float Value)
{const FRotator ControlRotation = Controller->GetControlRotation();const float PitchValue = ControlRotation.Pitch;//限制上下视角if (PitchValue >= 30.0f && PitchValue < 180.0f && Value < 0.0f){return;}if (PitchValue > 180.0f && PitchValue <= 280.0f && Value > 0.0f){return;}AddControllerPitchInput(Value*0.25f);
}void ABaseCharacter::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}void ABaseCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);PlayerInputComponent->BindAxis("MoveForward",this,&ABaseCharacter::MoveForward);PlayerInputComponent->BindAxis("MoveRight",this,&ABaseCharacter::MoveRight);PlayerInputComponent->BindAxis("Turn",this,&ABaseCharacter::Turn);PlayerInputComponent->BindAxis("LookUp",this,&ABaseCharacter::LookUp);PlayerInputComponent->BindAction("Jump",IE_Pressed,this,&ABaseCharacter::Jump);PlayerInputComponent->BindAction("Jump",IE_Released,this,&ABaseCharacter::StopJumping);
}

这篇关于射击游戏案例(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986601

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI