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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:54:07