[UE4入门笔记(11)] 34.右手插槽 35.手上物品切换 36.动作切换 --梁迪老师UE4纯C++&Slate开发沙盒游戏

前言:

笔者目前在校本科大三,目标方向是人工智能、计算机视觉。上一个OpenCV学习笔记专栏已完结,在学习完OpenCV后,我继续学习C++,并用纯C++做UE4项目的方式继续提升自己的水平。

梁迪老师的水平非常高,他的课程本来也无需笔记:课程本身即为最好的笔记。但由于我天赋有限,还是边看边记,以防遗忘——知识点太多,步骤太繁杂了。在学习过程中,我也偶有思考,思索为什么某个方法老师要这样做。所以,一是为了记录,二是为了分享,才有了这个专栏。

内容方面,由于我在开启这个专栏时,此项目已经做完很多了。所以,前期的一些大篇幅叙述的知识,可能在后期应用中一带而过。以及,前期的一些知识,后期会重新剖析,并加上我的个人理解。

另外,若有学术交流/学业交流意愿,可以邮件联系1246210283@qq.com,希望一齐进步。


本篇学习内容:

34.右手插槽
35.手上物品切换
36.动作切换


34.右手插槽

(1)在Character中定义一个变量

//手上物品
UPROPERTY(VisibleDefaultsOnly, Category = "SlAi")
	class UChildActorComponent* HandObject;//可以绑定一个Actor在这个Character里

(2)绑定模型

//实例化手上物品(构造函数中)
	HandObject = CreateDefaultSubobject<UChildActorComponent>(TEXT("HandObject")); //接下来将其绑定到骨骼的手上

//把手持物品组件绑定到第三人称模型,绑定规则:贴附到目标但不包括大小变换(BeginPlay函数中)
	HandObject->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, FName("RHSocket"));

(3)创建HandObject类和8个物品对应的子类,继承自HandObject

(4)先在HandObject中做一些准备工作

ASlAiHandObject::ASlAiHandObject()
{
   
   
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	//实例化根组件
	RootScene = CreateDefaultSubobject<USceneComponent>(TEXT("RootScene"));
	RootComponent = RootScene;

	//创建静态模型组件
	BaseMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BaseMesh"))
<think>好的,用户想了解如何实现Unreal Engine的背包系统。首先,我需要整理现有的引用资料,看看有哪些可用的信息。引用1提到用C++创建背包系统,引用了UE4的教程。引用2详细说明了背包UI的结构,使用SOverlay、SBox等Slate组件。引用3提到了Tick事件,可能用于实时更新背包状态。引用4是关于导入资产和设置UI纹理的。 用户可能需要从基础开始,了解如何搭建背包系统的框架。需要分步骤讲解,包括UI设计、数据结构、交互逻辑和优化。可能需要结合C++和蓝图两种方法,但用户的问题中引用的资料既有C++也有蓝图的内容,所以应该都涵盖一下。 首先,背包系统的核心是物品管理,可能需要用结构体或类来表示物品属性。引用1中的C++代码可以作为参考,创建InventoryComponent。然后,UI部分需要用到Slate或UMG,引用2详细描述了UI结构,应该引用这部分内容来说明如何布局背包界面。 接着,交互逻辑包括物品的添加、拖拽、合成等,可能需要事件分发和处理,引用3的Tick事件可能用于实时检测物品位置变化。但Tick事件要谨慎使用,避免性能问题,所以需要提到优化方法,比如只在需要时启用Tick。 另外,引用4提到的资产导入和纹理设置对UI美观很重要,应该提醒用户正确设置纹理压缩和LOD,以优化内存和显示效果。 用户可能遇到的问题包括UI布局错乱、物品数据同步、性能优化等,需要针对这些常见问题给出解决方案,比如使用SOverlay自适应布局,数据同步使用委托或事件分发,性能方面建议分帧加载或虚拟列表。 最后,生成相关问题,帮助用户深入理解,比如如何实现拖拽功能、数据保存、网络同步等,这些可能都是用户后续会遇到的。</think>### UE4/UE5背包系统实现指南 #### 一、基础框架搭建(C++实现) 1. **物品数据结构** 建议使用`FItemInfo`结构体存储物品属性: ```cpp USTRUCT(BlueprintType) struct FItemInfo { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite) FName ItemID; UPROPERTY(EditAnywhere, BlueprintReadWrite) FText ItemName; UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 MaxStack; }; ``` 引用[1]中的背包系统通过`UInventoryComponent`管理物品数据,建议继承`UActorComponent`实现类似功能[^1]。 2. **UI架构设计** 推荐使用多层嵌套的Slate控件实现复杂布局: ``` SOverlay (根组件) └── SBox (自适应容器) └── SOverlay ├── SImage (背景) ├── SCanvas (背包网格) ├── SVerticalBox (快捷栏) └── SButton (合成按钮) ``` 这种结构符合引用[2]中梁迪老师的背包系统设计规范[^2]。 #### 二、核心功能实现 1. **物品拖拽交互** ```cpp void SInventorySlot::OnDragDetected(...) { TSharedPtr<SDragItem> DragWidget = SNew(SDragItem).ItemInfo(this->ItemInfo); return FReply::Handled().BeginDragDrop(DragWidget.ToSharedRef()); } ``` 建议结合`OnDrop`事件实现拖放逻辑,使用`FSlateApplication::Get().GetCursorPos()`获取实时位置。 2. **数据同步机制** 推荐使用`DECLARE_DYNAMIC_MULTICAST_DELEGATE`创建物品变更事件: ```cpp UPROPERTY(BlueprintAssignable) FOnInventoryUpdated OnInventoryUpdated; ``` 通过事件驱动UI更新,避免每帧查询的性能损耗[^3]。 #### 三、性能优化方案 1. **纹理处理** 按引用[4]建议设置纹理参数: - Compression Settings → UserInterface2D - Texture Group → UI - Mip Gen Settings → NoMipmaps[^4] 2. **动态加载策略** ```cpp void UInventoryWidget::NativeTick(...) { if(ShouldUpdate) { UpdateGrid(); ShouldUpdate = false; } } ``` 建议将高频操作与Tick事件解耦,参考引用[3]中的Tick优化方法。 #### 四、常见问题解决方案 | 问题现象 | 排查方向 | 修复建议 | |---------|---------|---------| | UI布局错乱 | 控件层级关系 | 检查SOverlay的Slot顺序 | | 物品显示错位 | 锚点设置 | 确认CanvasPanel的坐标计算 | | 数据不同步 | 网络复制配置 | 检查属性Replication设置 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值