ARkit HitCube示例:UnityARHitTestExample.cs实现物体单次放置后停止更新求助
实现Unity AR物体单次放置后不再移动的方案
嘿,这个需求在AR场景里太常见了,我来给你一步步拆解实现方法,修改UnityARHitTestExample.cs就行:
核心思路
我们只需要给脚本加一个状态开关变量,用来标记物体是否已经完成放置。当开关为false时,正常执行命中检测并更新物体位置;一旦物体被放置(开关设为true),就跳过后续的位置更新逻辑。
具体修改步骤
1. 添加状态控制变量
在脚本的私有变量区域,新增一个布尔变量,用来记录物体是否已放置:
// 标记物体是否已经完成放置,初始为未放置状态 private bool isObjectPlaced = false;
2. 阻断后续位置更新逻辑
找到脚本中处理AR命中检测并更新物体位置的代码块(通常在Update()方法里,或者专门的HitTest方法中)。在执行位置更新前,先判断状态开关:
假设原代码是这样的:
// 原命中检测更新逻辑 List<ARHitTestResult> hitTestResults = new List<ARHitTestResult>(); UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest( screenPosition, ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, hitTestResults); if (hitTestResults.Count > 0) { var hitPose = hitTestResults[0].pose; placedObject.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation); }
修改后变成:
List<ARHitTestResult> hitTestResults = new List<ARHitTestResult>(); UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest( screenPosition, ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, hitTestResults); // 只有未放置物体时,才更新位置 if (!isObjectPlaced && hitTestResults.Count > 0) { var hitPose = hitTestResults[0].pose; placedObject.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation); }
3. 触发放置完成的逻辑
接下来需要设置一个触发时机(比如用户点击屏幕),把状态开关设为true,锁定物体位置。找到脚本中处理用户输入的部分(比如触摸点击),添加如下逻辑:
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { // 只有未放置时才执行锁定操作 if (!isObjectPlaced) { isObjectPlaced = true; // 可选:添加放置完成的反馈,比如播放音效、显示提示文本 Debug.Log("物体已放置,位置锁定!"); } }
如果原脚本已经有点击触发放置的逻辑,直接在那个逻辑块里加上isObjectPlaced = true;就行。
额外扩展(可选)
如果后续需要支持重新放置功能,只需要加一个UI按钮,点击时把isObjectPlaced重置为false即可:
public void ResetPlacement() { isObjectPlaced = false; Debug.Log("已重置放置状态,可重新移动物体"); }
这样修改后,物体第一次通过命中检测放置好后,后续的AR命中检测就不会再改变它的位置了,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Antony
相关产品推荐
相关产品推荐

