导图社区 CropoutSample
这是一篇关于UE官方项目CropoutSample的思维导图,主要内容包括:Core文件,Interactable,Villagers,Plugin。
编辑于2025-04-28 17:24:22CropoutSample
Core文件
Extras文件
BP_CamShakeIdle
默认状态下相机摇晃的参数配置
BPC_Cheats
金手指,按数字1-3,直接增加资源,这个脚本只在Editor模式可以使用,不会进入最终发布游戏
GameMode文件
BP_GI(GameInstance)
变量
Audio-音频组件
TargetSeed-整数
Ul_Transition- Ul Transition
Has Save-布尔
SaveRef-BP Save GM
存档的缓存,执行Save Game函数后,存档才正在存入磁盘
Start Game Offset-浮点
Music Playing-布尔
SoundMixes-浮点
函数
TransitionIn
检查UI_Transition实例是否加入视图,没有则加入,加入视图后,执行该实例的函数Trans In
TransitionOut
类同TransitionIn函数,只是最后执行的是函数Trans Out
LoadGame
加载已经存在的存档,如果没有,则创建新存档
Update Save Asset
收集游戏信息,进行存档缓存更新
主要3个信息,村民(Pawn类型),交互(BP_Interactable,建筑、植物、石头等可交互对象),资源(E_Resource_Type)
Clear Save
清空存档
Play Music
Stop Music
事件
Event Init
初始化,调用LoadGame,创建蓝图UI_Transition实例,并缓存
Event Save Game
(异步)存档保存,将SaveRef变量(存档缓存)进行持久化(保存成文件或者保存到注册表?)
Event Update All Interactables
将所有的交互(BP_Interactable)对象的存档缓存(在Save_GM中)更新
Event Load Level
仅设置HasSave为true
Event Update All Resources
传入资源信息,并单独进行关于资源(E_Resource_Type)的存档缓存更新
Open Level
检查UI_Transition实例是否加入视图,没有则加入,加入视图后,执行该实例的函数Trans In
Event Update All Villagers
单独进行关于村民(Pawn类型)的存档缓存更新
Event Clear Save
调用ClearSave函数清空存档,并生产新的随机数生成器
Add Loading Ul
将UI_Transition实例加入视图
实现接口
BPI_GI
Get Save
返回变量SaveRef
Get All Interactables
返回SaveRef中所有的可交互对象(可收集植物、可采集石材、建筑?)
Get Seed
返回SaveRef中的随机种子(随机生成器?)
Check Save Bool
返回HasSave变量的值
BPI_Island_Plugin
陆地生成插件,这里只实现了接口函数IsLandSeed,通过该函数,获取存档中保存的随机数生成器
这里只列出实现的接口,未实现的不列出
说明
继承自GameInstance,主要用于管理实现存档保存相关的功能
BP_GM(GameMode)
函数
ConstructionScript
Lose Check
检查食物数量是否小于等于0,如果是,调用函数EndGame
Get Spawn Ref
获得关卡中的第一个BP_Spawner实例,并保存到变量SpawnRef中
Spawn Loaded Interactables
从游戏实例中获取关于BP_Interactable的存档信息,并进行生成,生成过程中,如果遇到TownHall_Ref,则保存到变量Town Hall中(Town Hall应该指游戏的主建筑)
Load Villagers
从存档中,根据数据生成对应数量的农民,生成结束后调用分发事件Update Villagers(更新界面),调用游戏实例的Update All Resources函数(放在这里更新意义不明,可能是为了修复bug吧)
Spawn Villager
生成新的村民,调用一次,则生成一个
变量
Resources-E Resource Type
关于资源信息的数据(食物、木材、石块)
Villager Count-整数
村民数量
UI_HUD-UI Layer Game
游戏游玩时的主界面引用
Start Time-浮点
游戏开始时间,无效参数,并没有被使用
SpawnRef-BP Spawner
地图植物、石块等装饰物体生成器的对象引用,此蓝图为插件:IslandGenerator的一部分,插件来历不明
Town Hall-Actor
大厅主建筑实例引用
TownHall_Ref-Actor
大厅主建筑的软类型引用(类型引用可以用于生成实例,一般可用于工厂模式,而软类型引用,大概是用于异步加载生成实例;补充知识,软对象引用,可以在不增加引用计数器时,对对象进行引用,避免内存安全问题)
Villager_Ref-BP Villager
村民的类型引用,用于作为生成村民的模板
事件
Event BeginPlay
逻辑
将正在加载界面缓慢淡出
获得关卡中的BP_Spawner实例,进行缓存
生成游戏游玩界面,并激活界面
Event Island Gen Complete
当纯地图生成完毕时,触发事件
逻辑
如果存在存档
调用函数Spawn Loaded Interactables
将存档中的资源相关数量信息提取缓存
通过SpawnRef的Spawn Mesh Only函数生成还原存档中的植物、石头等?
调用函数Load Villagers,还原存档中的村民
设置静音?
不存在存档
调用Begin ASync Spawning
初始化音量
End Game
逻辑
调用UI相关的EndGame函数,进行UI的游戏结束界面显示(根据情况显示胜利或者失败界面)
Begin ASync Spawning
逻辑
通过变量TownHall_Ref,在随机位置(由BP_SpawnMark标记的多个位置之一),异步加载蓝图模板,并生成大厅建筑
生成3个村民
调用分发事件UpdateVillagers(更新UI中的信息),调用函数UpdateAllVillagers,将村民数量进行存档缓存
调用SpawnRef的函数SpawnRandom
Spawn Villagers
根据传入的参数,生成指定数量的村民(比如新建了宿舍之后,需要添加几个新村民)
Event Add Resource
根据传入的参数,添加指定数量与类型的资源,并更新到存档缓存,以及跟新UI
Event Add Ul
调用UIHUD变量的AddStackItem函数(将新的UI加入到UIHUD中?)
Event Remove Current Ul Layer
调用UIHUD变量的Pull Current Active Widget函数(因该是与Event Add Ul相反操作,将UI从UIHUD删除)
事件分发器
Update Resources
通知UI更新
Update Villagers
通知UI更新
实现接口
BPI Resource
Check Resource
Get Current Resources
BPI Player
BPI Island Plugin
这里只列出实现的接口,未实现的不列出
说明
继承自GameMode,关联游戏实例蓝图以及BP_Spawner等蓝图,实现了具体的存档加载与地图初始化功能
BPF_Cropout
函数
Stepped Position
以200为单位,对输入的二维坐标进行取整
Get Cropout Gl
获得游戏中的BP_GI(GameInstance)实例
Get Cropout GM
获得游戏中的BP_GM实例
说明
函数库
BPI_Resource
函数
Remove Resource
Add Resource
Get Current Resources
Remove Target Resource
Check Resource
接口
MainMenu文件
BP_MainMenuGM
函数
Event BeginPlay
逻辑
创建Ul Layer Menu实例,加入视图
执行BP_GI中的Transition Out函数,另过度画面渐渐隐藏
弹出登录界面,进行登录(仅移动平台可见)
初始化音频相关配置,播放背景音乐
说明:主界面初始化,主界面音频初始化
BP_MenuPawn
Player文件
Input文件
IM_Normalize
计算逻辑
提取x轴数值,除以45,再映射为-1到1,重新以这个数值构建三位坐标,并返回
继承InputModify,用于EnhanceInput系统,本项目中,将用于处理移动平台的旋转输入
IM_Offset
计算逻辑
提取x轴数值,在此基础上加-1,重新以这个数值构建三位坐标,并返回
继承InputModify,用于EnhanceInput系统,本项目中,将用于处理移动平台的双指缩放输入
E_InputType
枚举
Unknown
Key Mouse
Gamepad
Touch
BP_PC
函数
空
变量
InputType-EInput Type
枚举
Cursor Widget-User Widget
无效变量
事件
InputAction KeyDetect
检查输入是否为手柄按键,如果是,设置KeySwitch为GamePad,并触发KeySwitch的订阅激活
InputAxis MouseMove
鼠标移动时触发,设置KeySwitch为KeyMouse(键盘与鼠标),并触发KeySwitch的订阅激活
InputAction Touch Detect
触屏输入时触发,设置KeySwitch为Touch,并触发KeySwitch的订阅激活
事件派遣
KeySwitch
实现接口
空
说明
检测用户输入,在主机、PC、移动3个平台自动切换
BP_Player(核心)
变量
部件
Collision
Cursor
BPC_Cheats
FloatingPawnMovement
对速度与加速度进行限制(不限制重力)
Zoom效果实现需要使用(鼠标滚动,拉近拉远)
Camera
SpringArm
DefaultSceneRoot
SpawnOverlay
工作原理
1、在CreatBuildOverlay函数中,代码添加静态网格组件,并保存到变量SpawnOverlay
2、UpdateBuildAsset中,根据重叠情况,更新材质参数集,MPC_Cropout
3、因为材质M_Placeable与MPC_Cropout有绑定,所以此时所有使用材质的模型自动更新(包括SpawnOverlay指向的模型)
NS_Path
农民到鼠标位置的路径特效
Movement
ZoomCurve-Curve Float
ZoomValue-Float
Selected:Actor
Villager模式,被选中的农民对象。
InputType:EInput Type
未知、键鼠、手柄、触碰
Spawn:BP Interactable
BuildMode产生的临时建筑对象,如果确认建造,则保留,否则会被销毁
StepRotation:Float
Can Drop:Boolean
在进行建造时,建筑是否可以放下(即没有和其它建筑或资源重叠)
Post Process Settings:Post Process Settings
Target:Object
未使用
Aperture(F-stop)-Float
未使用
后期特效相关
Sensor Width (Mm)-Float
未使用
后期特效相关
Focal Distance-Float
未使用
后期特效相关
TH_Hover:Timer Handle
未使用
HoverActor-Actor
碰撞到Collision组件的都所有对象中, 最近的对象
TargetHandle-Vector
触屏模式下,点击开始时,击中的地面坐标位置
Zoom-Boolean
ZoomTimeCheck-Float
Target Zoom-Vector 2D
ZoomDirection-Float
Stored Move-Vector
ZoomHandle-Timer Handle
TrackHandle-Timer Handle
Limit-Float
UIHUD-Ul Layer Game
Focus length-Float
BuildMod-Object
Zoom Compare-Float
DragAxis-Vector 2D
Edge Move Distance-Float
Target Spawn Class-BP Interactable
MID_Placeable-Material Instance Dynamic
Path Points-Vector
Block Drag-Boolean
Move Spawn-Boolean
Resource Cost-EResource Type
VillagerTarget-Actor
Hover Actor-Actor
触发Collision组件重叠事件的对象,可以理解为,鼠标鼠标左键按下后,持续划过的对象
函数
Movement
Input Switch
根据输入的Input类型,设置Cursor(光圈模型)与Collision的显示隐藏
根据输入的参数进行判断,如果是手柄,则控制Collision移动到玩家上方10个单位处
显示游标(自定义鼠标?)
如果输入参数是键鼠
显示游标
如果输入参数是触屏
控制Collision移动到玩家下方500个单位处(即不需要碰撞器)
Update Cursor Position
更新Cursor(光圈模型)位置,并且计算Cursor呼吸动画(基于Sin函数)
TrackMove
在农民选中的情况下,计算鼠标当前位置到鼠标按下开始位置的向量(这中间有一些特殊偏移情况,所以计算还是比较难以理解)
保存到StoreMove中
Update Zoom
鼠标滚轮控制Zoom效果
1、SpringArm控制旋转
2、FloatingPawnMovement控制移动速度
3、Camera控制FOV
Move Tracking(核心)
屏幕移动限制(限制屏幕大约在9000距离(矩形)单位内移动,越往外移越慢)
鼠标推动屏幕移动(通过EdgeMove函数)
实时更新Collision位置
更新Cursor位置(光圈模型)
BuildMode
Update Build Asset
建造模式下执行,根据鼠标位置,以及环境,更新建筑状态
Corners in Nav
返回Spawn对象是否在陆地上
从四个角发出4条射线检测是否碰撞地面
Create Build Overlay
创建包围建筑的绿色的矩形特效框,如果建筑无法正常摆放,特效框显示红色
Destroy Spawn
销毁Spawn对象
Rotate Spawn
Spawn对象Z轴旋转90
Overlap Check
返回Collision组件碰撞到的Interactable对象是否包括Spawn变量对象(Buildmode模式创建的临时建筑)
没有用过
Remove Resources
从资源(木材、石块等)中扣除消耗,扣完后,如果资源足够再次建造,则保持建筑模式,否则退出,并关闭UI
Spawn Build Target
如果变量”CanDrop“为真,则生成一个新的建筑,更新新建的建筑状态,执行Remove Resources扣除资源,缓存所有Interactable,以便存档,执行UpdateBuildAsset,更新建筑模式的状态
VillagerMode
Update Path
计算村民到鼠标位置的路径,将路径数组配置到特效“NSPath”的参数“TargetPath”中,这样就会实时显示村民到鼠标的路径。
Villager Select
选中村民,将其保持到变量Selected中
添加特效组件,保存到变量”NSPath“
设置每秒100次,执行函数UpdatePath,无限循环
Villager Release
取消函数“UpdatePath”的执行
销毁组件“NSPath”
置空“Selected”
Dof
设置后期效果的聚焦距离与SpringArm组件的臂长一致
Closest Hover Check
保证HoverActor中保存的是,Collision组件碰撞到的所有对象中,距离Collision最近的对象。一旦碰撞不到任何对象,HoverActor置空,并停止执行此函数。
每秒执行100次检查
Get Player Controller
PositionCheck
记录触屏时,手指点击的地面世界坐标,并将组件Collision移动到这个位置
仅适配触屏
宏
Stepped Loc & Rot
位置与旋转分步,位置200个距离为一步,旋转90度为1步
Nav Mesh Bound Check
检查Spawnable对象的4个角是否都在导航网格有效区域内,并返回4个角的检测结果
Project Mouse/Touch1 To Ground Plane
返回鼠标(触碰)位置、屏幕射线到地面碰撞点、输入类型(手柄、键鼠、触屏、未知)
Cursor dist from viewport center
输入鼠标到屏幕中心的距离,返回死区屏蔽后的,玩家移动方向(死区是屏幕宽高各减50单位的矩形,结果将用于鼠标拖动屏幕移动)
Edge Move
将Cursor dist from viewport center的结果转换为玩家坐标系的方向(结果用于鼠标在屏幕边缘推动屏幕移动)
Single Touch Check
是否为单指触屏
Villager Overlap Check
检查触屏时,手指是否点中农民
事件
Event Begin Build
根据输入的参数,创建建筑,将其放置到地面上(此时处于放置模式下,接下来等待玩家确认,是否完全消耗资源固定建筑)
Event Possessed
Player被玩家控制事件
绑定PlayerController的事件分发Key Switch到Input Switch
Event BeginPlay
UpdateZoom,更新视野
设置1s执行60次MoveTraking函数
加载按键输入BaseInput与VillagerMode
Event ActorBeginOverlap
EnhancedInputAction IA_Build_Move
鼠标左键按下
鼠标按下时(持续),调用UpdateBuildAsset函数
鼠标松开时,将建筑位置重新调整为200距离为单位的步进点
EnhancedInputAction IA_Villager
鼠标左键按下
开始
如果触屏,则调用PositionCheck函数记录点击位置到TargetHandle
设置碰撞器位置为点击位置(触屏模式下,碰撞器一直处于地面-500的位置,直到PositionCheck函数,才回到地面上)。但其它键鼠、手柄模式下,碰撞器一直处于地面上。
检测是否点击到农民(VillagerOverlapCheck函数)
如果点击到农民,调用VillagerSelect选中
加载DragMove的输入监测
松开
取消DragMove模式
如果有选中农民,则尝试调用农民的Action函数,触发农民的工作
是否选中的农民
EnhancedInputAction IA_Move
w、s、a、d的按键按下(持续)
玩家前后左右移动
EnhancedInputAction IA_Spin
Q、E按键按下(持续)
玩家Z轴旋转
EnhancedInputAction IA_Zoom
鼠标滚轮滚动
调用UpdateZoom函数,控制视角高低
调用Dof函数,更新聚焦距离
EnhancedInputAction IA_DragMove
鼠标左键按下(持续)(IA_Villager触发后,才能触发这个)
调用TrackMove函数,保存鼠标移动方向
特殊说明:IA_Build_Move与IA_Villager互相排斥,不会同时存在,并且IA_DragMove属于IA_Villager的后续步骤,所以也与IA_Build_Move排斥
按键输入事件
实现接口
Switch Build Mode
根据输入参数,按键输入模式(MappingContext)在BuildMode与VallagerMode之间切换
Begin Build
说明
BPF_Shared
Convert To Stepped Pos
以200为单位,对输入的二维坐标进行取整
BPI_Player
函数
BeginBuild
Switch Build Mode
Add Ul
Remove Current Ul Layer
接口
Save文件
BP_SaveGM
变量
Seed-随机流送
Resources-E Resource Type
资源数量保存
Interactables-ST Save Interact
交互?
Villagers-ST Villager
村民的位置以及任务
Play Time-浮点
运行时长
存档时,使用的数据,仅作为数据结构
BPI_GI
Retrieve Save Data
Check Save Bool
Get Seed
Get All Interactables
Get Save
Set Save Data
Load Level
说明:存档相关函数的接口
ST_SaveInteract
Location:变换
Type-BP Interactable
Health:浮点
Tag:命名
说明:存档使用的数据结构,存储关于交互的信息
ST_Villager
Location:向量
Task:命名
说明:存档使用的数据结构,存储关于村民的信息
Interactable
Building类别
BP_BuildingBase
函数
1: Spawn In Build Mode
设置进度值,并添加标签“Build”,然后更新模型
3: Construction Complete
删除标签“Build”
然后更新所有的Interactable对象到存档缓存中
通过函数Update All Interactables
Build
ProgressConstruct
更新进度数值,判断建筑是否完成
如果完成,调用3: Construction Complete
如果没有完成,根据进度数值,更新显示的模型
最后更新所有的Interactable对象到存档缓存中
通过函数Update All Interactables
Interact
调用ProgressConstruct,传入参数0.4
变量
CurrentStage
BuildDifficulty
数字越大,建筑进度越慢
BPC_EndGame
BPC_House
Spawn Villagers
生成两个新村民
构造函数
BPC_TownCenter
BeginPlay
将玩家视角定位到这里
构造函数
将“All Resources”添加到标签
BP_Interactable
自定义事件
Play Wobble
工人与建筑互动,建筑摇摆,最明显的是树木与石材
End Wobble
工人如果被强制离开,则立即停止摇摆
BeginPlay
1、如果开启Enable Ground Blend,则将建筑位置,写入RT_Draw(目的是在方便地图上开垦地面之间的融合)(开垦地面与地图原始地面有明显区别)
2、如果生成位置,存在另一个BP_Interactable,则销毁自己
函数
Interact
交互
Placement Mode
进入建筑放置模式
Set Progressions State
根据输入的进度值,查找对应的模型,将当前显示模型替换为正确表示进度的模型
变量
BoundGap
碰撞盒子自动生成时,额外增加的大小
Mesh List
建筑不同状态的模型集合,比如:初始、中间1、中间2、最终
Progression State
建造进度,浮点型
公共
Require Build
当前建筑是否需要建造
公共
树、灌木等在游戏中,可以通过建造产生,但不需要工人进行制作,而是立马完成
进度相关
RT_Draw
存放关卡所有建筑位置与大小信息的2d图片
OutlineDraw
Ground Blend的大小,建筑占地面积越大,这个数值就要越大
Enable Ground Blend
开启地面融合(比如:默认地面为绿色,开启融合后,会有一块黄色地面在建筑脚下,替换原始地面)
Ground Blend相关
构造函数
初始化碰撞器大小
宏
Transform To Texture
根据物体的位置以及碰撞盒大小,计算其在画布(用于生成杂草的画布)上的位置以及大小
Extra类别
DT_Buidables
建筑设定数据表格
E_ResourceType
石头、木头、食物
ST_Resource
Resources类别
说明:可采集资源相关蓝图
BP_Resource
变量
Resource Type
资源类型:食物、石头、木材
Resource Amount
总数量
Collection Time
单次收集需要的时间
CollectionValue
单次收集数量
资源相关
Use Random Mesh
是否使用随机模型,从MeshList中获取
构造函数
将Resource Type添加到标签中
Use Random Mesh如果开启,添加随机模型
函数
Death
销毁自己
Interact
调用父类Interact
返回变量Collection Time
自定义事件
Scale UP
来自接口BPI Island Plugin
隐藏模型,再通过Timeline,将模型从小到大进行渐变动画显示
接口
BPI Resource
BPI Island Plugin
BP_BaseCrop
构造函数
将“Farming”、“Ready”添加到标签
函数
SetReady
1、如果当前进度Progression State表示最后一个状态,则设置标签为Harvest,否则设置为Ready
2、调用GI的Update All Interactables函数
3、调用PopFarmPlot事件
模型缩放在1s内,从1-1.5-0-0.8-1.2-1
SetProgressionsState
调用父对象SetProgressionsState
调用SetReady
Switch Stage
如果当前进度值为0,则调用SetReady
否则等待CoolDown时间后,调用SetReady
FarmingProgress
1、删除最后一个标签
2、进度值+1
3、3s后调用SwitchStage
Interact
基础父对象同名函数
调用FarmingProgress
变量
CoolDown
SetReady的冷却时间,默认3s
BP_Crop_Corn
BP_Crop_Lettuce
BP_Crop_Pumpkin
BP_Crop_Wheat
BP_Shrub
BP_Stone
BP_Tree
Villagers
BP_Villager
变量
Target Ref:Actor
工作对象,比如树木、石头等,这些对象上的标签都能代表某个工作
New Job:名字
工作名字,与表格对应
Active Behavior:行为树
Work Anim:蒙太奇
工作动画,从表格中读取
Target Tool:网格体
手中的工具
工作工具,从表格中读取
Job Profile
ResourcesHeld
农民持有的资源
Quantity
资源的数量
函数
Eat
消耗食物
Stop Job
开始默认动画,控制行为树停止移动
Reset Job State
停止工作、取下帽子,抛弃工具
Hair Pick
戴上随机的帽子
RemoveResource(接口)
从农民身上删除资源,并返回资源值
PlayDeliverAnim(接口)
播放放下动画
自定义事件
PlayVillagerAnim
播放指定的蒙太奇动画
ChangeJob(接口)(核心)
加载job名字对应的表格数据
根据表格数据,进行工作切换
激活表格数据中的行为树
播放表格数据中的动画
戴上表格数据中的帽子
拿上表格数据中的工具
Begin Play
初始化:24s吃一次食物,戴帽子,在碰撞器上添加z轴偏移(应该是为了适配不同高度的角色)
Return to Idle
进入默认状态
Action(接口)
尝试根据传入的Actor上的标签,获得对应的工作(玩家指定农民目标时,就是调用了这个事件)
PlayWorkAnim(接口)
执行工作动画,并拿上对应道具,一般由行为树控制
AddResource(接口)
添加资源到农民身上,以便拿回总部
ReturnToDefaultBT(接口)
同Return To Idle
AI类别
Blackboards类别
BB_Base
BB_CollectResource
BB_Construction
BB_Idle
EQS类别
EQ_CollectionTarget
EQ_TownCenter
EQ_TownHall
EQC_CollectionTarget
EQC_TargetTownHall
Tasks类别
BTT_DefaultBT
BTT_DeliverRessource
BTT_FindBounds
BTT_FindNearestOfClass
BTT_InitialCollectResource
BTT_InitialFarmingTarget
BTT_PlayNiagara
BTT_ProgressConstruction
BTT_ProgressFarmingSeq
BTT_StuckRecover
BTT_TransferResource
BTT_Work
BT_Build
BT_CollectResource
BT_Farming
BT_Idle
BPI_Villager
DT_Jobs
ST_Job
Plugin
IslandGenerator
BP_IsLandGen
BP_Spawner
变量
SpawnTypes:STSpawnData
实例化的蓝图对象以及参数配置,比如数量(引用蓝图类型)
本项目中主要是植物
SpawnInstances:STSpawnInstance
实例化的静态网格对象以及参数配置
本项目中只有海里的海草对象
NavData
导航网格数据
实例化植物时,需要判断实例化的位置是否可行,比如没有建筑
AutoSpawn
勾选后,运行开始自动生成
函数
事件
AsyncLoadClass
将SpawnTypes对象加入内存,以便之后直接复制实例化
异步执行
FinishedSpawning
通知GameInstance以及GameMode,实际上什么都没做
BP_IconBaker