相机控制 (Camera Control)

在运行时控制相机移动和聚焦,以跟踪移动对象、创建电影化视角或引导用户浏览您的数字孪生。

ℹ️

新功能:CameraFollowObject 组件自 realvirtual 6.0.7 版本起可用。

概览 (Overview)

realvirtual 提供全面的相机控制功能,用于运行时的导航、对象跟踪和预设相机位置。系统设计用于无需代码的 Inspector 配置脚本集成,使设计师可以轻松使用,同时为开发人员保持强大功能。

注意 本部分涵盖用于跟随对象和加载预设位置的运行时相机控制功能。有关运行时使用鼠标/键盘的标准场景导航(平移、旋转、缩放、第一人称模式),请参见主 Runtime UI 文档。

相机控制选项 (Camera Control Options)

realvirtual 提供三种互补的相机控制方法:

1. 相机位置预设(CameraPosition 组件) 推荐初学者使用

  • 将完整相机视图保存为可重用的预设资产
  • 无需任何编码即可创建相机导航按钮
  • 自动加载启动位置
  • 键盘快捷键和触摸手势用于快速访问
  • 适用于:多视图仪表板、导览、预设导航

2. 对象跟随和聚焦(CameraFollowObject 组件)

  • 连续跟踪移动对象(跟随模式)
  • 一次性平滑过渡以查看特定对象(聚焦模式)
  • 自动计算距离和角度或自定义定位
  • 跟随期间可选用户控制(旋转/缩放)
  • 适用于:AGV 跟踪、过程监控、操作员注意力管理

3. 直接相机控制(SceneMouseNavigation API)

  • 从脚本编程控制相机定位
  • 与自动化逻辑的高级集成
  • 自定义相机序列和动画
  • 适用于:自动化演示、复杂相机运动、自定义 UI

常见用例

  • 相机预设导航 - 通过按钮、键盘或手势快速访问预定义视图
  • AGV/移动机器人跟踪 - 跟随自主车辆穿过设施
  • 过程可视化 - 在演示期间聚焦特定机器或操作
  • 导览 - 创建自动相机序列,突出显示关键区域
  • 多视图仪表板 - 为操作员提供对不同设施区域的即时访问
  • 操作员培训 - 将用户注意力引导到重要组件
  • 远程监控 - 实时跟踪关键移动设备

相机控制与 PLC 信号、UI 按钮和脚本无缝集成,适用于自动化序列和用户控制的交互。


相机位置预设 - 无需代码方法

CameraPosition 组件系统提供了最简单的方式,无需任何编码即可创建相机导航。它允许您将完整相机视图保存为可重用的预设资产,并通过按钮、键盘快捷键或触摸手势触发它们。

工作原理

CameraPosition 系统由两部分组成:

  1. CameraPos ScriptableObject 资产 - 存储相机状态(位置、旋转、距离、正交设置)
  2. CameraPosition 组件 - 在触发时加载和激活相机预设

这种分离允许您创建可在不同按钮、键盘快捷键和自动化触发器之间重用的相机视图库。

配置了不同预设视图和激活方法的两个 CameraPosition 组件

创建相机位置预设 (Creating Camera Position Presets)

按照以下步骤创建和保存相机位置预设:

在编辑模式下:

  1. 创建 ScriptableObject 资产
    • 在 Project 窗口中右键点击 → Create > realvirtual > Add Camera Position
    • 给资产起一个描述性名称(例如,"MainOverview"、"RobotStation1"、"TopView")
  2. 将 CameraPosition 组件附加到主相机 (Main Camera)
    • 在 Hierarchy 中选择 Main Camera/realvirtual/Main Camera
    • 点击 Add Component → 搜索 CameraPosition
  3. 分配 ScriptableObject 资产
    • 在 CameraPosition 组件中,将 CameraPos 资产分配给 Campos 属性

