Unity中水平移动的GameObject如何在随机位置触发指定动作
问题描述
需要实现从左向右水平匀速移动的GameObject在移动路径随机位置触发指定动作,现有代码仅支持固定时长后执行动作,无法匹配基于路径位置随机触发的需求,原有代码如下:
public GameObject[] Prefabs; public float speed; public float generateTime; // Start is called before the first frame update void Start() { speed = Random.Range(1,5); StartCoroutine (generator()); } // Update is called once per frame void Update() { transform.Translate(new Vector2(1f*Time.deltaTime*speed, 0f)); } IEnumerator generator() { // Currently this action takes place after a particular time yield return new WaitForSeconds(generateTime); spawnProducts(); } void spawnProducts() { // This action will be performed at random point } void OnBecameInvisible() { Destroy(gameObject); }
实现方案
因为物体沿X轴水平匀速移动,位置触发不需要依赖时间等待,核心逻辑:
- 物体生成时,先计算它在屏幕内可移动的X轴总范围,在范围内随机取一个值作为动作触发的目标坐标
- 每帧移动物体后,判断当前位置是否到达目标触发点,到达就执行对应动作,同时标记已触发状态避免重复执行
- 原有固定时间等待的协程、
generateTime变量可以直接删除,不需要保留
修改后可直接运行的完整代码:
public GameObject[] Prefabs; public float speed; // 可配置触发区间占总移动路径的比例,避免刚生成/快移出屏幕时触发 public float minTriggerRatio = 0.2f; public float maxTriggerRatio = 0.8f; private float _triggerX; private bool _hasTriggered = false; private float _screenRightEdge; void Start() { speed = Random.Range(1,5); // 计算屏幕右边界对应的世界坐标 Camera mainCam = Camera.main; float camZOffset = transform.position.z - mainCam.transform.position.z; _screenRightEdge = mainCam.ViewportToWorldPoint(new Vector3(1, 0, camZOffset)).x; float totalMoveDistance = _screenRightEdge - transform.position.x; // 随机生成触发点的X坐标 _triggerX = transform.position.x + totalMoveDistance * Random.Range(minTriggerRatio, maxTriggerRatio); } void Update() { transform.Translate(new Vector2(1f*Time.deltaTime*speed, 0f)); // 到达触发位置且未触发过动作时执行 if (!_hasTriggered && transform.position.x >= _triggerX) { _hasTriggered = true; spawnProducts(); } } void spawnProducts() { // 在这里编写随机位置需要执行的业务逻辑即可 } void OnBecameInvisible() { Destroy(gameObject); }
扩展说明:如果需要支持路径上多次随机触发,只需要在每次执行完
spawnProducts后,重新生成一个大于当前物体X坐标的新触发点、把_hasTriggered重置为false即可。
内容的提问来源于stack exchange,提问作者Rajan Phatak
相关产品推荐
相关产品推荐

