【问题标题】:Calling protected variable from another class从另一个类调用受保护的变量
【发布时间】:2021-12-31 14:04:03
【问题描述】:

我需要将公共类中的受保护变量调用到另一个公共类的私有方法中的 if 语句中 我正在统一编写视频游戏,我需要在 if 语句中使用 bool 变量(显示角色是否体力不足)来确定角色是否可以运行 这就是我的代码的样子,排除了与问题无关的所有内容

Public class CharacterStats : MonoBehaviour
{
[SerialzeField] protected bool Tired;
}

Public class PlayerMovement : MonoBehaviour
{
Private void HandleRunning()
 {
 If (Input.GetKeyDown(KeyCode.LeftShift) && X != True) 
  {
 Speed = RunSpeed;
  }
 }
}
X is where I want the Tired variable to be.   

【问题讨论】:

  • 将其设为protected internal 或添加公共getter 方法或只读属性,后者是最好的。
  • 将其设置为内部保护会给我错误 CS0120:非静态字段、方法或属性“Characterstats.Tired”需要对象引用 诚然,我从未(或不知道如何)添加一个只读属性我也不知道公共 getter 方法我可以添加一个但不知道在其中做什么
  • 普遍的共识是,您应该明确地将[SerialzeField] private bool foo; 用于 Unity 编辑器,将public bool Foo => foo; 用于代码中的其他所有内容

标签: unity3d if-statement variables methods protected


【解决方案1】:

使用public readonly property,例如

public class CharacterStats : MonoBehaviour
{
    // Keep you serialized field protected
    [SerialzeField] protected bool tired;

    // Have a public read-only accessor property
    public bool Tired => tired;
}

然后例如

public class PlayerMovement : MonoBehaviour
{
    // Somehow you will need to get a reference to the CharacterStats instance
    // e.g. via the Inspector
    [SerializeField] private CharacterStats stats;

    [SerializeField] private float RunSpeed;

    private float Speed;

    private void HandleRunning()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift) && !stats.IsTired) 
       {
           Speed = RunSpeed;
       }
    }
}

或者(我向回答此问题的@aybe 表示歉意)您实际上可以使用显式直接序列化属性

[field: SerializeField] public bool Tired { get; protected set; }

这是一个所有人都可以访问的属性,但只有 this 和继承的类(并且由于现在的序列化检查器)有权设置值。


一般来说:修理你的外壳! c#中的所有关键字都是低调!

【讨论】:

  • @aybe 我确实得到了纠正,我的错!我不知道您可以使用[field: SerializeField] 强制直接序列化属性。请取消删除您的回答;)
  • 与此并行(derHugo 可能已经知道这个,但对于未来的读者......),您可以强制 non- 序列化(并隐藏在编辑器中)使用[System.NonSerialized] 的公共字段
  • @Immersive 我很确定,在这种情况下,序列化是明确需要的,以便将其保存并在 Inspector 中配置...否则您将只使用没有支持字段的属性首先;)
  • 真的!我经常使用 Odin,它通过编辑器公开属性,所以我偶尔需要显式禁用字段和属性。
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 2014-06-24
  • 2020-08-02
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2012-05-09
  • 2013-01-02
相关资源
最近更新 更多