在Unreal Engine中使用C++创建基础角色并添加移动功能

news2024/9/22 9:39:20

目录

引言

步骤一:创建C++类

步骤二:编写C++代码

步骤三:设置输入绑定

步骤四:在UE编辑器中测试

结论


引言

Unreal Engine(UE)以其强大的功能和灵活性在游戏开发界广受好评。本文将指导你如何在UE中通过C++创建一个基础的游戏角色,并为其添加基本的移动功能,如前进、后退、左转和右转。我们将从创建C++类开始,编写代码以实现这些功能,并在UE编辑器中测试它们。

步骤一:创建C++类
  1. 打开Unreal Engine Editor:启动UE4或UE5编辑器。

  2. 新建C++类:在UE编辑器中,选择“File” > “New C++ Class...”。

  3. 设置类属性

    • Parent Class:选择ACharacter作为父类,因为它已经包含了基础的移动组件和动画支持。
    • Class Name:为你的类命名,例如AMyCharacter
    • Class Folder:选择或创建一个文件夹来存放你的类文件。
    • 点击“Create Class”按钮。
步骤二:编写C++代码

在生成的AMyCharacter.hAMyCharacter.cpp文件中,我们将添加代码以实现基础移动功能。

AMyCharacter.h

// Fill out your copyright notice in the Description page of Project Settings.  
  
#pragma once  
  
#include "CoreMinimal.h"  
#include "GameFramework/Character.h"  
#include "MyCharacter.generated.h"  
  
UCLASS()  
class YOURPROJECTNAME_API AMyCharacter : public ACharacter  
{  
    GENERATED_BODY()  
  
public:      
    // Sets default values for this character's properties  
    AMyCharacter();  
  
protected:  
    // Called when the game starts or when spawned  
    virtual void BeginPlay() override;  
  
public:      
    // Called every frame  
    virtual void Tick(float DeltaTime) override;  
  
    // Called for forwards/backwards input  
    void MoveForward(float Value);  
  
    // Called for side to side input  
    void MoveRight(float Value);  
};

AMyCharacter.cpp

// Fill out your copyright notice in the Description page of Project Settings.  
  
#include "MyCharacter.h"  
  
AMyCharacter::AMyCharacter()  
{  
    // Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.  
    PrimaryActorTick.bCanEverTick = true;  
  
    // Configure character movement  
    GetCharacterMovement()->bOrientRotationToMovement = true; // Rotate character to face movement direction  
    GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // Set the rotation rates for the character  
}  
  
void AMyCharacter::BeginPlay()  
{  
    Super::BeginPlay();  
    // Additional initialization can be done here  
}  
  
void AMyCharacter::Tick(float DeltaTime)  
{  
    Super::Tick(DeltaTime);  
  
    // This is just an example, actual input handling should be done in a PlayerController or InputComponent  
    // Assuming we have input values from somewhere (e.g., gamepad, keyboard)  
    // MoveForward(InputAxisValue);  
    // MoveRight(InputAxisValue);  
}  
  
void AMyCharacter::MoveForward(float Value)  
{  
    if ((Controller != nullptr) && (Value != 0.0f))  
    {  
        // Find out which way is forward  
        const FRotator Rotation = Controller->GetControlRotation();  
        const FVector Direction = FRotationMatrix(Rotation).GetUnitAxis(EAxis::X);  
  
        // Add movement in that direction  
        AddMovementInput(Direction, Value);  
    }  
}  
  
void AMyCharacter::MoveRight(float Value)  
{  
    if ((Controller != nullptr) && (Value != 0.0f))  
    {  
        // Find out which way is right  
        const FRotator Rotation = Controller->GetControlRotation();  
        const FVector Direction = FRotationMatrix(Rotation).GetUnitAxis(EAxis::Y);  
  
        // Add movement in that direction  
        AddMovementInput(Direction, Value);  
    }  
}

注意:上面的Tick函数中的MoveForwardMoveRight调用只是示例,实际上你通常会在SetupPlayerInputComponent函数中设置这些输入绑定,或者在你的PlayerController类中处理输入。

步骤三:设置输入绑定

