• UE开发小计:AlignActorToMouse


    C++版

    // Fill out your copyright notice in the Description page of Project Settings.
    
    
    #include "HitWhereverYouWant.h"
    
    #include "KismetTraceUtils.h"
    #include "Kismet/GameplayStatics.h"
    
    void UHitWhereverYouWant::AlignActorToMouse(AActor* ActorToAlign)
    {
        const auto World = GWorld->GetGameInstance()->GetWorld();
        const APlayerController* PlayerController = UGameplayStatics::GetPlayerController(World, 0);
        if (PlayerController && ActorToAlign && World)
        {
            // 获取鼠标的屏幕坐标
            float MouseX, MouseY;
            if (PlayerController->GetMousePosition(MouseX, MouseY))
            {
                // 将屏幕坐标转换为世界空间中的一条射线(起点和方向)
                FVector WorldLocation, WorldDirection;
                if (PlayerController->DeprojectScreenPositionToWorld(MouseX, MouseY, WorldLocation, WorldDirection))
                {
                    // 执行射线投射
                    FHitResult HitResult;
                    FVector StartPoint = WorldLocation;
                    FVector EndPoint = StartPoint + WorldDirection * 10000.0f; // 射线长度可以根据需要调整
                    FCollisionQueryParams CollisionParams;
                    CollisionParams.AddIgnoredActor(ActorToAlign); // 忽略射线投射目标Actor本身
    
                    bool bHit = World->LineTraceSingleByChannel(
                        HitResult,
                        StartPoint,
                        EndPoint,
                        ECC_Visibility, // 或者你需要的其他碰撞通道
                        CollisionParams
                    );
    
                    if (bHit)
                    {
                        // 获取ActorToAlign的位置
                        FVector ActorLocation = ActorToAlign->GetActorLocation();
    
                        // 计算从ActorToAlign指向命中点的方向
                        FVector ToHitDirection = (HitResult.ImpactPoint - ActorLocation).GetSafeNormal();
    
                        // 计算新的旋转,使得ActorToAlign的Z轴指向命中点
                        FRotator NewRotation = FRotationMatrix::MakeFromZ(ToHitDirection).Rotator();
    
                        // 应用新的旋转到ActorToAlign
                        ActorToAlign->SetActorRotation(NewRotation);
                    }
                }
            }
        }
    }
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    蓝图版

    本文由博客一文多发平台 OpenWrite 发布!

  • 相关阅读:
    智慧幼儿园信息管理系统的设计与实现
    扫描点读笔搭载北京君正X2000多核异构跨界处理器的案例
    同花顺_代码解析_技术指标_EJK
    金字塔的思维---先总后分与结论先行
    Docker安装RocketMQ
    2.2 进程调度实验
    docker清理Overlay2占用磁盘空间
    mysql中的全文索引
    C语言趣味代码(三)
    如何制作 PDF 文件
  • 原文地址:https://blog.csdn.net/zx1091515459/article/details/134560298