在播放模式下:

  1. 启动仿真
    • Play 按钮进入播放模式
  2. 定位 Game 视图相机
    • 使用 realvirtual 运行时控件将相机导航到所需视图:
      • 鼠标中键 + 拖动 - 平移相机
      • 鼠标右键 + 拖动 - 围绕枢轴点旋转相机
      • 鼠标滚轮 - 放大/缩小
  3. 保存当前位置
    • 保持 Main Camera 选中,在 Inspector 中找到 CameraPosition 组件
    • 点击 "Save current Position" 按钮
    • CameraPos 资产现在存储了当前的 Game 视图相机位置
重要 相机位置必须在播放模式下 Game 视图相机激活时保存。"Save current Position" 按钮捕获运行时相机的当前位置和旋转。
提示 为数字孪生中的不同区域或视图创建多个 CameraPos 资产。构建预设库,如 "Overview"、"DetailView1"、"DetailView2"、"TopView"、"SideView",以实现全面的导航。

将 CameraPosition 添加到场景

相机位置组件通常添加到 Main Camera/realvirtual/Main Camera)以管理不同的相机视图。

步骤 1:将 CameraPosition 组件添加到 Main Camera

  1. 在 Hierarchy 中选择 Main Camera/realvirtual/Main Camera
  2. 在 Inspector 中点击 Add Component
  3. 搜索并添加 CameraPosition
  4. 将 CameraPos 资产分配给 Campos 属性
  5. 配置激活设置(键盘快捷键、启动时激活等)

步骤 2:添加多个 CameraPosition 组件(可选)

您可以向 Main Camera 添加多个 CameraPosition 组件,每个配置为不同的视图:

  1. 向同一 Main Camera 添加另一个 CameraPosition 组件
  2. 分配不同的 CameraPos 资产(例如 "TopView"、"DetailView")
  3. 设置不同的 Key Code(例如 F1 用于第一个视图,F2 用于第二个视图)
  4. 为其他预设视图重复

步骤 3:连接到 UI 按钮(可选)

对于基于按钮的导航:

  1. 选择 UI 按钮 GameObject
  2. 在 Button 组件的 OnClick 事件列表中,点击 +
  3. Main Camera GameObject 拖到对象字段
  4. 从函数下拉菜单中选择 CameraPosition > SetCameraPosition()
  5. 如果 Main Camera 上有多个 CameraPosition 组件,选择要触发的特定组件

CameraPosition 属性

基本配置

Name(字符串)- 此相机位置的显示名称。在运行时 UI 中显示,可用于识别。默认:"Main Camera"

Campos(CameraPos 资产)- 要加载的相机位置预设资产。此 ScriptableObject 包含保存的相机状态(位置、旋转、距离、正交设置)。分配您之前创建的 CameraPos 资产。

激活方法

View Name(字符串)- 此视图的可选标识符。可用于脚本查找或显示目的。示例:"View1"、"Overview"、"DetailStation"

Key Code(KeyCode)- 激活此相机位置的键盘快捷键。在运行时按此键即可立即加载预设视图。示例:

  • F1、F2、F3 - 用于快速视图切换的功能键
  • Alpha1、Alpha2 - 用于编号视图的数字键
  • None - 禁用键盘激活

Activate On Start(布尔值)- 启用时,此相机位置在播放模式启动或组件启用时自动加载。用于默认启动视图。

警告 仅在一个 CameraPosition 组件上启用 Activate On Start。启用此设置的多个组件会发生冲突。

Double Tap Gesture(触摸交互)- 为移动或触摸屏界面配置触摸手势激活:

  • None - 禁用触摸手势激活
  • Touch Interaction GameObject - 分配管理手势的触摸交互组件
  • 当分配且用户执行双击手势时,此相机位置激活

这使得触摸屏用户能够使用熟悉的双击手势在视图之间快速导航。

Inspector 按钮

CameraPosition 组件在 Inspector 中提供两个方便的按钮:

  • Save current Position - 捕获当前场景视图相机状态并更新分配的 CameraPos 资产
  • Set Camera to saved Position - 从分配的 CameraPos 资产加载相机视图

这些按钮在编辑模式和播放模式下均可使用,允许您在开发期间测试和优化相机位置。

工作流提示 使用"Save current Position"在改进视图时快速更新预设。在 Scene 视图中导航到所需位置,然后点击按钮更新资产,无需离开 Inspector。