AMyCharacter类中,我们需要重写SetupPlayerInputComponent函数来设置输入绑定。这个函数会在角色被创建时自动调用,以配置如何响应玩家的输入。

修改AMyCharacter.h

AMyCharacter类的声明中添加对SetupPlayerInputComponent函数的声明(如果尚未存在):

// ...  
protected:  
    // Function to bind player inputs  
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;  
// ...

修改AMyCharacter.cpp

实现SetupPlayerInputComponent函数:

void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)  
{  
    Super::SetupPlayerInputComponent(PlayerInputComponent);  
  
    // Bind axis movements to our custom functions  
    PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);  
    PlayerInputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight);  
  
    // Optionally, bind keys or buttons for specific actions  
    // PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::Jump);  
}

请注意,上面的"MoveForward""MoveRight"是输入轴(Axis)的名称,这些名称应该与你在UE编辑器中设置的输入轴名称相匹配,或者你可以在这里定义它们(尽管通常在项目的Project Settings -> Input中预先定义)。

步骤四:在UE编辑器中测试
  1. 编译你的项目:在UE编辑器中,点击“Compile”按钮来编译你的C++代码。

  2. 放置角色到场景中:在UE编辑器的内容浏览器中,找到你的AMyCharacter类,然后将其拖放到关卡编辑器中的场景中。

  3. 配置输入:如果你还没有在Project Settings -> Input中设置输入轴,现在需要设置。为"MoveForward""MoveRight"设置合适的输入设备(如键盘或游戏手柄)和按键/摇杆。

  4. 播放关卡:点击编辑器工具栏上的“Play”按钮来运行你的关卡,并测试你的角色是否按预期移动。

结论

通过上述步骤,你应该已经成功在Unreal Engine中使用C++创建了一个基础的游戏角色,并为其添加了基本的移动功能。这只是UE中C++编程的一个起点,你可以继续探索更复杂的角色行为、物理交互、AI控制等高级功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

校园外卖平台小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,菜品信息管理,菜品分类管理,购买菜品管理,订单信息管理,系统管理 微信端账号功能包括:系统首页&a…

揭开ChatGPT进化之谜:人工智能如何变得更聪明

近年来,人工智能(AI)领域取得了显著进展,尤其是在自然语言处理(NLP)方面。OpenAI的GPT系列模型,如GPT-3和ChatGPT,代表了这一领域的前沿技术。本文将围绕ChatGPT提升的原因、发展趋势…

基于JSP的个性化影片推荐系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:JSP 数据库:MySQL 技术:JSP技术 工具:MyEclipse、Tomcat、MySQL 系统展示 首页 管理员功能模块 用户功能模块 …

国外评论家称《黑神话》PC版有性能问题 还有卡顿现象

《黑神话:悟空》即将正式发售,人们对这款游戏的期待值相当高。所以许多粉丝在耐心等待第一批评测报道,然后再购买这款游戏。在8月16日媒体评测解禁之前,有一位国外评论家认为《黑神话:悟空》是一款好游戏,但…

Vue的监视属性watch、computed和watch之间的区别

目录 1. 监视属性2. 监视属性的简写3. computed和watch之间的区别 1. 监视属性 监听对象: 监视属性可以监听普通属性和计算属性调用时间: 当监听的属性发生改变时。handler被调用immediate: true: 是否初始化时让handler调用一下。此时oldVlue为undefineddeep: false: watch默…

美国洛杉矶大带宽服务器的运维与监控

美国洛杉矶的大带宽服务器因其优越的地理位置、高速的网络连接以及充足的带宽资源,在全球范围内享有很高的声誉。为了确保这些服务器的稳定运行和高效服务,运维与监控工作显得尤为重要。以下是一些关于美国洛杉矶大带宽服务器运维与监控方面的科普内容。…

CentOS7 配置 nginx 和 php 方案

配置方案 一、安装软件二、编写配置文件,连接PHP三、引用文件四、测试 鉴于网上教程错综复杂,写下一这篇文章 本教程只需要三步即可 一、安装软件 yum install -y nginx php php-fpm二、编写配置文件,连接PHP 一般情况下在安装完 nginx 后…

