加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何一次更新一个GUI得分?

发布时间:2020-12-16 02:02:43 所属栏目:百科 来源:网络整理
导读:如果一名玩家在我的游戏中获得X分数用于做某事,我希望记分牌能够更新显示0到X中的每个数字.我正在寻找一个模拟风格的评分系统,就像那些可以观察数字变化的旧时钟,除了变化很快就会发生,因为可以同时添加数百个点. 目前,当获得积分时,X点数会立即更新: /****
如果一名玩家在我的游戏中获得X分数用于做某事,我希望记分牌能够更新显示0到X中的每个数字.我正在寻找一个模拟风格的评分系统,就像那些可以观察数字变化的旧时钟,除了变化很快就会发生,因为可以同时添加数百个点.

目前,当获得积分时,X点数会立即更新:

/****************************** Platform Collision ***************************/

void OnCollisionEnter2D(Collision2D coll)
    {
        foreach(ContactPoint2D contact in coll.contacts)
        {   
            newPlayerHeight = transform.position.y;

            // Don't count the first jump
            if(newPlayerHeight < 0){
                newPlayerHeight = 0;
            }

            // If the player jumps down,don't reduce points
            // Add a tolerance for variable collision positions on same platform
            if(newPlayerHeight < oldPlayerHeight + -0.05f){
                newPlayerHeight = oldPlayerHeight;
            }

            // Send the height to the Score class
            Score.SP.updateScore(newPlayerHeight);

            oldPlayerHeight = newPlayerHeight;
        }
    }

/******************************* Score class *********************************/

public void updateScore (float newScore)
    {
        // Display GUI score
        score = (int)(newScore * 76);
        guiText.text = "Score" + score;

    }

我用一个for循环搞砸了试图实现这个但是无处接近.

解决方法

我刚刚创建了这个代码,它解决了你的问题.我目前正在自己??的游戏中使用它.

ScoreManager类的主要思想是保持得分并在每一帧更新它.它使用Stack来跟踪要添加的分数,这样我们就没有增加分数的幻数.

因此,当玩家获得新点时,只需调用addScore()函数,然后ScoreManager类将自行处理更新.

它会有一个始终运行的线程,它会逐位从currentScore增加到newScore,这样就可以像你想要的那样由用户观察到这种变化.

添加了该主题以减少您在发布的其他问题中遇到的“滞后”:Why is my game lagging huge when I call a method?

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

public class ScoreManager : MonoBehaviour 
{
    public GUIText score;

    private int currentScore = 0;
    public int scoreToUpdate = 0;

    private Stack<int> stack;

    private Thread t1;
    private bool isDone = false;

    void Awake() 
    {
        stack = new Stack<int>();
        t1 = new Thread(updateScore);
        t1.Start();
    }

    private void updateScore()
    {
        while(true)
        {
            if(stack.Count > 0)
            {
                int newScore = stack.Pop() + currentScore;

                for(int i = currentScore; i <= newScore; i++)
                {
                    scoreToUpdate = i;
                    Thread.Sleep(100); // Change this number if it is too slow.
                }

                currentScore = scoreToUpdate;
            }

            if(isDone)
                return;
        }
    }

    void Update() 
    {
        score.text = scoreToUpdate + "";
    }

    public void addScore(int point)
    {
        stack.Push(point);
    }

    public void OnApplicationQuit()
    {
        isDone = true;
        t1.Abort();
    }
}

我计划将此代码转换为Singleton,以便在我的游戏中只有一个此类的实例.我强烈建议你这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读