1.介绍:
枪械后背的动画效果
您是想在Unreal Engine 5 (UE5) 中实现角色捡起枪械并将其背在后背上的动画效果。这通常涉及到几个步骤:创建或获取合适的3D模型和动画、设置动画蓝图来控制角色的动作以及编写逻辑以触发这些动作。下面是实现这一功能的大致步骤:
1. 准备资源
角色模型:确保您的角色模型支持装备武器。
枪械模型:需要一个可以被角色持有的枪械模型。
动画:包括捡起枪械、将枪械背到后背上的动画。
2. 设置骨骼网格体(Skeletal Mesh)
在UE5中打开您的角色,并为它添加额外的骨骼,用来代表枪的位置。这可能意味着需要修改现有的骨架或使用具有附加点的角色模型。
确保枪械模型能够正确地附着于角色的背部位置。
3. 动画序列(Animation Sequences)
使用如Maya, 3ds Max, 或 Blender等工具制作所需的动画序列。
将动画导入UE5并通过动画编辑器检查它们是否正确工作。
4. 创建动画蓝图(Animation Blueprint)
制作一个新的动画蓝图或者扩展已有的动画蓝图来包含新的动画状态机(State Machine)。
定义不同的状态,比如“空手”、“持枪”、“背枪”,并在状态间设置适当的过渡条件。
可以利用混合空间(Blend Spaces)来平滑不同动作之间的过渡。
5. 编写逻辑
使用蓝图脚本(Blueprint Scripting)来检测玩家何时拾取枪械,并相应地更改动画状态。
当玩家想要将枪背起来时,可以通过按键输入或其他游戏机制触发特定的动作。
6. 测试与调整
在游戏中测试整个流程,从拾取枪支到背着走动。
根据实际情况微调动画时间、过渡速度等因素,直到达到满意的效果为止。
7. 其他考虑因素
如果你希望更真实的表现,还可以加入物理模拟,使得枪械在移动过程中自然摆动。
考虑加入声音效果,当角色拿起或放下枪械时播放对应的声音。
2. 菜单类
目的:通过菜单类,进入在线子系统
添加这些不会编译错误
写一个菜单类
// Fill out your copyright notice in the Description page of Project Settings.
#include "Menu.h"
//菜单类设置
void UMenu::MenuSetup()
{
AddToViewport();
SetVisibility(ESlateVisibility::Visible);
bIsFocusable = true;
UWorld* world = GetWorld(); //创建一个游戏事件的指针
if (world)
{
APlayerController *PlayerController = world->GetFirstPlayerController();
if (PlayerController)
{
FInputModeUIOnly InputModeData;
InputModeData.SetWidgetToFocus(TakeWidget());
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
PlayerController->SetInputMode(InputModeData);
PlayerController->SetShowMouseCursor(true); //看到鼠标光标
}
}
}
创建一个小部件蓝图
删除3个文件,重新构建项目,可以使用之前的菜单类
就可以看见Menu类了
最终效果
运行后不能移动,因为设置了输入模式
3. 多人在线插件
通过多人游戏插件Plugin
在线子系统插件 Online SubSystem
4. 按E键,拾取武器
二. 实现多人客户端登录游戏
play --对应多少人登录客户端,就写多少人
2.局域网连接多台设备
比如多台设备连接一个WiFi网络
3.点击一个角色蓝图进入
删除不用3个的蓝图
选择keyboar 的第1个
创建3个key
3.1 我们要创建另一个世界,等待其他玩家的进入
创建一个第三世界
新建后保存
选择floor 将x,y轴放大 -----使得平面更宽阔。
open level------name选择刚才创建的lobby
作为侦听服务器
拖动key2 ------ 控制台命令
表示按下key2 :执行控制台命令
通过IP地址访问key1 的游戏实例
通过cmd -- - --ipconfig指令查询IP地址
IPv4就是本地的地址IP
3.5 打开window ----package project
会弹出页面
新建一个文件夹----命名为Build
将创建的window文件夹放入谷歌驱动器中
就可以从另一台计算机去下载
3.7 命名为LANConnection
点击运行
如果我按下一个键
跳转到侦听服务器
P13 ---加入会话
playeController 判断playcontreoler是否为空。
公共模块
公共文件,其他模块可以使用公共文件里面的内容
15:31
FString Address;
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(
-1,
15.f,
FColor::Yellow,
FString::Printf(TEXT("Connect string :%s"),*Address)
);
}
获取Address 一个会话,进入,可以去那个地址旅行了
P25 改进菜单子系统
游戏大厅
LastSessionSettings->bUseLobbiesIfAvailable = true;
这一行代码的意思是设置 `LastSessionSettings` 对象中的 `bUseLobbiesIfAvailable` 成员变量为 `true`。这里的 `bUseLobbiesIfAvailable` 是一个布尔值 (`bool`),表示是否当可用时使用游戏大厅(Lobbies)。
在 Unreal Engine 或类似的游戏开发环境中,这通常意味着:
- 如果值为 `true`,那么当游戏大厅服务可用时,游戏将使用这些服务来管理玩家加入游戏房间的过程。这通常包括匹配玩家、创建游戏会话等。
- 如果值为 `false`,则游戏将不会自动利用游戏大厅功能,而是可能会采用其他方法来管理玩家连接。
简单来说,这行代码的作用是告诉游戏引擎:“如果游戏大厅服务可用的话,请启用它。” 这样可以方便地让玩家找到其他玩家并一起玩游戏。
3d射击游戏
要在Unreal Engine (UE) 中实现多人在线登录游戏,并添加角色类、基本移动功能、战斗组件等功能,你需要遵循一定的步骤。下面我将逐步介绍如何使用UE来实现这些功能。
1. 实现多人在线登录游戏
步骤
-
网络设置:
- 在UE中启用网络支持。
- 设置项目的网络模式为“Dedicated Server”或“Listen Server”。
-
会话功能:
- 使用UE的内置会话系统或集成第三方服务(如Steamworks)来管理会话。
- 创建会话、加入会话、离开会话等。
-
登录验证:
- 如果需要,可以使用外部服务(如PlayFab)来处理用户的登录验证。
- 或者自己实现一个简单的登录验证系统。
2. 创建角色类并添加网格和基本移动功能
步骤
-
创建角色蓝图:
- 使用UE的Blueprint系统创建一个新的角色蓝图。
- 或者直接创建一个C++类继承自
ACharacter
或APawn
。
-
添加网格:
- 为角色蓝图添加一个网格模型(Mesh)。
- 使用UE的动画系统来控制角色的动画。
-
实现移动:
- 使用
Character Movement Component
来实现基本的移动功能。 - 通过事件图表(Event Graph)或C++代码来控制角色的输入响应。
- 使用
3. 实现战斗组件
步骤
-
射击功能:
- 添加一个武器蓝图或C++类。
- 实现射击逻辑,例如发射子弹、粒子效果、声音等。
-
瞄准功能:
- 添加一个瞄准机制,可以通过按住键来改变视野角度。
- 可以使用Camera Boom来实现第一人称视角下的瞄准效果。
-
投掷手榴弹:
- 创建一个手榴弹蓝图或C++类。
- 实现投掷逻辑,例如投掷动画、轨迹计算、爆炸效果等。
4. 服务器对重要游戏逻辑保持最高权限
步骤
-
服务器验证:
- 对所有重要逻辑(如射击、伤害计算等)在服务器端进行验证。
- 确保客户端发送的数据在服务器端进行检查和处理。
-
网络同步:
- 使用UE的网络复制机制来同步重要状态,如角色位置、生命值等。
- 可以使用
Replicated
属性或OnRep
函数来实现状态同步。
-
权威服务器:
- 确保所有关键逻辑都在服务器端执行,以防止作弊。
- 服务器应是所有重要游戏逻辑的唯一权威来源。
3.1. 瞄准功能实现
最后一行处理了动作映射
bool bAiming; //定义一个瞄准变量
在.h文件定义bAiming
如果战斗有效,设置一个瞄准为true
按下和松开函数,瞄准函数
3.2 设置一个步枪瞄准镜头
回到装备蓝图
复制到所有客户
这里定义了另一个私有成员变量EquippedWeapon,它是一个指向AWeapon类的指针。此外,使用了UPROPERTY宏,并传入参数Replicated,这表明EquippedWeapon属性将在网络游戏中进行复制,即在网络连接的客户端上同步其值。
3.3 实现战斗组件bAiming
3.4 创建一个RPC服务器,让其他玩家也能看到 瞄准抬枪的动作
void UCombatComponent::SetAiming(bool bIsAiming)
{
bAiming = bIsAiming;
}
右键瞄准,
这段代码是用C++编写的,用于处理一个战斗组件(CombatComponent)的瞄准状态。我将逐行解释每一部分的作用。
首先,我们有两个函数:
1. `void UCombatComponent::SetAiming(bool bIsAiming)`:这个函数用来设置当前是否处于瞄准状态。`bIsAiming` 是一个布尔值,表示目标是否正在瞄准。
2. `void UCombatComponent::ServerSetAiming_Implementation(bool bIsAiming)`:这个函数是一个服务器端实现,它被调用以同步瞄准状态到所有客户端。
在 `SetAiming` 函数中:
- 首先,它会更新本地的瞄准状态为传入的参数 `bIsAiming`。
- 然后检查角色是否有权限(可能是检查角色是否为主机或服务器拥有者)。如果角色没有权限,则调用 `ServerSetAiming(bIsAiming);` 来发送一个网络请求给服务器来同步瞄准状态。
在 `ServerSetAiming_Implementation` 函数中:
- 它只是简单地更新了瞄准状态为传入的参数 `bIsAiming`。
总的来说,这段代码的主要目的是管理战斗组件的瞄准状态,并在网络环境中进行同步。当玩家试图改变瞄准状态时,如果没有权限,那么就会向服务器发送一个请求,由服务器负责更新并广播给所有连接的客户端。
6. 添加武器类资产,weapons
可以下载4.21版本的ue4 ,然后下载枪支mod,再导入UE5里面
在mixamo下载骨骼网格体
导入资产
8. 动画导入虚幻引擎
8.1 UPROPERTY()函数
UPROPERTY()作用是通过反射,c++的方法属性,让我们能在虚幻蓝图调用这些属性和方法。
9. 渲染
开启Nanite可视化
12. steam 蒸汽平台
1. 装备武器的动画姿势
private:
UPROPERTY(BlueprintReadOnly, Category = Movement, meta = (AllowPrivateAccess = "true"))
bool bIsInAir;
这段代码定义了一个私有成员变量 bIsInAir
,它是一个布尔值(bool
),用于表示某个对象是否处于空中状态。这里是具体的解释:
private:
: 这个关键字指定了成员变量的访问级别为私有,意味着只能在类的内部被访问,外部代码不能直接访问它。UProperty
: 这是Unreal Engine中的宏,用来声明一个属性,这样引擎就可以知道如何序列化和管理这个属性。BlueprintReadOnly
: 这个属性告诉Unreal Engine的蓝图系统(一种可视化的脚本语言)这个变量只能读取,不能修改。这意味着在蓝图中可以读取bIsInAir
的值,但不能改变它的值。Category = "Movement"
: 这个元数据(meta-data)设置了这个属性在编辑器中的分类,这里它被归类到 "Movement" 类别下,方便在编辑器的属性面板中组织。meta = (AllowPrivateAccess = "true")
: 这个元数据允许蓝图可以访问这个私有变量。通常情况下,蓝图不能访问私有变量,但通过这个设置,蓝图可以读取这个变量的值。bool bIsInAir;
: 这是变量本身的声明,它是一个布尔类型的变量,用来表示某物是否在空中。
综上所述,这个成员变量 bIsInAir
是用来表示一个对象是否处于空中状态,它被标记为只读,并且允许在蓝图中被访问。这意味着你可以通过蓝图查看这个变量的值,但不能直接通过蓝图来改变它。如果你需要在代码中修改这个变量的值,你应该提供一个公共的方法(比如一个函数)来进行设置。
37--角色移动
移动速度乘以2倍
if 如果控制器不等于空指针,并且值不等于 ,0.f 表示一个单精度浮点字面量
这段代码是用C++编写的,看起来像是在控制一个游戏角色向前移动。在这个游戏中,“ABlasterCharacter”可能是一个自定义的类,用于表示游戏中的一个角色。
函数“MoveForward(float Value)”允许角色按照指定的速度(由Value参数决定)向前移动。如果角色有控制器(例如玩家),并且速度值非零,则执行以下操作:
1. 计算一个yaw旋转量,基于当前控制器的方向 yaw。
2. 根据这个yaw旋转量计算出一个方向向量(Direction)。
3. 使用AddMovementInput函数添加移动输入,将方向向量乘以2作为前进的方向。
简而言之,这段代码实现了根据玩家的控制方向让游戏角色向前移动的功能。
绑定用户跳跃功能
摄像机与弹簧臂
PrimaryActorTick.bCanEverTick = true;
// 创建一个默认的伸缩臂组件并将其附加到游戏对象的网格体上
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(GetMesh());
// 设置伸缩臂的目标长度为600单位,并允许控制伸缩臂的方向
CameraBoom->TargetArmLength = 600.f;
CameraBoom->bUsePawnControlRotation = true;
// 创建一个默认的跟随相机组件并将其附加到伸缩臂上
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
第一行设置PrimaryActorTick结构体的bCanEverTick字段为true,这意味着此游戏对象可以在运行时进行更新。
接下来的几行代码创建了一个伸缩臂组件,并将其附加到游戏对象的网格体上。伸缩臂会根据目标长度自动调整自身长度,以保持指定的距离。
然后设置了伸缩臂的目标长度为600个单位,并允许伸缩臂根据玩家的视角方向来旋转。
最后,创建了一个跟随相机组件,并将其附加到伸缩臂上。这样,当伸缩臂移动或改变方向时,相机也会随之移动,从而提供流畅的游戏体验。
44. 变量复制——通知
设置重叠武器组件,不用pickupwidget检查
武器显示小组件