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_
相关产品推荐
相关产品推荐

