UE 运行时编辑效果。Gizom使用增强输入改写

一.获得官方的插件,进行理解

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内。

效果如图

相关推荐
历程里程碑几秒前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
李日灐5 分钟前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
汉克老师11 分钟前
GESP2025年6月认证C++二级( 第一部分选择题(1-8))
c++·循环结构·表达式·分支结构·gesp二级·gesp2级
rainbow688916 分钟前
C++高性能框架Drogon:后端开发新标杆
c++
Q741_14717 分钟前
C++ 优先级队列 大小堆 模拟 力扣 703. 数据流中的第 K 大元素 每日一题
c++·算法·leetcode·优先级队列·
Yu_Lijing44 分钟前
网络复习篇——网络基础(一)
网络·c++·笔记
Bella的成长园地1 小时前
为什么c++中的条件变量的 wait() 函数需要配合while 循环或谓词?
c++·面试
charlee441 小时前
为什么现代 C++ 库都用 PIMPL?一场关于封装、依赖与安全的演进
c++·智能指针·raii·pimpl·编译防火墙·封装设计
MSTcheng.1 小时前
CANN ops-math算子的跨平台适配与硬件抽象层设计
c++·mfc
code monkey.1 小时前
【Linux之旅】Linux 进程间通信(IPC)全解析:从管道到共享内存,吃透进程协作核心
linux·c++·ipc