96SEO 2026-02-20 02:58 0
负责组件的生命周期管理、激活/停用、与Actor的绑定等USceneCompoent

- 具有变换并支持附件(组件依附),但没有渲染或碰撞功能。
UPrimitiveCompoent
具有渲染和物理信息,可以实现OverlapUMovementComponent
具备基本移动功能和接口UProjectileMovementComponent
路径寻找和导航功能,可实现代理AI移动UPawnMovementComponent
提供输入累积,Owner和移动相关接口UCharacterMovementComponent
提供了丰富的角色移动功能UFloatingPawnMovement
id="基础移动组件泛用型">基础移动组件(泛用型):
USceneComponent+FTransformComponentToWorld
//关键能力-----------------------------------MoveComponent()
//核心移动入口,负责位置/旋转更新
//虚函数分发UpdateComponentToWorldWithParent()
//更新
+ComponentToWorldUMovementComponent+USceneComponent
UpdatedComponent
//速度,表示角色当前的移动速度和方向。
----------------------------------------------SafeMoveUpdatedComponent()
//安全移动更新的组件,尝试移动组件并处理碰撞和阻挡,确保不会进入不可通过的区域。
MoveUpdatedComponent()
//移动更新的组件,直接移动组件到目标位置,不处理碰撞。
MoveUpdatedComponentImpl()
//虚函数分发GetPenetrationAdjustment()
//计算移动调整,尝试摆脱失败移动带来的渗透/基于FHitResult,返回能解决穿透的Delta增量ResolvePenetration()
//移動失敗后,多次退回尝试移出物体的穿透范围。
遵循平面约束HandleImpact()
//获取最大速度,返回角色在当前状态下的最大移动速度。
UpdateComponentVelocity()
//获取物理体积,返回角色当前所在的物理体积,如水、空气等。
UNavMovementComponent+FNavAgentProperties
NavAgentProps
//导航代理属性,包含角色在导航网格中的相关信息,如大小、能否通过特定区域等。
+FMovementProperties
MovementState
基于GamePlay视角下的底层核心移动函数(此函数为不同移动组件衍生中包裹的核心):
USceneComponent::MoveComponent()virtualMoveComponentImpl()
//虚函数转发ConditionalUpdateComponentToWorld()UpdateComponentToWorld()UpdateComponentToWorldWithParent()更新变量:+ComponentToWorld
InternalSetWorldLocationAndRotationUpdateComponentToWorldWithParent()更新变量:+ComponentToWorld
移动组件处理移动的核心调用链(主要用于处理不同的物理运动状态下的移动)
UMovementComponent::SafeMoveUpdatedComponent()UMovementComponent::MoveUpdatedComponent()UMovementComponent::MoveUpdatedComponentImpl()+UpdatedComponent->
USceneComponent::MoveComponent();
tips:移动组件必须控制一个能够存在于世界上的组件。
移动组件属于UActorCompoent的子类。
本身不具备坐标,其主要功能是用于控制成员变量USceneComponent
UMovementComponent::SafeMoveUpdatedComponent(constFVector&
USceneComponent::MoveComponent(constFVector&
ETeleportType::None);
id="衍生移动组件角色特化型">衍生移动组件(角色特化型)
//角色特化型移动组件一般用于包含“物理”特性的可操控主体。
例如Pawn,Character
id="pawn--pawnmovementcomponent">Pawn
&&
PawnMovementComponent的设计上用于为
Pawn
提供更新移动的能力(接口/辅助),主要目的还是为了子组件铺垫所提供一些Pawn其关联的移动的基本功能。
提供了一种通用的方式来累积和读取方向输入(并不实现具体的移动行为):
UPawnMovementComponent+TObjectPtr<classAPawn>
PawnOwner;-----------------------------------AddInputVector()
//接受输入方向
自身不做处理,内部转发回Owner处理ConsumeInputVector()
//消耗输入方向
//正在处理输入+bUseControllerRotationPitch
//使用控制器旋转+bUseControllerRotationRoll
//使用控制器旋转+bUseControllerRotationYaw
//使用控制器旋转----------------------------------------SetupPlayerInputComponent()
//设置玩家输入组件CreatePlayerInputComponent()//创建玩家输入组件AddMovementInput()//内部最终调用为
APawn::Internal_AddMovementInput();//内部包含拥有PawnMovementComponent的转发,但是实际最终调用相同(转发回溯)ConsumeMovementInputVector()//内部最终调用为APawn::Internal_ConsumeMovementInputVector();//内部包含拥有PawnMovementComponent的转发,但是实际最终调用相同(转发回溯)AddControllerPitchInput()//内部转发至AController::AddPitchInput();AddControllerYawInput()//内部转发至AController::AddYawInput();AddControllerRollInput()//内部转发至AController::AddRollInput();GetLastMovementInputVector()//返回LastControlInputVectorGetPendingMovementInputVector()//返回ControlInputVectorFaceRotation()//将Pawn的旋转更新为指定的旋转,假定为ControlRotation,遵循控制器旋转设置GetViewRotation()//
返回视图旋转
通常是控制器旋转UpdateNavAgent()//更新导航代理,确保导航代理属性与角色状态同步。
MoveIgnoreActorAdd()//添加忽略的移动演员,将指定的演员添加到移动忽略列表中,避免与之碰撞GetMovementComponent()//此函数为了通用性用了消耗量比较大的查找类去搜寻,可以进行重载变得更快捷
AddMovementInput()用于收集和存储移动输入。主要用于改变Pawn中的ControlInputVector以及LastControlInputVector。
本身不会直接导致Pawn移动,而是将输入量存储起来供移动组件在每帧更新时处理。
ControlInputVector,LastControlInputVector保存了玩家输入的移动方向和大小,这些输入量通常在对应的移动组件中进行处理,不会应用到Pawn的移动上。
UPawnMovementComponent组件。需要自行添加
UPawnMovementComponent组件并不实现具体的移动行为,其组件含义为提供输入累积,OwnerControlInputVector->LastControlInputVector(目的是防止在帧之间控制输入的累积)Pawn中不实现具体的移动逻辑,但是存在已经实现的旋转逻辑
APlayerController::TickActorPlayerTickUpdateRotationAPawn::FaceRotation如果启用以下设置中任意一项+bUseControllerRotationPitch
//使用控制器旋转+bUseControllerRotationRoll
//使用控制器旋转+bUseControllerRotationYaw
//使用控制器旋转在APawn::FaceRotation中Pawn的旋转会被启用的对应控制器旋转控制(直接SetActorRotation())
如果不是自由相机,尽可能不要使用这个方式,尤其是在Character这种精细化的角色子类。
id="defaultpawnpawn衍生模板">DefaultPawn(Pawn衍生/模板)
Character
以DefaultPawn举例,由输入导致的最终更新位于TickComponent中SafeMoveUpdatedComponent();
DefaultPawn作为基本实现应用类的简易角色类,是其余角色类的基本模板
UFloatingPawnMovement,//运动组件,提供速度,加速度限制,没有实现重力ApplyControlInputToVelocity()//负责将存储的输入量转换为加速度或速度。
这一步将输入量应用到Pawn的速度上,决定Pawn的移动方向和速度。
ADefaultPawn+UFloatingPawnMovement
MovementComponent
id="输入-移动旋转流程-1">输入-移动旋转流程
旋转由父类Pawn的FaceRotation提供,默认启用三项控制器旋转设置 UFloatingPawnMovement::TickComponent
ApplyControlInputToVelocity()消费输入转换为Velocity;Velocity转换为移动差量DeltaDelta用于驱动SafeMoveUpdatedComponent()实现实际的移动HandleImpact()和SlideAlongSurface()处理滑动以及物理阻挡UpdateComponentVelocity()更新组件速度
id="character-包含基础运动学的网络同步角色">Character
UCharacterMovementComponent+FVector
//质量,用于计算加速度以及受力+bEnableScopedMovementUpdates
//是否启动范围内更新优化性能+FNetworkPredictionData_Client_Character*
ClientPredictionData
//客户端角色移动预测数据+FNetworkPredictionData_Server_Character*
ServerPredictionData
//服务器角色移动预测数据--------------------------------------------------MoveAutonomous()
//处理自主移动,即在不受其他外力干扰的情况下,角色根据输入指令进行移动的逻辑。
MoveAlongFloor()
//在地面上移动的逻辑,确保角色沿着地面正常行走,并处理地形变化。
UpdateBasedRotation()
//随着底座的旋转更新控制器的视图旋转StartNewPhysics()
//启动新的物理处理周期,根据角色当前的移动模式和状态,调用相应的物理处理函数。
PhysWalking()
//处理角色在步行模式下的物理计算,包括地面摩擦力、重力等因素。
PhysNavWalking()
//处理角色在导航网格上步行的物理计算,通常用于AI角色的路径导航。
PhysFalling()
//处理角色在下落模式下的物理计算,包括重力加速度和落地检测。
PhysFlying()
//处理角色在飞行模式下的物理计算,包括飞行速度和方向控制。
PhysSwimming()
PhysCustom()
//处理自定义模式下的物理计算,允许开发者实现自定义的移动逻辑。
CallServerMove()
//在客户端上调用,向服务器发送移动请求,确保客户端和服务器上的角色位置同步。
ReplicateMoveToServer()
//复制移动数据到服务器,确保服务器上的角色位置和客户端的一致。
ClientUpdatePositionAfterServerUpdate()
//在服务器更新后,客户端更新角色位置,处理可能的位移校正。
SimulatedTick()
//在模拟角色(非本地控制的角色)上调用,用于处理模拟的移动和物理更新。
TickCharacterPose()
//每帧更新角色的姿态,确保角色动画和物理状态的同步
ACharacter+FBasedMovementInfoBasedMovement
//保存角色当前所站立的“基础”对象的信息,用于处理角色在移动平台上或其他移动基础上的相对位置和旋转。
+FBasedMovementInfo
//复制的基于移动的信息,用于网络同步,确保客户端和服务器上的基于移动状态一致。
+uint8
//复制的移动模式,用于网络同步,确保客户端和服务器上的移动模式一致。
+float
ReplicatedServerLastTransformUpdateTimeStamp
//复制的服务器最后变换更新时间戳,用于网络同步,记录服务器上最后一次变换更新的时间。
+TObjectPtr<UCharacterMovementComponent>
CharacterMovement+TObjectPtr<USkeletalMeshComponent>
Mesh+TObjectPtr<UCapsuleComponent>
CapsuleComponentFBasedMovementinfo
//保存有关角色所站立的“基础”对象的信息的结构。
+TObjectPtr<UPrimitiveComponent>
MovementBase
//指向角色所站立的基础对象的指针,通常是一个移动平台或其他物理对象+FName
BoneName
//基础对象上的骨骼名称,如果角色站立在一个骨骼网格的特定骨骼上,则记录该骨骼的名称。
+FVector_NetQuantize100
Location
//角色相对于基础对象的位置,使用网络量化格式确保高效同步。
+FRotator
Rotation
id="输入-移动旋转流程玩家">输入-移动旋转流程(玩家)
//以下是接受控制器输入状态的角色,也就是玩家角色的流程
角色移动逻辑:
AddControllerPitch/Yaw/RollInput
AddMovementInput
移动输入向量被转换为加速度向量,后续在各类动力学模式中被处理为速度进行移动
UCharacterMovementComponent::TickComponent()
InputVector
APawn::LastControlInputVector}
UCharacterMovementComponent::ControlledCharacterMove(InputVector,
DeltaTime)
ScaleInputAcceleration(ConstrainInputAcceleration(InputVector));
PerformMovement()
ComputeOrientToMovementRotation()
根据当前运动计算目标旋转,当使用bOrientRotationToMovement时,基于加速度计算旋转
![[6bbc850572a1f714064411937e50411e.png]]
id="performmovement">PerformMovement
处理绝大部分情况下的每帧运动,是CharacterMovementComponent的核心,其中包含范围更新移动代码块。
此代码块为PerformMovement的核心
处理流程如下
SCOPE_CYCLE_COUNTER(性能统计)HasValidData()前置有效性检查
bTeleportedSinceLastUpdate);
CurrentRootMotion.LastPreAdditiveVelocity开始范围移动更新(性能/一致性保障)
FScopedCapsuleMovementUpdate减少重复性碰撞检测ScopedMovementUpdate(UpdatedComponent,
bEnableScopedMovementUpdates);
MaybeUpdateBasedMovement(DeltaSeconds)
UpdateBasedMovement(DeltaSeconds)
UpdateBasedRotation(FinalRotation,PawnDeltaRotation.Rotator());
CurrentRootMotion.CleanUpInvalidRootMotion(DeltaSeconds,*CharacterOwner,
ApplyAccumulatedForces(DeltaSeconds):把外部施加到character
UpdateCharacterStateBeforeMovement(DeltaSeconds);移动前修正状态TryToLeaveNavWalking();HandlePendingLaunch()Character::LaunchCharacter()
被延迟执行时在此生效
ClearAccumulatedForces清除累计力
TickCharacterPose(),并转换动画CurrentRootMotion.PrepareRootMotion(...):准备合成/累积来自非动画来源的root
ConvertLocalRootMotionToWorld()
AnimRootMotionVelocityCalcAnimRootMotionVelocity()
VelocityConstrainAnimRootMotionVelocity()
HasOverrideVelocity,合成override
ensureMsgf(!Velocity.ContainsNaN()确保速度合法,避免灾难性崩溃
CharacterOwner->ClearJumpInput(DeltaSeconds);0;
StartNewPhysics(DeltaSeconds,0)
UpdateCharacterStateAfterMovement(DeltaSeconds);移动后修正状态PhysicsRotation(DeltaSeconds);MoveUpdatedComponent(FVector::ZeroVector,true)}
CurrentRootMotion.HasActiveRootMotionSources()
MoveUpdatedComponent(FVector::ZeroVector,true);
`LastUpdateRequestedVelocity RequestedVelocity
bHasRequestedVelocityfalse;
OnMovementUpdated(DeltaSeconds,OldLocation,
FScopedCapsuleMovementUpdate,让变换/碰撞状态最终生效。CallMovementUpdateDelegate(DeltaSeconds,OldLocation,
SaveBaseLocation()
MaybeSaveBaseLocation()(修复/优化相关行为)。UpdateComponentVelocity():把movement
NetDriver->CancelAdaptiveReplication(CharacterOwner)UpdatedComponent->GetComponentLocation()
NewRotation。UpdatedComponent->GetComponentQuat()
若
server
ServerLastTransformUpdateTimeStamp(有条件使用客户端时间戳)。LastUpdateLocation/Rotation/Velocity
在CharacterMovementComponent中处理旋转的是PhysicsRotation:其核心变量为DesiredRotation
由Orient
movement和bUseControllerDesiredRotation决定DesiredRotation计算方式
ComputeOrientToMovementRotation();//根据当前运动计算目标旋转,当使用bOrientRotationToMovement时,基于加速度计算旋转
UpdateBasedRotationBase(比如旋转的平台/载具/重力基座)发生旋转
Controller
因基座旋转产生的增量旋转(delta)
后被调用,允许移动组件修正最终的角色朝向或对控制器视角做额外处理。
PerformMovement
//前置有移动基座的判断,只有进入移动基座才会在此进入这个
关于添加推动力
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback