2

我当前的堆栈:

  • 耳机:Oculus Quest
  • 统一:v2019.2.19f1
  • Oculus 集成:v12
  • 操作系统:MacOs Catilina

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

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

运动控制器.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

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

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

4

3 回答 3

1

经过近三天和无数次的实验,我找到了一种配置,可以让 Teleport 与Oculus Quest的 Oculus Unity 集成 v12 一起工作。

1. PlayerController 的设置

这是 Player Controller 对象结构:

在此处输入图像描述

你需要禁用CharacterControllerOVRPlayerController

在此处输入图像描述

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

2. LocomotionController 的设置

看起来像引入了一个错误,Aim Collision Type当设置为时,它会阻止正确的碰撞检测Point。为了使它工作,我们需要将它设置为Sphere并给出任何相对较小的半径/高度(在本例中为 0.1)

在此处输入图像描述

...这对我有用。

希望这会有所帮助!

于 2020-01-29T15:43:40.467 回答
1

研究将我带到了这个 reddit 帖子,感叹同样的问题,但在他们的情况下,他们似乎只是简单地将两个组件添加到PlayerController:aCapsuleColliderSimpleCapsuleWithStickMovement. 如果您搜索要添加到PlayerController. 然后您显然可以简单地禁用这些组件,并且您的游戏应该可以玩而不会引发错误,尽管行为是否是您想要的是另一个问题。

于 2020-01-27T22:53:29.257 回答
0

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

在此处输入图像描述

于 2022-01-31T23:39:46.160 回答