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,以便在我的游戏中只有一个此类的实例.我强烈建议你这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |