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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:09:22