常见设置模式

模式 1:UI 按钮导航(无需编码)

为不同视图创建导航面板:

  1. 为不同区域创建 3-5 个 CameraPos 资产(Overview、Station1、Station2 等)
  2. 选择 Main Camera 并添加 3-5 个 CameraPosition 组件(每个视图一个)
  3. 为每个 CameraPosition 组件分配不同的 CameraPos 资产
  4. 向 Canvas 添加 UI 按钮
  5. 将每个按钮的 OnClick 事件连接到 Main Camera > CameraPosition > SetCameraPosition()
  6. 为每个按钮选择特定的 CameraPosition 组件

结果:用户点击按钮即可在预定义视图之间即时导航。

模式 2:键盘快捷键

为高级用户提供键盘快捷键:

  1. 在 Hierarchy 中选择 Main Camera
  2. 向 Main Camera 添加多个 CameraPosition 组件
  3. 为每个组件分配不同的 CameraPos 资产
  4. 为每个 CameraPosition 设置不同的 KeyCode(F1、F2、F3 等)
  5. 将所有组件的 Active 设置为 "PlayModeOnly"

结果:按 F1-F5 即可在 5 个预设视图之间即时切换。

模式 3:自动启动视图

设置场景启动时的默认相机位置:

  1. 在 Hierarchy 中选择您的 Main Camera
  2. SceneMouseNavigation 组件上配置相机位置设置:
    • Last Camera Position - 分配默认启动视图 CameraPos 资产
    • Set Camera Pos On Start Play - 启用以在启动时加载此位置
    • Save Camera Pos On Quit - 启用以在退出播放模式时保存当前相机状态
    • Set Editor Camera Pos - 启用以将 Scene 视图与保存的位置同步
    • Interpolate To New Camerapoitions - 启用以实现平滑的相机过渡
重要:Save Camera Pos On Quit 当您想捕获最终相机位置时,临时启用 Save Camera Pos On Quit。一旦设置了永久启动位置,禁用此设置以防止它每次退出播放模式时覆盖您的预设。仅当您希望相机位置在会话之间动态更新时才保持启用。

结果:场景始终从相同的专业概览位置开始。

模式 4:组合方法

主相机上的 SceneMouseNavigation 组件,显示相机位置启动设置

组合所有方法以获得最大灵活性:

  1. 在 SceneMouseNavigation 上配置启动位置(模式 3)
  2. 为常用视图添加 UI 按钮(模式 1)
  3. 为高级用户添加键盘快捷键(模式 2)
  4. 可选:为移动端添加双击手势(配置 Touch Interaction)

结果:支持多种用户偏好和设备的完整导航系统。

重要:避免相机系统之间的冲突
当组合多种相机控制方法时(CameraPosition、CameraFollowObject 和 SceneMouseNavigation 设置),注意避免冲突:
* 仅一个 "Activate On Start":仅在一个 CameraPosition 组件上启用 "Activate On Start"。启用此设置的多个组件会发生冲突。
* 不要并行设置位置:避免同时触发多个相机位置更改(例如,在相机位置动画时启动跟随模式)。
* SceneMouseNavigation vs CameraPosition 启动:如果使用 CameraPosition 的 "Activate On Start",请禁用 SceneMouseNavigation 上的 "Set Camera Pos On Start Play",以避免两个系统都尝试设置启动位置。
* 跟随模式优先:当 CameraFollowObject 正在主动跟随对象时,相机位置更改被阻止,直到跟随停止。
* 顺序过渡:如果您需要组合不同的相机运动(例如,加载位置,然后开始跟随),请使用脚本或 Events 以适当的延迟顺序触发它们。

Camera Position vs CameraFollowObject

使用 CameraPosition 当:

  • 您需要预定义的静态相机视图
  • 在固定视点之间创建导航(例如工厂的不同区域)
  • 设置启动相机位置
  • 构建多视图仪表板
  • 无需编码

使用 CameraFollowObject 当:

  • 您需要跟踪移动对象(AGV、机器人、传送带)
  • 创建跟随运动的动态相机
  • 在演示期间将注意力集中在特定组件上
  • 将跟随与用户控制结合(跟踪期间的旋转/缩放)

