我创造了一个简单的游戏,其中玩家与敌人发生碰撞,分数将增加1。如何正确地做到这一点?
以下是我的代码:
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);
}
}
答案 0 :(得分:2)
您试图在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);
答案 1 :(得分:1)
如果所有代码都来自同一个脚本,问题是您正在增加一个Bird类实例的分数,然后终止该实例:
score++;
Destroy(gameObject);
gameObject
指的是附加了Bird类实例的游戏对象。
分数变量只是公共的,这意味着Bird的每个实例都有自己的,但您可以从其他脚本访问该变量。如果您只想与所有鸟类共享一个得分变量,则可以创建变量static
。
但是如果你有多只鸟,它们都会调用OnGUI函数并将值绘制到屏幕上。因此,最好更改设计并将分数移至其他游戏对象。