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

Unity 3D C# Random为UnityEngine与System下二义性引用报错如何解决

错误原因

System 和 UnityEngine 两个命名空间都定义了 Random 类,你同时引入了两个命名空间,编译器无法判断代码中调用的是哪一个类,因此报二义性引用错误。

无需删除命名空间的两种修复方案

你可以根据自己的需求选择对应方案,不需要删除已有的using System;或using UnityEngine;引用:

  • 方案1:调用时显式指定完整命名空间
    直接在Random前加命名空间前缀,明确告诉编译器你要使用的类。如果你需要用System.Random,就把实例化代码改为new System.Random();如果你需要用UnityEngine.Random,就写UnityEngine.Random。
    注意两个Random的用法区别:

    • System.Random需要实例化,生成整数随机数调用Next(min, max),第二个参数为不包含的上界
    • UnityEngine.Random是静态类无需实例化,生成整数随机数调用Range(min, max),第二个参数同样为不包含的上界
      另外你的代码还有两个可优化点:原Next(0, max-1)会永远取不到最后一个枚举值,直接传max即可;Unity中不需要用Console.WriteLine输出日志,改用Debug.Log。
  • 方案2:在脚本顶部为Random指定全局别名
    如果这个脚本里你会多次用到Random,可以在using声明区加一行别名定义,后续整个脚本里直接用Random都会默认指向你指定的类,不需要每次写全前缀。
    比如要默认用System.Random就加:using Random = System.Random;;要默认用UnityEngine.Random就加:using Random = UnityEngine.Random;。

修改后完整代码示例(采用方案2,使用System.Random)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
// 全局指定Random别名,后续直接调用Random不会冲突
using Random = System.Random;

public class Building : MonoBehaviour
{
    public enum State
    {
        Nothing,
        Burnt,
        Cold
    };

    private void Start()
    {
        var max = Enum.GetValues(typeof(State)).Length;
        var value = (State)new Random().Next(0, max);
        // Unity中用Debug.Log输出控制台日志
        Debug.Log(value); 
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:30:05