两个系统可以在同一场景中一起使用,实现全面的相机控制。


CameraFollowObject 组件

CameraFollowObject 组件控制连续跟随和一次性聚焦操作的相机行为。与加载静态预设视图的 CameraPosition 不同,CameraFollowObject 创建动态相机行为,实时跟踪移动对象或平滑过渡到特定组件上。

配置为跟随机器人 TCP 的 CameraFollowObject 组件,启用了旋转和缩放控制

添加 CameraFollowObject

  1. 将组件添加到场景中的任何 GameObject(通常附加到 UI 按钮)
  2. Object To Follow 属性分配给目标 GameObject
  3. 根据需要配置距离和角度设置
  4. 连接到按钮或 PLC 信号进行触发

属性

目标对象

Object To Follow(GameObject)- 要跟踪或聚焦的 GameObject。可以是场景中的任何对象,包括 MU、机器人、传送带或机器组件。相机会自动从所有子级渲染器计算对象的包围盒中心。

相机距离

Use Custom Distance(布尔值)- 控制是使用手动指定距离还是自动计算最佳观看距离。禁用时,相机自动计算以大约 1/3 屏幕空间适应对象所需的距离,提供舒适的观看大小,清晰地显示对象而不填满整个帧。

Distance(浮点,米)- 当 Use Custom Distance 启用时,相机距离对象中心的距离。调整此值以控制相机离目标的远近。典型值范围从小物体的 2 米到大型设备的 20 米。

相机角度

Use Custom View Angle(布尔值)- 控制是使用手动指定的相机旋转还是自动选择最佳角度。对 FocusOnObject 禁用时,相机计算略高于对象并从侧面偏移的最佳视点。对 StartFollowing 禁用时,保持当前相机角度。

View Angle(Vector3,度)- 当 Use Custom View Angle 启用时,欧拉角(X、Y、Z)的相机旋转。使用此设置精确的相机方向,如俯视图(90、0、0)或侧视图(0、90、0)。

用户控制选项

Allow Rotation(布尔值)- 在跟随模式下启用时,用户可以使用鼠标或触摸输入围绕对象旋转相机,同时保持对象居中。这对于操作员需要从不同角度检查移动设备的检查场景非常有用。

Allow Zoom(布尔值)- 在跟随模式下启用时,用户可以使用滚轮或捏合手势调整相机距离,同时保持焦点在目标上。与 Allow Rotation 结合使用,可在跟踪期间实现完全用户控制。

平滑度

Lerp Speed(浮点,0.1-10.0)- 控制在跟随模式下相机跟踪的平滑度。较低的值(0.1-0.5)创建平滑的电影般运动,中等值(0.5-2.0)提供平衡的跟踪,较高值(2.0-10.0)创建紧密响应的跟踪。默认:1.0

Smooth Start(布尔值)- 启用时,相机在开始跟随时平滑过渡到对象。禁用时,相机立即跳到跟随位置。为专业演示启用,为监控场景中的即时响应禁用。

停止按钮 UI

Show Stop Button(布尔值)- 启用时,在相机跟随模式下显示一个 UI 按钮,允许用户停止相机跟踪。按钮在跟随开始时自动出现,在跟随停止时消失。这为用户提供了清晰可见的退出跟随模式的方式,无需键盘快捷键或外部按钮。

启用 Show Stop Button 后,相机跟随模式期间会自动出现 "Stop Camera Focus" 按钮

Stop Button Prefab(GameObject)- 停止按钮 UI 的可选自定义预制件。如果为空,使用来自 Resources 的默认 rvUICameraFocusButton prefab。如果要自定义按钮的外观、位置或文本,请在此处分配自定义预制件。自定义预制件必须具有 rvUICameraFocusButton 组件。

Stop On Mouse Click(布尔值)- 启用时,如果用户点击任意鼠标按钮,跟随自动停止。这提供了另一种通过简单点击视口任意位置退出跟随模式的方式。

跟随模式