css实现太极图

<template><div><!-- 太极图 --><div class"all"><div class"left box"></div><div class"right box"></div><div class"black"><div class"inner_white"><…

16.3 简单神经网络的实现

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

java或者sh脚本实现 实现 mysql 数据库定时导出并导入(适合linux和windows)

定时导出指定数据库的指定表导出到指定数据库 一、Java实现 1、contronller Slf4j Controller public class BackupController {AutowiredBackupService backupService;// 备份 // ResponseBody // PostMapping("/backup/backupByfile")Scheduled(cron&quo…

CANopen 控制多台设备的支持能力与定制方案评估

1. CANopen 支持的设备数量 CAN 总线的物理限制&#xff1a;CANopen 基于 CAN 总线协议&#xff0c;其设备数量受到 CAN 总线物理层的限制。标准 CAN 总线通常支持最多 127 个节点&#xff0c;但实际应用中&#xff0c;考虑到总线负载、波特率、线缆长度、网络拓扑等因素&#…

(Java)集合框架

1.集合的简介 集合Collection&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提供了若干个用来操作集合中…

[upload]-[GXYCTF2019]BabyUpload1-笔记

尝试上传.htaccess和图片和一句话木马提示 php文件提示 响应头可以看到 构造一句话图片木马如下&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 上传成功 必须增加文件夹下jpg后缀解析php .htaccess如下 <FilesMatch "jpg">Set…

windows关闭英语美式键盘

命令窗口 在Windows 中&#xff0c;如果你可通过批处理文件&#xff08;.bat&#xff09;关闭或移除美式键盘布局&#xff0c;可以使用以下步骤创建一个简单的批处理脚本&#xff1a; 打开windows命令窗口 执行命令 reg add "HKCU\Keyboard Layout\Toggle" /v &quo…

多模态感知:打造温室作物的全方位“健康档案“

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;现代农业的发展&#xff0c;离不开现代科技的支撑。在温室种植领域&#xff0c;由于环境复杂多变、管理要素繁多&#xff0c;传统人工经验难以应对日益精细化、智能化的生产需求。多模态感知技术的出现&#xf…

由于Offer报文引起的事件订阅失败

今天在工作中碰到一个车机上someip事件订阅的问题&#xff0c;Android端订阅了S32G发布的定位相关的someip服务(0x0001)中的某个事件&#xff08;卫星状态&#xff09;&#xff0c;然后这个事件是基于TCP通信的&#xff0c;设置了通信端口50001。 然后Android端上层应用反馈说收…

机器学习课程学习周报七

机器学习课程学习周报七 文章目录 机器学习课程学习周报七摘要Abstract一、机器学习部分1.1 Transformer模型概述1.2 Transformer编码器1.3 Transformer解码器1.3.1 自回归解码器1.3.2 非自回归解码器 1.4 编码器-解码器注意力1.5 Transformer的训练过程 总结 摘要 本周的学习…

How to debug a appliction on local Linux or WSL?

由于K8S权限控制&#xff0c;当部署在上面的应用程式出现问题后&#xff0c;无法还原用户出问题的场景。所以需要把程式部署到本地的Linux或WSL。 1.Upload application publish files to your Linux or WSL. 2.Add a Dockerfile FROM harbor.xxx.com/dotnet/aspnet:6.0 MAIN…

SQL注入之二次,加解密,DNS注入

加解密注入 在注入的时候&#xff0c;对变量做了加密操作&#xff0c;比如说?id1正常显示&#xff0c;但是代码对1进行了加密&#xff0c;这个时候想用?id1 and 11去判断&#xff0c;就得把1 and 11整体按照网站的方式加密&#xff0c;再去注入 二次注入 无法通过手动注入…

idea和jdk的安装教程

1.JDK的安装 下载 进入官网&#xff0c;找到你需要的JDK版本 Java Downloads | Oracle 中国 我这里是windows的jdk17&#xff0c;选择以下 安装 点击下一步&#xff0c;安装完成 配置环境变量 打开查看高级系统设置 在系统变量中添加两个配置 一个变量名是 JAVA_HOME …