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

Unity C#如何让类对象可跨脚本访问 解决保护级别不可访问报错

错误原因

错误CS0122触发的根本原因是:C# 类成员未显式声明访问修饰符时,默认访问级别为private,仅允许在当前类内部访问。你代码中SubmitButton类的myObject未加访问修饰符,因此txtScript无法直接跨类访问。
除此之外你的代码还存在两个逻辑问题:

  • 输入内容存储逻辑写反:原有代码是将空的myObject覆盖输入框内容,没有实现「把输入框内容存入myObject」的需求
  • 文本更新时机错误:你把文本赋值逻辑写在Start方法中,Start仅在脚本初始化时执行一次,此时用户还未完成输入,无法拿到最新的输入值

修复方案

方案1:公开成员 + 实例引用(推荐,适合多实例场景)

第一步修改SubmitButton脚本

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SubmitButton : MonoBehaviour 
{
    // 显式声明为public允许外部访问
    public object myObject;
    public Button btnClick;
    public InputField inputUser;

    void Start()
    {
        btnClick.onClick.AddListener(GetInputOnClickHandler);
    }

    public void GetInputOnClickHandler()
    {
        Debug.Log("Input is " + inputUser.text);
        // 修正逻辑:把输入框内容存入myObject
        myObject = inputUser.text;
    } 
}

第二步修改txtScript脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class txtScript : MonoBehaviour
{
    // 可以直接在Inspector面板拖入挂有SubmitButton脚本的游戏对象
    public SubmitButton submitButton;
    private Text txtMy;

    void Start()
    {
        txtMy = GameObject.Find("Canvas/Text").GetComponent<Text>();
        // 如果未在面板赋值,自动查找场景中的SubmitButton实例
        if(submitButton == null)
        {
            submitButton = FindObjectOfType<SubmitButton>();
        }
    }

    void Update()
    {
        // myObject有值时更新文本
        if(submitButton.myObject != null)
        {
            txtMy.text = "Test" + submitButton.myObject.ToString();
        }
    }
}

方案2:静态单例(适合单场景仅有一个SubmitButton的简单场景)

第一步修改SubmitButton脚本

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SubmitButton : MonoBehaviour 
{
    // 静态全局实例,无需手动获取引用
    public static SubmitButton Instance;
    public object myObject;
    public Button btnClick;
    public InputField inputUser;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        btnClick.onClick.AddListener(GetInputOnClickHandler);
    }

    public void GetInputOnClickHandler()
    {
        Debug.Log("Input is " + inputUser.text);
        myObject = inputUser.text;
    } 
}

第二步修改txtScript脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class txtScript : MonoBehaviour
{
    private Text txtMy;

    void Start()
    {
        txtMy = GameObject.Find("Canvas/Text").GetComponent<Text>();
    }

    void Update()
    {
        if(SubmitButton.Instance?.myObject != null)
        {
            txtMy.text = "Test" + SubmitButton.Instance.myObject.ToString();
        }
    }
}

可选优化

如果你不想直接公开myObject字段,可以用属性封装,更符合面向对象规范:
在SubmitButton类中添加如下代码,外部仅可读取该值,无法修改:

public object MyObject { get; private set; }

存储内容时改为对MyObject赋值即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:21:03