Auto Start Following(布尔值)- 当场景启动或组件启用时,自动开始跟随目标对象。当跟踪应立即开始时启用,例如启动演示或监控视图。

PLC 信号控制

PLC Signal Start Following(PLCInputBool)- 控制跟随模式的 PLC 信号。当信号转为 true 时,跟随开始。当信号返回 false 时,跟随自动停止。用于由 PLC 逻辑控制的自动化序列。

Follow Active(布尔值)- 可由脚本或 PLCOutputBool 组件外部控制的公共布尔值属性。设置为 true 开始跟随,false 停止。这为脚本场景或 UI 切换按钮提供了 PLC 信号的替代方案。

提示
PLC 信号监控使用 FixedUpdate 时间以确保与 PLC 通信周期同步。PLC 信号或 Follow Active 布尔值都可以触发跟随——两者不需要同时为 true。

控制方法

CameraFollowObject 组件提供三个主要方法,可从 UI 按钮、脚本或其他事件触发:

StartFollowing()

开始对目标对象的连续相机跟踪。相机将平滑移动到配置的观看位置,然后随着对象的移动连续更新其位置以保持对象居中。跟随持续进行,直到明确调用 StopFollowing() 或控制信号设置为 false 停止。

用例:

  • 跟踪穿过仓库的 AGV
  • 在操作序列期间跟随机器人手臂
  • 监控关键产品的传送带运输
  • 演示中的自动化相机序列

按钮设置: 向 UI 添加按钮,并将其 OnClick 事件连接到 CameraFollowObject.StartFollowing()。对于切换行为,改用 ToggleFollowing()。

StopFollowing()

结束连续相机跟踪,将相机返回到正常用户控制的导航模式。相机保持在其当前位置和旋转,允许用户自由导航。

用例:

  • 结束自动化跟踪序列
  • 将控制权交还给操作员
  • 在跟踪对象之间切换

FocusOnObject()

执行一次性平滑相机移动以查看目标对象而不进行连续跟踪。相机将内插到最佳观看位置,但如果之后对象移动,则不会继续跟随。这非常适合导览或将注意力吸引到特定组件。

用例:

  • 在演示期间突出特定机器
  • 创建基于航点的导览
  • 快速导航到特定区域
  • 培训场景中的操作员注意力管理

ToggleFollowing()

在跟随和非跟随状态之间切换。如果当前正在跟随,此方法停止跟踪。如果没有跟随,则开始跟踪。适用于 UI 中的切换按钮。

Inspector 按钮

组件在 Inspector 中直接提供三个按钮,用于开发期间的测试:

  • Start Following - 测试连续跟踪
  • Stop Following - 结束跟踪
  • Focus On Object - 测试一次性聚焦

这些按钮在编辑模式和播放模式下均可使用,允许您在场景设置期间预览相机行为。

距离和角度自动计算 (Distance and Angle Auto-Calculation)

当自定义距离或角度选项禁用时,相机使用智能自动计算:

自动距离计算:

  • 分析目标对象及其子级上的所有渲染器
  • 计算合并的包围盒尺寸
  • 确定以 1/3 屏幕空间适应对象的距离
  • 基于对象大小添加安全边距
  • 确保对象清晰可见,不会太近或太远

自动角度计算:

  • FocusOnObject:计算略高于并从对象中心偏移的最佳视点,以获得最佳可见性
  • StartFollowing:保持当前相机角度,避免在跟踪期间让用户迷失方向
提示
自动计算最适用于具有 MeshRenderer 或 SkinnedMeshRenderer 组件的对象。对于没有渲染器的对象,相机使用对象的变换位置和 5 米的默认距离。

通过代码设置相机位置

对于高级场景,您可以使用 SceneMouseNavigation 公共 API 程序化控制相机位置。这对于创建自定义相机序列、自动化逻辑或基于仿真事件的动态相机运动非常有用。

访问 SceneMouseNavigation

SceneMouseNavigation 组件位于 Main Camera 上。有几种方法可以获取对它的引用:

方法 1:FindObjectOfType(推荐 - 简单可靠)


using realvirtual;

// Find the SceneMouseNavigation component in the scene
SceneMouseNavigation sceneNav = FindObjectOfType<SceneMouseNavigation>();

