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

Unity 2D中C#随机数生成导致敌人生成器位置重复问题求助

解决Unity敌人生成器重复随机位置问题

问题根源

你遇到的情况主要是随机数工具的使用误区:

  • 要是用System.Random,同一帧里创建多个new Random()实例时,它们默认用当前系统时间当种子,但系统时间精度有限,同一帧内的实例种子完全一致,生成的随机数自然重复。
  • 要是混淆了UnityEngine.Random和System.Random,手动设置了相同种子,或者每个生成器单独初始化随机实例,也会导致重复。

解决办法

1. 直接用Unity自带的Random类(最推荐)

Unity的Random是全局单例,每次调用Random.Range都会自动推进随机序列,不会出现同一帧内重复的问题。还能直接生成正负偏移,让敌人真正分布在玩家周围:

// 获取玩家位置
Vector3 playerPos = GameObject.Find("Player").transform.position;
// 生成-25到25的随机偏移(敌人会在玩家四周,而非仅右下方)
float xOffset = UnityEngine.Random.Range(-25f, 25f);
float yOffset = UnityEngine.Random.Range(-25f, 25f);
// 计算最终生成位置
Vector3 spawnPos = new Vector3(playerPos.x + xOffset, playerPos.y + yOffset, playerPos.z);

2. 用全局单例的System.Random(特殊场景用)

如果一定要用C#自带的System.Random,别每个生成器都new一个,搞个全局共享的实例就行:

// 全局静态类存储随机实例
public static class RandomHelper
{
    public static System.Random GlobalRandom = new System.Random();
}

// 生成器中调用
float xOffset = (float)RandomHelper.GlobalRandom.NextDouble() * 50f - 25f;
float yOffset = (float)RandomHelper.GlobalRandom.NextDouble() * 50f - 25f;
Vector3 spawnPos = playerPos + new Vector3(xOffset, yOffset, 0);

3. 别乱设随机种子

除非需要复现固定的随机序列,否则别手动设置Random.seed。Unity启动时已经自动用随机种子初始化了全局Random,手动设相同种子只会让所有生成器走同一个随机序列。

内容的提问来源于stack exchange,提问作者I'm A noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:15:01