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

Unity C#报错求助:无法调用GameManager.EndGame(),提示保护级别限制

解决Unity错误CS0122:GameManager.EndGame()无法访问的问题

嘿,这个问题我太熟悉了!你碰到的CS0122错误,核心原因很简单:你在PlayerCollision类里尝试调用的EndGame()方法,它的访问权限被设成了外部类无法访问的级别(比如private或者protected)。

下面是具体的解决步骤,结合你的代码来调整:

1. 修改GameManager中EndGame()的访问修饰符

打开你的GameManager脚本,找到EndGame()方法,把它的访问修饰符改成public。原来的代码可能是这样的:

using UnityEngine;

public class GameManager : MonoBehaviour
{
    // 你的其他游戏管理代码...

    // 原来的private/protected修饰符导致外部无法访问
    private void EndGame()
    {
        // 游戏结束的逻辑
    }
}

修改成:

using UnityEngine;

public class GameManager : MonoBehaviour
{
    // 你的其他游戏管理代码...

    // 改成public,让外部类可以调用
    public void EndGame()
    {
        // 游戏结束的逻辑,比如显示GameOver界面、暂停时间等
        Debug.Log("游戏结束!");
    }
}

2. (可选但推荐)添加空引用检查

为了避免场景中没有GameManager实例时出现空引用错误,可以在PlayerCollision的代码里加个简单的检查:

using UnityEngine;
public class PlayerCollision : MonoBehaviour {
    public PlayerMovement movement;
    void OnCollisionEnter(Collision collisionInfo) {
        if (collisionInfo.collider.tag == "Obsticle") {
            movement.enabled = false;
            // 先获取GameManager实例并检查是否存在
            GameManager gameManager = FindObjectOfType<GameManager>();
            if (gameManager != null)
            {
                gameManager.EndGame();
            }
            else
            {
                Debug.LogError("找不到GameManager实例!请确保场景中有挂载了GameManager脚本的物体");
            }
        }
    }
}

小提醒

顺便说一句,你的代码里标签写的是Obsticle,正确的拼写应该是Obstacle,虽然这不是当前错误的原因,但如果后续碰撞检测出问题,这个笔误可能会是排查点哦~

内容的提问来源于stack exchange,提问作者JandrewGames

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:13:43