方法 2:通过 Main Camera GameObject


using realvirtual;

// Get reference via specific GameObject path
GameObject mainCamera = GameObject.Find("/realvirtual/Main Camera");
SceneMouseNavigation sceneNav = mainCamera.GetComponent<SceneMouseNavigation>();

方法 3:使用 Camera.main


using realvirtual;

// Get reference via Unity's main camera
SceneMouseNavigation sceneNav = Camera.main.GetComponent<SceneMouseNavigation>();
提示 使用 FindObjectOfType() 获得最简单和最可靠的方法。无论相机的确切层次结构路径如何,它都可以工作。

SetNewCameraPosition 方法

程序化相机控制的主要方法:


public void SetNewCameraPosition(Vector3 targetPos, float camDistance, Vector3 camRotation, bool noInterpolate = false)

参数:

  • targetPos(Vector3)- 相机注视的世界位置(轨道中心点)
  • camDistance(float)- 目标与相机之间的距离,以米为单位
  • camRotation(Vector3)- 欧拉角(X, Y, Z)的相机旋转,以度为单位
  • noInterpolate(bool)- 如果 true,立即跳转;如果 false,平滑内插到位置(默认:false)

示例 - 将相机移动到特定位置:


using UnityEngine;
using realvirtual;

public class CameraController : MonoBehaviour
{
    private SceneMouseNavigation sceneNav;

    void Start()
    {
        // Get SceneMouseNavigation reference
        sceneNav = FindObjectOfType<SceneMouseNavigation>();
    }

    public void MoveCameraToStation1()
    {
        // Define target position, distance, and rotation
        Vector3 targetPosition = new Vector3(10f, 0f, 5f);  // Look at point
        float distance = 8f;                                 // 8 meters from target
        Vector3 rotation = new Vector3(30f, 45f, 0f);       // Camera angle

        // Move camera with smooth interpolation
        sceneNav.SetNewCameraPosition(targetPosition, distance, rotation, noInterpolate: false);
    }

    public void JumpCameraToOverview()
    {
        // Jump instantly without interpolation
        Vector3 targetPosition = new Vector3(0f, 0f, 0f);
        float distance = 15f;
        Vector3 rotation = new Vector3(45f, 90f, 0f);

        sceneNav.SetNewCameraPosition(targetPosition, distance, rotation, noInterpolate: true);
    }
}

示例 - 使用协程的相机序列:


using System.Collections;
using UnityEngine;
using realvirtual;

public class CameraTour : MonoBehaviour
{
    private SceneMouseNavigation sceneNav;

    void Start()
    {
        GameObject mainCamera = GameObject.Find("/realvirtual/Main Camera");
        sceneNav = mainCamera.GetComponent<SceneMouseNavigation>();
    }

    public void StartTour()
    {
        StartCoroutine(CameraTourSequence());
    }

    IEnumerator CameraTourSequence()
    {
        // Position 1: Overview
        sceneNav.SetNewCameraPosition(new Vector3(0, 0, 0), 20f, new Vector3(45, 0, 0));
        yield return new WaitForSeconds(3f);

        // Position 2: Station A
        sceneNav.SetNewCameraPosition(new Vector3(10, 0, 5), 8f, new Vector3(30, 45, 0));
        yield return new WaitForSeconds(3f);

        // Position 3: Station B
        sceneNav.SetNewCameraPosition(new Vector3(-10, 0, -5), 8f, new Vector3(30, -45, 0));
        yield return new WaitForSeconds(3f);
    }
}

使用 CameraPos 资产

您也可以程序化加载 CameraPos 资产:


using UnityEngine;
using realvirtual;

public class LoadCameraPreset : MonoBehaviour
{
    public CameraPos overviewPosition;  // Assign in Inspector
    private SceneMouseNavigation sceneNav;

    void Start()
    {
        GameObject mainCamera = GameObject.Find("/realvirtual/Main Camera");
        sceneNav = mainCamera.GetComponent<SceneMouseNavigation>();
    }

