void ACEController::Tick(float DeltaSeconds) { // Отслеживаем хит под мышкой FHitResult Hit; GetHitResultUnderCursorByChannel(ETraceTypeQuery::TraceTypeQuery_MAX, true, Hit); // Если какой то модуль выделен - то снимаем выделение (SetRenderCustomDepth) if (SelectedActorPtr) { TArray<UStaticMeshComponent*> comps; SelectedActorPtr->GetComponents(comps); for (auto comp : comps){ comp->SetRenderCustomDepth(false); } SelectedActorPtr = NULL; } // Если включен режим постановки модуля (установлен курсор) if (Cursor) { bCursorValid = false; Cursor->SetActorHiddenInGame(true); // И мы наведены мышкой на один из модулей которые ловят хит if (Hit.Component != NULL) { FVector loc = Hit.Component->GetComponentLocation(); // Находим вариант установки модуля CursorVariant = Cursor->FindNextValidVariant(CursorVariant, loc, Hit.Location); // Если вариант не найден if (CursorVariant == -1) { // Выключаем выбор и убираем модель курсора bCursorValid = false; CursorVariant = 0; Cursor->SetActorHiddenInGame(true); } else { // Включаем выбор и отображаем модель курсора bCursorValid = true; Cursor->SetActorHiddenInGame(false); } } } else { // Режим удаления // Если мышка на модуле ловящем хит if (Hit.Actor != NULL) { // Выделяем его (SetRenderCustomDepth) SelectedActorPtr = Hit.Actor.Get(false); TArray<UStaticMeshComponent*> comps; SelectedActorPtr->GetComponents(comps); for (auto comp : comps){ comp->SetRenderCustomDepth(true); } } } }
AMapTile * AMapPlayerController::GetTileUnderCursor() { AMapTile * tile = NULL; FHitResult TraceResult(ForceInit); GetHitResultUnderCursorByChannel(UEngineTypes::ConvertToTraceType(COLLISION_MAP_TILE), false, TraceResult); if (TraceResult.GetActor() != NULL) { if (Cast<AMapTile>(TraceResult.GetActor())) { tile = Cast<AMapTile>(TraceResult.GetActor()); } if (Cast<AMapBasicEntity>(TraceResult.GetActor())) { tile = Cast<AMapBasicEntity>(TraceResult.GetActor())->AssignedTiles[0]; } } return tile; }
TArray<AMapBasicEntity*> AMapPlayerController::GetEntitiesInTrace() { TArray<AMapBasicEntity*> R; FHitResult TraceResult(ForceInit); GetHitResultUnderCursorByChannel(UEngineTypes::ConvertToTraceType(ECC_Pawn), false, TraceResult); if (TraceResult.GetActor() != nullptr) { if (Cast<AMapBasicEntity>(TraceResult.GetActor()) != NULL) { R.Add(Cast<AMapBasicEntity>(TraceResult.GetActor())); } if (Cast<AMapTile>(TraceResult.GetActor())) { R.Append(Cast<AMapTile>(TraceResult.GetActor())->AssignedEntity); } } return R; }