栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

UE4C++ 组件调用射线检测

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UE4C++ 组件调用射线检测

.h

	UFUNCTION()
	void StartLineTrace();

	UPROPERTY()
	AActor* RootActor;
};

.cpp

// Called when the game starts
void ULineTraceComponent::BeginPlay()
{
	Super::BeginPlay();

	// 绑定射线检测事件
	if (RootActor==nullptr)
	{
		RootActor = GetAttachmentRootActor();
	}

	if (RootActor!=nullptr)
	{
		if (RootActor->InputComponent==nullptr)
		{
			RootActor->EnableInput(UGameplayStatics::GetPlayerController(GWorld,0));
		}
		UE_LOG(LogTemp, Warning, TEXT("bind StartTraceLine successfully"));
		RootActor->InputComponent->BindAction("LeftMouse", EInputEvent::IE_Pressed, this, &ULineTraceComponent::StartLineTrace);
	}

	// 显示鼠标
	UGameplayStatics::GetPlayerController(GWorld, 0)->bShowMouseCursor = true;
}


void ULineTraceComponent::StartLineTrace()
{
	UKismetSystemLibrary::PrintString(GWorld, "Click Left Mouse");

	// 碰撞参数
	FCollisionQueryParams CollisonQueryParams(TEXT("QueryParams"), true, NULL);
	CollisonQueryParams.bTraceComplex = true;
	CollisonQueryParams.bReturnPhysicalMaterial = false;
	CollisonQueryParams.AddIgnoredActor(RootActor);

	// 获取PlayerController
	APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GWorld, 0);
	
	// 得到摄像机的位置和旋转
	FVector CamPos;
	FRotator CamRot;
	PlayerController->GetPlayerViewPoint(CamPos, CamRot);

	//获取鼠标的位置和方向
	FVector MousePos, MouseDir;
	PlayerController->DeprojectMousePositionToWorld(MousePos, MouseDir);

	//输出摄像机,鼠标位置信息
	//UKismetSystemLibrary::PrintString(GWorld, FString::Printf(TEXT("CamPos:%snCamRot:%snMousePos:%snMouseDir:%s"), *CamPos.ToString(), *CamRot.ToString(),*MousePos.ToString(),*MouseDir.ToString()));

	// 起始点和检测结果
	// 起始点:摄像机坐标
	// 结束点:摄像机到鼠标的射线
	FVector LineStart = CamPos;
	FVector LineEnd = CamPos + MouseDir * 1000;
	FHitResult HitResult;

	//射线检测
	GetWorld()->LineTraceSingleByChannel(HitResult, LineStart, LineEnd, ECollisionChannel::ECC_Visibility, CollisonQueryParams);
	if (HitResult.GetActor())
	{
		UE_LOG(LogTemp, Warning, TEXT("hit %s"), *HitResult.GetActor()->GetName());
	}

	//射线绘制
	UKismetSystemLibrary::DrawDebugLine(GetWorld(), LineStart, LineEnd, FLinearColor::Red, 10.f, 10.f);

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/665696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号