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
相关产品推荐
相关产品推荐

