Unity2D求承包 2024-06-25 19:30 采纳率: 40%
浏览 25

UE5如何实现漫游摄像机跟踪?

在使用UE5制作即时战略游戏时遇到一个问题。需要摄像机可以漫游移动,同时可随时切换摄像机跟踪某个单位移动。触发摄像机移动后解除跟踪。目前使用set view target with blend蓝图能够实现切换跟踪,切换之后,该单位的AI move会被打断。请问应该如何制作这个摄像机漫游和跟踪的功能才不影响单位的移动逻辑?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-25 19:30
    关注

    引自免费微信小程序:皆我百晓生

    要实现一个UE5中的摄像机漫游功能,并且可以跟踪并自动解除跟踪当前目标单位的AI移动,你需要创建一个新的蓝图组件来控制摄像机的行为。首先,确保已经安装了FbxMeshUObject类。

    1. 创建蓝图组件

    在编辑器中,打开Assets文件夹下的Blueprints目录,然后新建一个蓝图(例如命名为CameraMove)。右键点击CameraMove蓝图,在弹出菜单中选择Create New Blueprint Component。接下来,将CameraMove蓝图拖放到场景中。

    2. 设置追踪机制

    CameraMove蓝图中,为追踪对象设置一个OnMouseButtonDown事件监听器。当用户按下鼠标左键时,此事件被激活,表明玩家正在尝试跟踪一个单位。

    void CameraMove::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
    {
        // 获取鼠标坐标
        FVector2D MousePosition;
        if (MouseEvent.GetScreenSpacePosition(MousePosition))
        {
            // 计算相机位置到鼠标的距离
            float Distance = FVector2D(MyGeometry.BoundingSphere.Center - MousePosition).Size();
            
            // 如果鼠标位置与单位相对应的位置很近,表示可以进行跟踪
            if (Distance < UnitRadius)
            {
                SetViewTargetWithBlend(UnitGuid);
                bIsTrackingUnit = true;
            }
            else
            {
                bIsTrackingUnit = false;
            }
        }
    }
    

    3. 定义追踪单位的结构体

    为了方便管理,定义一个UnitInfo结构体,包含追踪的目标单位的唯一标识符、位置等信息。

    struct FUnitInfo
    {
        int32 UnitGuid; // 单位的GUID
        FVector Location; // 单位的位置
    };
    

    4. 实现自动解除跟踪

    CameraMove蓝图中添加一个名为SetViewTargetWithBlend的方法,用于自动解除跟踪。

    void CameraMove::SetViewTargetWithBlend(FGuid TargetGuid, float BlendTimeInSeconds)
    {
        // 获取目标单位的信息
        UWorld* World = GetWorld();
        if (World && !bIsTrackingUnit)
        {
            auto UnitActor = World->GetFirstPlayerController()->GetPawn();
            if (UnitActor)
            {
                FUnitInfo Info;
                Info.UnitGuid = UnitActor->GetUniqueNetId();
                Info.Location = UnitActor->GetActorLocation();
    
                // 检查是否是同一单位
                if (Info.UnitGuid == TargetGuid)
                {
                    UE_LOG(LogTemp, Warning, TEXT("Detected same unit"));
                    return;
                }
    
                // 更新目标单位信息
                TargetUnitGuid = TargetGuid;
                TargetUnitLocation = Info.Location;
    
                // 开始跟踪
                SetViewTarget(TargetGuid);
    
                // 设置过渡时间
                if (BlendTimeInSeconds > 0)
                {
                    FTimerHandle Handle;
                    FTimerDelegate Delegate = FTimerDelegate::CreateLambda([this]
                    {
                        SetViewTargetWithBlend(TargetGuid, 0.0f);
                    });
                    GetWorld()->GetTimerManager().SetTimer(Handle, Delegate, BlendTimeInSeconds, false);
                }
            }
        }
    }
    

    5. 初始化和释放

    确保在游戏开始时正确初始化CameraMove蓝图,并在游戏退出前正确释放它。

    // 在GameStart函数中初始化
    void GameStart()
    {
        if (!CameraMove) { return; }
        CameraMove->Initialize();
    }
    
    // 在GameEnd函数中释放
    void GameEnd()
    {
        if (CameraMove) { CameraMove->Release(); }
    }
    

    6. 测试与优化

    运行游戏并检查CameraMove蓝图的工作情况。根据测试结果调整追踪逻辑,可能需要进一步优化和调试。

    通过以上步骤,你应该能够在UE5中实现一个能跟踪并自动解除跟踪的摄像机。记得在实际应用中不断迭代和完善,以满足特定的游戏需求。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月25日

悬赏问题

  • ¥15 Kylin-Desktop-V10-GFB-Release-JICAI_02- 2207-Build14-ARM64.iso有没有这个版本的系统啊
  • ¥15 能不能通过蓝牙将传感器数据传送到手机上
  • ¥20 100元python和数据科学实验项目
  • ¥15 根据时间在调用出列表
  • ¥15 FastReport.community 编辑,table只显示“每页”最顶部和底部横线
  • ¥15 R 包chipseeker 安装失败
  • ¥15 Veeam Backup & Replication 9.5 还原问题
  • ¥15 vue-print-nb
  • ¥15 winfrom的datagridview下拉框变成了黑色,渲染不成功
  • ¥20 利用ntfy实现短信推送