<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-25cebea3f9.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<p><em>UE小白,有错误的地方请指出。</em><br> 本文使用<a href="https://so.csdn.net/so/search?q=UE5&spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{"spm":"1001.2101.3001.7020","dest":"https://so.csdn.net/so/search?q=UE5&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"UE5\"}"}" data-tit="UE5" data-pretit="ue5">UE5</a>,如在UE4中使用可能需调整某些API</p>
一、获取镜头控制器,并开启点击事件
APlayerController* playerController;
void AMeshChangeController::Item()
{
playerController = FAITestHelpers::GetWorld()->GetFirstPlayerController();
playerController->bEnableClickEvents = true;
playerController->SetShowMouseCursor(true);
playerController->EnableInput(playerController);
}
void AMeshChangeController::BeginPlay()
{
Super::BeginPlay();
Item();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
二、鼠标点击发射射线
在Tick中调用射线发射逻辑
UE中API看起来没有分鼠标抬起和鼠标按下API,如有大佬知道可以评论一下。
void AMeshChangeController::Tick(float DeltaTime) { Super::Tick(DeltaTime); TestRay(); } void AMeshChangeController:: TestRay() { //鼠标左键触发 if(playerController->IsInputKeyDown(EKeys::LeftMouseButton)) { FHitResult OutHit;//用于接收命中的Actor FVector Start; //射线起点 FVector End ; //射线终点 FVector Dir; //鼠标点击的方向 playerController->DeprojectMousePositionToWorld(Start, Dir);
End <span class="token operator">=</span> Start + <span class="token punctuation">(</span>Dir * <span class="token number">100000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> DrawDebugLine<span class="token punctuation">(</span>GetWorld<span class="token punctuation">(</span><span class="token punctuation">)</span>, Start, End, FColor::Green, false, <span class="token number">100</span>, <span class="token number">0</span>, <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>//绘制射线 bool isFinsh <span class="token operator">=</span> GetWorld<span class="token punctuation">(</span><span class="token punctuation">)</span>-<span class="token operator">></span>LineTraceSingleByObjectType<span class="token punctuation">(</span>OutHit, Start, End, ECC_WorldStatic<span class="token punctuation">)</span><span class="token punctuation">;</span>//进行射线检测 <span class="token keyword">if</span> <span class="token punctuation">(</span>Cast<span class="token operator"><</span>AActor<span class="token operator">></span><span class="token punctuation">(</span>OutHit.GetActor<span class="token punctuation">(</span><span class="token punctuation">))</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> AActor* gameObject <span class="token operator">=</span> OutHit.GetActor<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> FString s <span class="token operator">=</span> gameObject-<span class="token operator">></span>GetActorNameOrLabel<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> UE_LOG<span class="token punctuation">(</span>LogTemp, Warning, TEXT<span class="token punctuation">(</span><span class="token string">"被点击的物体,%s"</span><span class="token punctuation">)</span>, *s<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31