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

Unity中如何在另一类私有方法内访问public类的protected变量

解决方案

核心前提:protected 修饰的成员默认仅允许声明类本身和其派生类访问,你当前的两个类不存在继承关系,因此无法直接访问该变量,有两种常用合规的实现方式:

  • 方案1:添加公共只读属性(最推荐,符合封装原则)
    仅对外暴露读取权限,避免外部误修改体力状态值,修改后代码如下:

    public class CharacterStats : MonoBehaviour
    {
        [SerializeField] protected bool Tired;
        // 新增只读属性,外部仅能读取无法修改Tired的取值
        public bool IsTired => Tired;
    }
    

    之后在PlayerMovement中先获取CharacterStats的实例引用,即可调用该属性:

    public class PlayerMovement : MonoBehaviour
    {
        private CharacterStats _characterStats;
        public float RunSpeed;
        public float Speed;
    
        private void Awake()
        {
            // 若两个组件挂载在同一GameObject下用这个方法获取,跨物体的话可直接在Inspector拖拽赋值
            _characterStats = GetComponent<CharacterStats>();
        }
    
        private void HandleRunning()
        {
            // 直接替换X的位置即可,C#中判断布尔值可简写无需写==true
            if (Input.GetKeyDown(KeyCode.LeftShift) && !_characterStats.IsTired) 
            {
                Speed = RunSpeed;
            }
        }
    }
    
  • 方案2:直接修改访问修饰符(简单但不推荐)
    如果你不需要严格控制变量的修改权限,可以直接把Tired的修饰符从protected改为public,之后直接通过实例引用访问_characterStats.Tired即可,缺点是所有外部代码都可以随意修改该变量值,容易引发逻辑bug。

另外注意你原代码存在拼写问题:C#所有关键字均为小写,你写的Public、Private、If都要改为小写,[SerialzeField]拼写错误,正确写法是[SerializeField]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:03