通过按钮单击C#减少变量

Posted

技术标签:

【中文标题】通过按钮单击C#减少变量【英文标题】:decrease variable by button click C# 【发布时间】:2021-05-15 06:38:21 【问题描述】:

我想通过单击一个按钮来减少一个值,但是它没有停留在并返回到开头的值, 这是我的代码,我应该添加或更改什么可以帮助我吗?

非常感谢

public class LifeShow : MonoBehaviour

    public GameObject Life; //where the variable will be decreased from
        
    public int Lifevalue;
    public string text;
    public Button returns;
    // Start is called before the first frame update
    void Start()
    
        Lifevalue = 1;

        Life.GetComponent<Text>().text = "Life : " + Lifevalue;
    

    // Update is called once per frame
    // clicking the button and the lifevalue variable decreases
    void Update()
    
        Button btn = returns.GetComponent<Button>();
        btn.onClick.AddListener(TaskOnClick);



        void TaskOnClick()
        
            Lifevalue-- ;

            Life.GetComponent<Text>().text = "Life : " + Lifevalue;

            
            

        
    

【问题讨论】:

我试图在代码中的变量附近添加描述,但我不确定它应该如何,因为我是 csharp 和论坛的新手:/ 你确定要btn.onClick.AddListener(TaskOnClick) 每一帧吗?通常你会注册事件处理程序一次 您应该将 TaskOnClick 函数移到更新函数之外。除此之外,您不需要仅针对此功能进行更新。单独创建 TaskOnClick 函数,更新函数的前 2 行应该在 start 函数内部。那应该可以。 我希望每次如果生命值大于 0,在按钮点击时减少,我应该使用其他东西来点击按钮吗? 是的,我对 Csharp 很陌生,我正在努力学习。感谢您的帮助 【参考方案1】:

您可以做的是将本地方法 void TaskOnClick() 更改为公共方法,方法是将其放在更新之外并使用 public 关键字,您可以统一添加 OnClick

现在点击“+​​”按钮并拖放脚本附加到的对象。然后你可以像这样找到

选择你的功能,你就准备好了。您不需要通过脚本执行此操作。 如果你想限制它不低于 0,你可以在脚本中添加 If 条件

if(LifeValue > 0)

  LifeValue--;
  // showing text

它将防止低于 0。

【讨论】:

非常感谢您的回答,它确实有效,但我的问题是当我回到开始场景时,生命值返回 1 而不是 0,我认为我应该更新它。 我希望整数在按下按钮时保持不变,当我按下按钮时它会更改整数但随后它会返回到开头的值,因此它不会减少。 它可能会导致您重新启动场景或重新加载。是的,如果你重新启动它会被重置,因为它没有保存【参考方案2】: OnClick + 添加监听器 将侦听器对象拖到插槽 (Life) 生活脚本中的选择功能(修改) 设置参数值1/-1/-99

[DisallowMultipleComponent]

public class Life : MonoBehaviour 

    public event System.Action<int> Changed; // event with INT attribute
    private int _amouth;

    public int Amouth  // this in property
        get => _amouth;
        // when you set Amouth, then change _amouth and invoke "Changed" event
        set 
            if (_amouth != value) 
                _amouth = value;
                Changed?.Invoke(_amouth);
            
        
    

    private void Start () 
        Amouth = 1;
    

    public void Modify (int number) 
        Amouth += number;
    


[DisallowMultipleComponent]
[RequireComponent(typeof(Text))]

public class LifeView : MonoBehaviour  // Add Component to text object

    [SerializeField] private Life _life; // set on inspector window
    private Text _text;

    public int LineAmouth  get; private set; 

    private void OnEnable () 
        _text = GetComponent<Text>();
        UpdateText(_life.Amouth);
        _life.Changed += UpdateText; // subscribes to Life event 
    

    private void OnDisable () 
        _life.Changed -= UpdateText;
    

    private void UpdateText (int amouth) 
        _text.text = "Life : "+amouth;
    

【讨论】:

【参考方案3】:

并不是真正的 Mono 专家,但首先,您似乎在每一帧都附加了一个事件处理程序,这并不好。代码应该是:

public class LifeShow : MonoBehaviour

    public GameObject Life; //where the variable will be decreased from
        
    public int Lifevalue;
    public string text;
    public Button returns;
    // Start is called before the first frame update
    void Start()
    
        Lifevalue = 1;

        Life.GetComponent<Text>().text = "Life : " + Lifevalue;
        Button btn = returns.GetComponent<Button>();
        btn.onClick.AddListener(TaskOnClick);
    

    // Update is called once per frame
    void Update()
    
        
    

    void TaskOnClick()
    
        Lifevalue-- ;
        Life.GetComponent<Text>().text = "Life : " + Lifevalue;
    

其次,Lifevalue 和 Life GameObject 之间的区别是什么,你能说清楚吗?

编辑:正如 cmets 中有人所说,此代码不足以提供良好的提示,您能否展示 Life 对象的代码?那会很有帮助。

【讨论】:

非常感谢,我会努力的,life gameobject 是一个文本对象,lifevalue 是我希望出现在下一个附近的变量 Lifevalue 是一个整数,Life 是一个游戏对象。 简单,我想我现在明白了。同样,不是 Mono 专家,但“returns”字段在哪里初始化?你调用returns.GetComponent @I-am-developer-9 嗯,这很清楚 :) 我只是不知道 Life 对象有什么作用/在那里 他用它来改变Life对象@Pit的Text组件的文本

以上是关于通过按钮单击C#减少变量的主要内容,如果未能解决你的问题,请参考以下文章

C#如何通过WebBrowser自动单击按钮

如何通过单击按钮 [C#] 执行 2 个 sql 查询

通过单击按钮将数据从 Access 获取到 C# 中的文本框

通过单击按钮使用 C# 从 MS Access 数据库中删除数据

如何通过按钮单击将数据导出到 linq c# 中的 .csv 文件

如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段