我的游戏有分数。得分由gameobjects表示。碰撞事件的分数增加10。这些事件无法停止。我希望得分能够在有条件的“GameOver”上停止增加。
我想知道如何阻止分数增加,因为触发事件无法停止。得分= 0并不好,因为我希望显示玩家的最终得分。我需要以某种方式断开得分与GameOver时的实例化。或者我需要在GameOver时使分数整数保持不变。这实际上是一个概念性问题,我不知道如何解决这个问题。有什么想法吗?
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class ScoreHandler : MonoBehaviour {
public int score = 0;
public List<GameObject> destroyList = new List<GameObject>();
public static GameObject[] Score;
// Use this for initialization
void Start () {
score -= 80;
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter (Collision col)
{
if (col.gameObject.name == "carA") {
score += 10;
}
if(col.gameObject.name == "carB")
{
score += 10;
}
if(col.gameObject.name == "carC")
{
score += 10;
}
if(col.gameObject.name == "carD")
{
score += 10;
}
if(col.gameObject.name == "carE")
{
score += 10;
}
if(col.gameObject.name == "carF")
{
score += 10;
}
if(col.gameObject.name == "carG")
{
score += 10;
}
if(col.gameObject.name == "carH")
{
score += 10;
}
foreach (var go in destroyList)
{
Destroy(go);
}
destroyList.Clear();
string scoreText = score.ToString ();
Score = new GameObject[scoreText.Length];
for (int i = 0; i < scoreText.Length; i++) {
Score[i] = (GameObject)Instantiate (Resources.Load (scoreText
[i].ToString ()));
Score[i].layer = 8;
Score[i].transform.localScale = new Vector3 (0.02F, 0.02F,
0.02F);
Score[i].transform.localPosition = new Vector3 (0.013F + i *
0.01F, 0.12F, 0.0F);
Score[i].transform.Rotate (0, 180, 0);
destroyList.Add (Score[i]);
}
}
}
*此代码框有一个滚动条。
答案 0 :(得分:1)
如果你有GameOver
标志,事情会变得更容易。
假设游戏结束时有一个标记:
bool gameOverFlag = false;
.... //something else
void OnGameOver(){
.... //something else
gameOverFlag = true;
.... //something else
}
并且,只有在碰撞true
上游戏结束时event
才会增加得分(同时保留其他所有内容相同),这将非常简单:
if (col.gameObject.name == "carA") {
score += gameOverFlag ? 0 : 10; //this is where ternary operator will come really handy
//something else specific for carA, not for score
}
通过实施上述内容,只有你的分数不会在碰撞时改变
答案 1 :(得分:0)
如果游戏结束,为什么物体会发生碰撞?
让游戏在后台运行但停止交互的一种简单方法是在游戏结束时禁用玩家的对手。
GetComponent<Collider>().enabled = false;
另一个解决方案是检查游戏是否正在运行,然后只添加得分。
void OnCollisionEnter (Collision col)
{
if(!gameRunning)
return;
// score logic
}
但是,我建议您将代码部分分开,以便能够控制游戏的不同状态。如果您不想使用状态机,则可以使用枚举状态。这将使您的游戏变得更加复杂,从而更易于管理。
答案 2 :(得分:0)
只需检查分数是否为< 10
,我建议您将所有条件移到一个区块中:
void OnCollisionEnter (Collision col)
{
if ((col.gameObject.name == "carA" || col.gameObject.name == "carB" || col.gameObject.name == "carC"
|| col.gameObject.name == "carD" || col.gameObject.name == "carE"
|| col.gameObject.name == "carF" || col.gameObject.name == "carG"
|| col.gameObject.name == "carH") && score < 10 )
{
score += 10;
}
//Rest of the code
}