分数没有增加
本文关键字:增加 | 更新日期: 2023-09-27 18:27:46
我创建了一个简单的游戏,玩家与敌人发生碰撞,分数会增加一分。如何正确操作?
以下是我的代码:
public class Bird : MonoBehaviour {
public GameObject deathparticales;
public Vector2 velocity = new Vector2(-2, 0);
public float range = 5;
public int score;
private string scoreText;
// Use this for initialization
void Start()
{
score = 0;
rigidbody2D.velocity = velocity;
transform.position = new Vector3(transform.position.x, transform.position.y - range * Random.value, transform.position.z);
}
// Update is called once per frame
void Update () {
// Die by being off screen
Vector2 screenPosition = Camera.main.WorldToScreenPoint(transform.position);
if (screenPosition.x < -10)
{
Die();
}
scoreText = "Score: " + score.ToString();
}
void OnGUI ()
{
GUI.color = Color.black;
GUILayout.Label(scoreText);
}
// Die by collision
void OnCollisionEnter2D(Collision2D death)
{
if(death.transform.tag == "Playercollision")
{
score++;
Destroy(gameObject);
Instantiate(deathparticales,transform.position,Quaternion.identity);
}
}
void Die()
{
Application.LoadLevel(Application.loadedLevel);
}
}
问题
你试图更新Birds
中每个人的分数。
解决方案
你需要一个唯一目的就是处理分数的班级。
public class ScoreManager : MonoBehaviour
{
private int score = 0;
private static ScoreManager instance;
void Awake()
{
instance = this;
}
public void incrementScore(int amount)
{
score += amount;
}
public static ScoreManager getInstance()
{
return instance;
}
void OnGUI ()
{
string scoreText = "Score: " + score.ToString();
GUI.color = Color.black;
GUILayout.Label(scoreText);
}
}
然后,每次你想更新分数时,你都会调用另一个类的ScoreManager
,如下所示:
ScoreManager.getInstance().incrementScore(10);
如果所有代码都来自同一个脚本,问题是你增加了Bird类的一个实例的分数,然后杀死了那个实例:
score++;
Destroy(gameObject);
gameObject
指的是Bird类的这个实例所附加到的游戏对象。
Score变量只是公共的,这意味着Bird的每个实例都有自己的,但您可以从其他脚本访问该变量。如果您只想与所有Birds共享一个分数变量,可以将变量设为static
。
但如果您有多个bird,它们都将调用OnGUI函数并将值绘制到屏幕上。因此,改变你的设计并将分数移动到其他游戏对象可能是更好的主意。