    public void LoadPreset()
    {
        if (overviewPosition != null)
        {
            sceneNav.SetNewCameraPosition(
                overviewPosition.TargetPosition,
                overviewPosition.Distance,
                overviewPosition.Rotation,
                noInterpolate: false
            );
        }
    }
}

内插控制 (Interpolation Control)

使用 SceneMouseNavigation 属性控制平滑相机过渡:

  • InterpolateToNewCamerapoitions(bool)- 启用/禁用平滑内插
  • CameraInterpolationSpeed(float)- 相机过渡速度(默认:0.1)

// Disable interpolation for instant jumps
sceneNav.InterpolateToNewCamerapoitions = false;
sceneNav.SetNewCameraPosition(targetPos, distance, rotation);

// Re-enable with custom speed
sceneNav.InterpolateToNewCamerapoitions = true;
sceneNav.CameraInterpolationSpeed = 0.05f;  // Slower transitions
sceneNav.SetNewCameraPosition(targetPos, distance, rotation);

程序化跟随对象

对于通过代码连续跟踪对象,使用 SceneMouseNavigation 中的 StartFollowing 方法:


public void StartFollowing(GameObject targetObject, float? distance = null, Vector3? viewAngle = null,
    bool allowRotation = false, bool allowZoom = false, float lerpSpeed = 1.0f,
    bool smoothStart = true, bool stopOnMouseClick = false)

参数:

  • targetObject(GameObject)- 要跟随的对象
  • distance(float?,可选)- 相机距离,以米为单位。如果为 null,根据对象包围盒自动计算
  • viewAngle(Vector3?,可选)- 欧拉角的相机旋转。如果为 null,使用当前角度(StartFollowing)或最佳角度(FocusOnObject)
  • allowRotation(bool)- 如果 true,用户可以在跟随时旋转相机
  • allowZoom(bool)- 如果 true,用户可以在跟随时放大/缩小
  • lerpSpeed(float)- 平滑因子(0.1 = 电影级,10.0 = 即时)
  • smoothStart(bool)- 如果 true,平滑过渡到对象。如果 false,立即跳转
  • stopOnMouseClick(bool)- 如果 true,当用户点击任意鼠标按钮时停止跟随

示例 - 跟随移动的 AGV:


using UnityEngine;
using realvirtual;

public class AGVTracker : MonoBehaviour
{
    public GameObject agv;
    private SceneMouseNavigation sceneNav;

    void Start()
    {
        sceneNav = FindObjectOfType<SceneMouseNavigation>();
    }

    public void StartTrackingAGV()
    {
        // Follow AGV with auto-calculated distance, allowing user rotation and zoom
        sceneNav.StartFollowing(
            targetObject: agv,
            distance: null,              // Auto-calculate optimal distance
            viewAngle: null,             // Maintain current camera angle
            allowRotation: true,         // User can orbit around AGV
            allowZoom: true,             // User can zoom in/out
            lerpSpeed: 0.3f,            // Smooth cinematic tracking
            smoothStart: true,           // Smooth transition to AGV
            stopOnMouseClick: false      // Continue following even if user clicks
        );
    }

    public void StopTracking()
    {
        sceneNav.StopFollowing();
    }
}

示例 - 使用自定义设置聚焦机器:


public void FocusMachineOnError(GameObject machine)
{
    SceneMouseNavigation sceneNav = FindObjectOfType<SceneMouseNavigation>();

    // Focus on machine with specific distance and angle
    sceneNav.FocusOnObject(
        machine,
        distance: 8f,                    // 8 meters from machine
        viewAngle: new Vector3(30, 45, 0) // View from 30° up, 45° around
    );
}
提示 对于按钮触发的跟随,使用 CameraFollowObject 组件,它提供无需编码的 Inspector 配置。对于基于事件的动态代码跟踪(例如,基于事件跟随不同对象),直接使用 SceneMouseNavigation.StartFollowing()。

© 2025 realvirtual GmbH https://realvirtual.io - 版权所有。未经出版商事先书面许可,不得以任何形式或任何方式(包括打印、保存、影印、录制或其他电子或机械方法)复制、分发或传输本出版物的任何部分。