四处移动纸板

Moving a cardboard around

快速免责声明:我不是一个非常高级的 C# 用户,更习惯于像 python 这样的语言,所以如果答案就在我面前,我深表歉意。

我一直在为 Google Cardboard 制作一个小游戏,使用演示场景作为基础。我有一些代码可以检查 "Trigger Pull",然后应该将 Cardboard 相机向上移动 10 个单位。

            //Checks For Magnet Trigger
        if (Cardboard.SDK.Triggered)
        {
            //moves player up at a rate of 10u/s

            transform.Translate(Vector3.up * 10);
            Debug.Log("Triggered_Head");
            //Tell Cardboard to maintain new position
        }

目前这对于检测磁铁拉力非常有效,而且它确实平移了纸板。问题是纸板在平移后几乎立即被传送回基本位置。

目前我已将此代码插入 CardboardHead.cs 的 UpdateHead() 方法 (?),如下所示:

      // Compute new head pose.
  private void UpdateHead() {
    if (updated) {  // Only one update per frame, please.
      return;
    }
    updated = true;
    Cardboard.SDK.UpdateState();

    if (trackRotation) {
      var rot = Cardboard.SDK.HeadPose.Orientation;
      if (target == null) {
        transform.localRotation = rot;
      } else {
        transform.rotation = target.rotation * rot;
      }
    }

    if (trackPosition) {
      Vector3 pos = Cardboard.SDK.HeadPose.Position;
      if (target == null) {
        transform.localPosition = pos;
          } 
      else {
        transform.position = target.position + target.rotation * pos;
      }
            //Checks For Magnet Trigger
            if (Cardboard.SDK.Triggered)
            {
                //moves player up at a rate of 10u/s

                transform.Translate(Vector3.up * 10);
                Debug.Log("Triggered_Head");
                //Tell Cardboard to maintain new position
            }
        }

    if (OnHeadUpdated != null) {
      OnHeadUpdated(gameObject);
    }
  }

这样做一切正常,但位置几乎立即恢复(我假设在下一帧)。所以我的问题是:我如何使变换保持不变,有没有更好的方法来处理这个问题?

好吧,我想出了如何处理运动,我将解决方案发布在这里,以供将来无法弄清楚的人使用。快速说明:我确实更新到了最新版本的 SDK,尽管这应该没有什么区别,除了命名。

那么,第 1 步:

创建一个对象作为您的控制器。我只是使用了资产包中的一个原型立方体,但不管怎样都行(最好是空对象)。

将此物体或多或少放在两个相机的中心点。

将您的 GvrMain 对象作为控制器对象的父级(通过将其拖到控制器对象上)以及您希望随播放器移动的任何其他组件(枪支、GUI 等)

第 2 步:

为控制器对象创建脚本。

在 Update() 方法中,添加以下行:

if (GvrViewer.Instance.Triggered)
{
transform.Translate(Vector3.up)
}

对于旧版本,将 GvrViewer.Instance 替换为 Cardboard.SDK

根据自己的喜好自定义动作,任何正常的统一函数都应该有效。

一些不足:

  • 你必须反复按下触发器,使用 while() 似乎破坏了统一性。这似乎很容易修复

  • 代码片段立即向上平移 1。不确定如何稳定加速。

希望这对遇到我问题的人有所帮助。