Unity跨脚本调用void方法提示非静态成员需对象引用如何解决
问题原因
PlayerManager中定义的Died()方法属于非静态的实例方法,必须依托PlayerManager类的实例对象才能调用,你直接用类名PlayerManager调用非静态方法不符合C#语法规则,因此触发了该报错。
修复方案
方案1:将PlayerManager设为全局单例(推荐用于全局唯一的管理器类)
修改PlayerManager脚本,添加单例逻辑:
public class PlayerManager : MonoBehaviour { // 声明全局可访问的静态实例 public static PlayerManager Instance; private void Awake() { // 保证全局仅存在一个PlayerManager实例 if (Instance == null) { Instance = this; } else { Destroy(gameObject); } } public void Died() { PhotonNetwork.Destroy(controller); CreateController(); } // 此处保留你原来的其他代码 }
修改PlayerController中的调用逻辑:
void Die() { // 通过单例实例调用方法 PlayerManager.Instance.Died(); }
方案2:在PlayerController中主动获取PlayerManager实例引用
如果你不需要全局单例,可以通过手动关联/自动查找的方式获取实例:
public class PlayerController : MonoBehaviour { // 可以直接在Unity Inspector面板拖入场景中的PlayerManager对象赋值 public PlayerManager playerManager; private void Start() { // 如果没有手动赋值,代码自动查找场景中的PlayerManager实例 if (playerManager == null) { playerManager = FindObjectOfType<PlayerManager>(); } } void Die() { playerManager.Died(); } }
注意:
FindObjectOfType只会返回场景中第一个被找到的PlayerManager实例,需要确保场景中同一时间仅存在一个生效的PlayerManager对象,避免调用错误。
内容的提问来源于stack exchange,提问作者Nolyboy
相关产品推荐
相关产品推荐

