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
相关产品推荐
相关产品推荐

