将 Oculus Unity Integration 升级到 v12 后,Teleport 无法在 Quest 上运行

Teleport not working on Quest after upgrading Oculus Unity Integration to v12

我当前的堆栈:

我遵循了有关传送的基本教程并且效果很好:我能够使用左摇杆来定义化身传送的新目标和方向。但是,将 Oculus Integration for Unity 更新到最新版本 (v12) 后,它停止工作了。

这是我的 LocalPlayerController 预制件的结构:

这是 LocomotionController 对象的先前(工作)配置:

更新后,我注意到 2 个脚本发生了变化:LocomotionController.csTeleportInputHandlerAvatarTouch.cs:

LocomotionController.cs

如果我们更详细地分析这个脚本,我们会注意到两个字段(CharacterControllerPlayerController)的类型发生了变化。

/************************************************************************************

See SampleFramework license.txt for license terms.  Unless required by applicable law 
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR 
CONDITIONS OF ANY KIND, either express or implied.  See the license for specific 
language governing permissions and limitations under the license.

************************************************************************************/

using System;
using UnityEngine;
using System.Collections;
using JetBrains.Annotations;
using UnityEngine.Assertions;
#if UNITY_EDITOR
using UnityEngine.SceneManagement;
#endif

/// <summary>
/// Simply aggregates accessors.
/// </summary>
public class LocomotionController : MonoBehaviour
{
    public OVRCameraRig CameraRig;
    //public CharacterController CharacterController;
    public CapsuleCollider CharacterController;
    //public OVRPlayerController PlayerController;
    public SimpleCapsuleWithStickMovement PlayerController;

    void Start()
    {
        /*
        if (CharacterController == null)
        {
            CharacterController = GetComponentInParent<CharacterController>();
        }
        Assert.IsNotNull(CharacterController);
        */
        //if (PlayerController == null)
        //{
            //PlayerController = GetComponentInParent<OVRPlayerController>();
        //}
        //Assert.IsNotNull(PlayerController);
        if(CameraRig == null)
        {
            CameraRig = FindObjectOfType<OVRCameraRig>();
        }
        Assert.IsNotNull(CameraRig);
#if UNITY_EDITOR
        OVRPlugin.SendEvent("locomotion_controller", (SceneManager.GetActiveScene().name == "Locomotion").ToString(), "sample_framework");
#endif
    }
}

我过去常常通过将 LocalPlayerController 预制件拖到统一编辑器字段中来设置这些字段,但现在不可能了。不确定我应该在哪里选择 CapsuleColliderSimpleCapsuleWithStickMovement。如果我触摸左摇杆,我的播放器会四处移动,这不是预期的行为,我不知道如何更改它。

TeleportInputHandlerAvatarTouch.cs

此脚本只是添加了两个新字段(我猜是为了新的手部跟踪系统),但我认为它不会对当前配置造成问题。

我完全卡住了,不知道如何从这里开始。上次升级似乎没有更新其他脚本,我的所有研究都没有成功。

研究让我 this reddit post 感叹同样的问题,但在他们的情况下,他们似乎只是在 PlayerController 中添加了两个组件:CapsuleColliderSimpleCapsuleWithStickMovement.如果您搜索要添加到 PlayerController 的组件,两者都应该出现在您当前的项目中。然后你显然可以简单地禁用这些组件并且你的游戏应该可以玩而不会抛出错误,尽管行为是否是你想要的是另一个问题。

经过将近三天和无数次实验后,我找到了一种配置,可以使传送与 Oculus Quest.

的 Oculus Unity 集成 v12 配合使用

1. PlayerController

设置

这是玩家控制器对象结构:

您需要禁用 CharacterControllerOVRPlayerController

这将重新激活传送激光,但它可能不适用于所有表面。为了解决这个问题,我们需要一个额外的步骤...

2。运动控制器设置

看起来 引入了一个错误,当 Aim Collision Type 设置为 [=13] 时它会阻止正确的碰撞检测=].为了让它工作,我们需要将它设置为 Sphere 并给出任何相对较小的 Radius/Height(在本例中为 0.1)

...这对我有用。

希望这会有所帮助!

我认为目前 (31.01.2022) 的正确答案是您需要在 Locomotion Controller 中设置 -- Teleport Target Handler Physical -- Aim Collision Layer MaskEverything(或对您有意义的)。默认情况下它是 Nothing,所以在人类语言中它是“没有我允许瞄准传送到那里的表面”,我们将它设置为“Everything”。