You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Meta Quest开发:物品拾取缩放Scene View正常但Game View失效问题

Meta Quest XR物品拾取缩放异常问题

我需要实现的功能是:拾取物品时,物品移动到手部的过程中从原始尺寸缩放到约6英寸(对应代码中targetSize = .15f)。目前这个功能在编辑器Scene View中表现正常——物品被拾取后会向手部移动并缩小,但在Game View(头显视角)里完全不符合预期:物品始终保持原尺寸,反而因为靠近视角视觉上显得更大。

开发平台是Meta Quest,缩放脚本ResizeObject继承自XRGrabInteractable,挂载在物品上,由Ray Interactor触发激活。玩家仅支持物理移动,没有其他移动方式。

补充现象:

  • 通过鼠标拖动Transform拾取物品时,Scene View和Game View的表现都正常
  • 通过Ray Interactor拾取时,只有Scene View正常,Game View中物品不缩放,且Mesh Collider也不会随物品缩放

相关代码实现如下:

public class ResizeObject : XRGrabInteractable
{
    private Vector3 OriginalSize;
    private float BiggestDimention;
    private float OriginalDistance;
    private float TargetScale;
    private Vector3 OriginalPos;
    private Vector3 OriginalRot;
    private Vector3 OriginalScale;

    public bool selected;
    private readonly float targetSize = .15f;
    private Vector3 playerPos;

    // Start is called before the first frame update
    void Start()
    {
        selected = false;

        playerPos = GameObject.FindGameObjectWithTag("Player").transform.position;

        OriginalPos = new Vector3(transform.position.x, transform.position.y, transform.position.z);
        OriginalRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z);
        OriginalScale = transform.localScale;

        OriginalSize = gameObject.GetComponent<Collider>().bounds.size;
        BiggestDimention = OriginalSize.x;
        if (OriginalSize.y > BiggestDimention)
            BiggestDimention = OriginalSize.y;
        if (OriginalSize.z > BiggestDimention)
            BiggestDimention = OriginalSize.z;

        TargetScale = targetSize / BiggestDimention;

        OriginalDistance = Vector3.Distance(OriginalPos, playerPos);
    }

    // Update is called once per frame
    void Update()
    {
        if (selected)
        {
            float currentScale = Vector3.Distance(transform.position, playerPos) / OriginalDistance;
            if (currentScale > 1)
                currentScale = 1;
            else if (currentScale < TargetScale)
                currentScale = TargetScale;
            transform.localScale = new Vector3(currentScale,currentScale,currentScale);
        }
    }

    protected override void OnSelectEntered(SelectEnterEventArgs args)
    {
        base.OnSelectEntered(args);
        Debug.Log(gameObject.name + " Select()");
        selected = true;
        transform.localScale = new Vector3(TargetScale,TargetScale,TargetScale);
    }

    protected override void OnSelectExited(SelectExitEventArgs args)
    {
        base.OnSelectExited(args);
        Debug.Log(gameObject.name + " Deselect()");
        selected = false;
        transform.position = OriginalPos;
        transform.eulerAngles = OriginalRot;
        transform.localScale = OriginalScale;
    }
}

内容的提问来源于stack exchange,提问作者Gillmore Games

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:02:51