Unity报错:Random.Range需以类型名访问,不可用实例引用
解决Unity中Random.Range的实例调用报错问题
嘿,刚接触Unity遇到这种报错太正常了,我来帮你快速搞定~
你遇到的错误 Random.Range(float, float) cannot be accessed with an instance reference; qualify it with a type name instead,核心原因是你误用了静态方法的调用方式:
你在代码里写了 Random random = new Random();,试图创建一个Random类的实例,然后用这个实例去调用Range方法。但Unity引擎提供的Random.Range是一个静态方法——静态方法不需要创建类的实例,直接通过类名Random调用就可以。更关键的是,你实例化的其实是C#标准库的System.Random类,和Unity自带的UnityEngine.Random不是同一个东西,这就导致了调用冲突。
修复步骤很简单:
- 删除多余的实例化代码:把
Random random = new Random();这一行直接删掉,完全不需要创建Random实例。 - 修改Range方法的调用方式:把Update方法里的
random.Range(...)改成Random.Range(...),直接通过Unity的Random类名调用静态方法。
修改后的完整代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spawner : MonoBehaviour { public GameObject enemy; float randx; float randy; Vector2 whereToSpawn; public float spawnRate = 2f; float nextSpawn = 0f; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if(Time.time > nextSpawn) { nextSpawn = Time.time + spawnRate; randx = Random.Range(-1.408f, 1.232f); randy = Random.Range(0.776f, 1.232f); whereToSpawn = new Vector2 (randx, randy); Instantiate(enemy, whereToSpawn, Quaternion.identity); } } }
小提示:
如果之后你用到整数参数的Random.Range,要注意Unity的版本是左闭右开区间(比如Random.Range(1, 3)只会返回1或2),而C#标准库的System.Random是左闭右闭区间。不过你现在用的是float参数,两者都是左闭右闭,不用担心这个差异~
内容的提问来源于stack exchange,提问作者Rice
相关产品推荐
相关产品推荐

