一.获得官方的插件,进行理解
1.核心使用左键点击后,发射射线启用这个函数。它生成小坐标,达成选中功能。
cpp
bool ATransformerPawn::MouseTraceByObjectTypes(float TraceDistance
, TArray<TEnumAsByte<ECollisionChannel>> CollisionChannels
, TArray<AActor*> IgnoredActors, bool bAppendToList)
{
FVector start, end;
bool bTraceSuccessful = false;
if (GetMouseStartEndPoints(TraceDistance, start, end))
{
bTraceSuccessful = TraceByObjectTypes(start, end, CollisionChannels
, IgnoredActors, bAppendToList);
if (!bTraceSuccessful && !bAppendToList)
ServerDeselectAll(false);
}
return bTraceSuccessful;
}
2.在选中后,再点击轴拖动可以。实现跟随鼠标做对应移动。
其实也是调用上一个函数,但是选中后会修改bTraceSuccessful的值。导致不一样的逻辑,但是这是正确的。
2.ClearDomin清空点击后的功能,避免一直跟随移动。一般用在鼠标松开后。
cpp
void ATransformerPawn::ClearDomain()
{
//Clear the Accumulated tranform when we stop Transforming
ResetDeltaTransform(AccumulatedDeltaTransform);
SetDomain(ETransformationDomain::TD_None);
}
二.对官方插件进行修改
1.添加增强输入的资源,用静态查找的方式。FClassFinder,FObjectFinder也可以动态查找。这里用的TObject智能指针,其实和一般的指针用法一样,带个模板。可以用一般指针给他赋值。
cpp
struct FConstructorStatics {
ConstructorHelpers::FObjectFinder<UInputMappingContext> TransformInputMappingContext;
ConstructorHelpers::FObjectFinder<UInputAction> MouseRotateAction;
ConstructorHelpers::FObjectFinder<UInputAction> MoveAction;
ConstructorHelpers::FObjectFinder<UInputAction> SelectAction;
ConstructorHelpers::FClassFinder<ATranslationGizmo> TranslationGizmo;
FConstructorStatics()
: TransformInputMappingContext(
TEXT("/Script/EnhancedInput.InputMappingContext'/RuntimeTransformer/TransformInput/IMC_Transform.IMC_Transform'")),
MouseRotateAction(TEXT("/Script/EnhancedInput.InputAction'/RuntimeTransformer/TransformInput/IA_RotateCam.IA_RotateCam'")),
MoveAction(TEXT("/Script/EnhancedInput.InputAction'/RuntimeTransformer/TransformInput/IA_MoveCam.IA_MoveCam'")),
SelectAction(TEXT("/Script/EnhancedInput.InputAction'/RuntimeTransformer/TransformInput/IA_Select.IA_Select'")),
TranslationGizmo(TEXT("/Script/Engine.Blueprint'/RuntimeTransformer/GizmoExamples/BP_TranslationGizmo_Example.BP_TranslationGizmo_Example_C'")){}
};
static FConstructorStatics ConstructorStatics;
TransformInputMappingContext =
(ConstructorStatics.TransformInputMappingContext.Object);
MouseRotateAction =
(ConstructorStatics.MouseRotateAction.Object);
MoveAction =
(ConstructorStatics.MoveAction.Object);
SelectAction =
(ConstructorStatics.SelectAction.Object);
TranslationGizmoClass =
ConstructorStatics.TranslationGizmo.Class; //
2.增强输入,修改。
具体可以看,这篇文章。把这个Pawn加上这些功能。
UE5 C++ 最简洁的万能案例,使用增强输入驱动移动旋转Pawn_ue 增强输出pawn移动-CSDN博客
.这里会有一些问题,增强输入对bool返回值比较敏感,很多时候导致编辑器时报错,但又不会完全崩溃。

5.增强输入,这里调用鼠标左键。调用上面的发射射线物体检测的函数。实现点击后的产生坐标
拿到蓝图的资源,并赋值到Pawn内。
效果如图
