【问题标题】:How do I change text with a prefab?如何使用预制更改文本?
【发布时间】:2021-01-09 05:21:19
【问题描述】:

如何在 c# 脚本中创建和更改文本?

我目前有这段代码,但它不起作用,因为我告诉脚本我要更改的文本是什么:

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

public class treeBreak : MonoBehaviour
{
    public float woodCount = 0; 
    public Text woodText;
    private void OnTriggerEnter2D(Collider2D other){
        if (other.CompareTag("sword")){
        Destroy(gameObject);
        woodCount = woodCount + 1;
        }    
    }
    void Update(){
        woodText.text = woodCount.ToString();
    }
}

【问题讨论】:

  • 这根本行不通,因为您正在破坏物体的总木材数量。你的意思是要有一个静态的 woodCount 吗?
  • 在某些时候,您必须将您的 UI 与其重要的事物联系起来。如果您很少更改的 UI 跟踪经常更改的游戏对象,而不是相反,这会更容易。我绝对可以推荐查看 Unity 在其网站上提供的教程。

标签: c# unity3d prefab


【解决方案1】:

问题很少。首先,如果您销毁对象,则会丢失 woodCount 字段,因为它将与对象一起被销毁。其次,如果对象被销毁,Update 方法永远不会执行,因此文本不会更新。

解决方案 1: 解决此问题的更快方法是创建 woodCount static。然后更新 OnTriggerEnter2D 中的文本。

public class treeBreak : MonoBehaviour
{
    public static float woodCount = 0; // Stick with the class.
    
    public Text woodText;
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("sword"))
        {
            woodCount = woodCount + 1;
            woodText.text = woodCount.ToString();
            Destroy(gameObject);
        }
    }
}

解决方案 1: 如果您将游戏逻辑与 UI 分开,则更好的方法...例如:

public class TreeBreak : MonoBehaviour
{   
    public WoodCounter woodCounter;
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("sword"))
        {
            woodCounter.Collect();
            Destroy(gameObject);
        }
    }
}

public class WoodCounter : MonoBehaviour
{
    public Text woodText;

    private int woodCount = 0;

    public void Collect()
    {
        woodCount++;
        woodText.text = woodCount.ToString();
    }
}

PS:woodCount 只加一应该是整数

【讨论】:

    【解决方案2】:

    尝试交换这两行

    woodCount = woodCount + 1;
    Destroy(gameObject);
    
    
    private void OnTriggerEnter2D(Collider2D other){
            if (other.CompareTag("sword")){
              woodCount = woodCount + 1;
              woodText.text = woodCount.ToString();
              Destroy(gameObject);
            }   
    }
    

    【讨论】:

    • 还是不行。您需要在销毁发生之前更改文本。目前,该更改仅发生在 Update 中,并且无法保证更新将在销毁之前运行。
    • 哦,你是对的,你试过不更新吗? @沉浸式
    • 什么意思?
    猜你喜欢
    • 2020-01-17
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多