Unity跨脚本访问公共方法报错CS0138:using指令使用错误
解决Unity中访问ObjectPoolingManager公共方法的错误
你遇到的两个问题分别是using语句误用和方法名拼写错误,咱们一步步来解决:
1. 修正using语句错误
错误提示CS0138的原因很明确:你写了using ObjectPoolingManager;,但ObjectPoolingManager是一个类,不是命名空间,using关键字只能用来引入命名空间。
解决方法:
- 如果你的
Player和ObjectPoolingManager脚本在同一个默认命名空间下(也就是没有自定义namespace的情况),直接删掉这行错误的using语句就行,因为Unity默认会让同一个命名空间下的类互相可见。 - 如果
ObjectPoolingManager在自定义命名空间里(比如namespace Game.Managers;),那你应该引入对应的命名空间,比如using Game.Managers;。
2. 修正方法名拼写错误
看你的ObjectPoolingManager代码,方法名是GetBulltet()(多了一个字母l),但你在Player里调用的是GetBullet()——这两个名字不匹配,编译器肯定找不到方法!
把ObjectPoolingManager里的方法名改成正确的GetBullet():
public GameObject GetBullet () { Debug.Log ("Hello"); return null; }
3. 优化对象池的使用(额外提示)
既然用了对象池,就别再调用Instantiate了,这违背了对象池的初衷。你应该直接使用对象池返回的对象,比如:
void Update() { if(Input.GetMouseButtonDown(0)){ GameObject pooledBullet = ObjectPoolingManager.Instance.GetBullet(); if(pooledBullet != null){ pooledBullet.transform.position = playerCamera.transform.position + playerCamera.transform.forward; pooledBullet.transform.forward = playerCamera.transform.forward; pooledBullet.SetActive(true); // 记得激活对象,通常对象池里的对象是禁用状态 } } }
修改后的完整代码
ObjectPoolingManager.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjectPoolingManager : MonoBehaviour { private static ObjectPoolingManager instance; public static ObjectPoolingManager Instance { get { return instance; } } void Awake () { instance = this; } // 修正拼写后的方法 public GameObject GetBullet () { Debug.Log ("Hello"); return null; } }
Player.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; // 删掉错误的using语句 public class Player : MonoBehaviour { public Camera playerCamera; public GameObject bulletPrefab; void Update() { if(Input.GetMouseButtonDown(0)){ GameObject pooledBullet = ObjectPoolingManager.Instance.GetBullet(); if(pooledBullet != null){ pooledBullet.transform.position = playerCamera.transform.position + playerCamera.transform.forward; pooledBullet.transform.forward = playerCamera.transform.forward; pooledBullet.SetActive(true); } } } }
最后再确认一下:场景里必须有一个挂载了ObjectPoolingManager脚本的GameObject,这样Awake方法才能把instance赋值为当前实例,否则Instance会是null,调用时会报错哦。
内容的提问来源于stack exchange,提问作者Dholu
相关产品推荐
相关产品推荐

