如何修改标准HelloARController脚本实现单次实例化?
解决ARCore触摸仅实例化一次对象的问题
没问题,这个需求很容易实现——只需要添加一个状态变量来跟踪是否已经生成过对象,每次触摸时先检查这个变量,只有未生成过的情况下才执行实例化逻辑。
修改步骤:
- 添加状态标记字段:在
HelloARController类中声明一个私有布尔变量,用来记录是否已经完成过实例化操作。 - 修改触摸检测逻辑:在执行Raycast和实例化代码前,先检查这个标记;如果已经生成过对象,直接跳过后续代码。
- 更新状态:成功实例化对象后,将标记设为
true,确保后续触摸不会重复触发。
修改后的代码示例:
using UnityEngine; using GoogleARCore; public class HelloARController : MonoBehaviour { // 你的原有字段,比如AndyAndroidPrefab、raycastFilter等 public GameObject AndyAndroidPrefab; public TrackableType raycastFilter = TrackableType.PlaneWithinPolygon; // 新增:标记是否已经生成过对象 private bool _hasSpawnedObject = false; void Update() { // 处理触摸输入的原有逻辑 if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { Touch touch = Input.GetTouch(0); TrackableHit hit; // 先检查是否已经生成过对象,再执行Raycast if (!_hasSpawnedObject && Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit)) { // 实例化对象 var andyObject = Instantiate(AndyAndroidPrefab, hit.Pose.position, hit.Pose.rotation); // 创建锚点并绑定对象(原有逻辑保留) var anchor = hit.Trackable.CreateAnchor(hit.Pose); andyObject.transform.parent = anchor.transform; // 标记已完成实例化,后续触摸不再触发 _hasSpawnedObject = true; } } } }
额外说明(可选):
如果你之后需要允许用户重置(比如删除已生成的对象并重新生成),可以添加一个重置方法,将_hasSpawnedObject设回false,同时销毁已生成的对象:
public void ResetSpawnedObject() { // 找到并销毁已生成的对象(假设锚点是对象的父物体) GameObject spawnedObject = GameObject.FindWithTag("AndyObject"); // 记得给预制体加标签 if (spawnedObject != null) { Destroy(spawnedObject.transform.parent.gameObject); // 销毁锚点及子对象 } // 重置状态标记 _hasSpawnedObject = false; }
内容的提问来源于stack exchange,提问作者Volkert-TecDesign
相关产品推荐
相关产品推荐

