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

Unity水下FlappyBird类游戏地雷Y轴随机生成失效问题求助

问题:地雷沿Y轴生成时始终呈直线排列

我正在制作一款水下版FlappyBird风格的游戏,玩家需躲避地雷、收集鱼类来得分。目前遇到的问题是:地雷虽能按预期在屏幕外生成并横穿屏幕,但始终呈直线排列,无法实现Y轴的随机分布。我刚接触C#,正跟随教程学习,谷歌搜索未找到解决方案。

相关代码

地雷生成逻辑

private void HandleMineSpawning() {
    Timer -= Time.deltaTime;
    if (Timer < 0) {
        Timer += TimerMax;
         

        float heightEdge = 10f;
        float minHeight = offset + heightEdge;
        float totalHeight = camSize * 2;
        float maxHeight = totalHeight - offset *.5f - heightEdge;

        float height = Random.Range(minHeight, maxHeight);
        CreateMineOffset(height, offset, mineSpawn);
    }
}

Y轴偏移实现代码

private void Awake() {

    minelist = new List<Mine>();
    TimerMax = 1.5f;
    offset = 20;

}


private void CreateMineOffset(float offsetY, float offsetSize, float xPosition) {

    CreateMine(offsetY - offsetSize * .5f, xPosition);
    CreateMine(camSize * 2f - offsetY - offsetSize * .5f, xPosition);
    
}

问题分析与解决

问题根源

你的CreateMineOffset方法采用了镜像对称逻辑:每次生成的两个地雷Y坐标基于同一个随机height值,通过屏幕总高度减去该值得到对称位置。这导致每一组地雷的相对位置完全固定,整体看起来就是直线排列。

解决方法

方案1:完全随机的Y轴位置

如果希望每个地雷的Y轴位置独立随机,直接在生成逻辑里创建两个独立的随机值,去掉镜像逻辑:

private void HandleMineSpawning() {
    Timer -= Time.deltaTime;
    if (Timer < 0) {
        Timer += TimerMax;

        float heightEdge = 10f;
        float totalHeight = camSize * 2;
        // 单个地雷的Y轴范围:避开屏幕边缘
        float minHeight = heightEdge;
        float maxHeight = totalHeight - heightEdge;

        // 生成两个独立的随机Y值
        float height1 = Random.Range(minHeight, maxHeight);
        float height2 = Random.Range(minHeight, maxHeight);
        
        // 确保两个地雷间距足够,避免重叠
        while (Mathf.Abs(height1 - height2) < 10f) {
            height2 = Random.Range(minHeight, maxHeight);
        }

        CreateMine(height1, mineSpawn);
        CreateMine(height2, mineSpawn);
    }
}

方案2:保留上下配对但随机每组位置

如果想维持“上下两个地雷为一组”的设计,只需调整CreateMineOffset的计算逻辑,让每组的基准位置随机,且两个地雷保持固定间距:

private void CreateMineOffset(float baseY, float gapSize, float xPosition) {
    // 第一个地雷在基准位置,第二个在基准位置+间距
    CreateMine(baseY, xPosition);
    CreateMine(baseY + gapSize, xPosition);
}

同时要确保HandleMineSpawning里的maxHeight计算正确,避免地雷超出屏幕:

float maxHeight = totalHeight - offset - heightEdge;

额外检查点

  • 确认camSize已正确赋值:在Awake方法中添加camSize = Camera.main.orthographicSize;(2D游戏通常使用正交相机)。
  • 检查offset值是否合理,避免生成的地雷间距过大或过小。

内容的提问来源于stack exchange,提问作者DokMephistopheles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:36:20