【发布时间】:2019-07-31 05:31:16
【问题描述】:
我正在使用 unity 创建一个 2D 汽车游戏。基本思路是在玩家收集硬币时添加硬币计数并在游戏结束菜单中显示收集到的硬币。在我的 CoinCount 脚本中,在 OnTriggerEnter2D 中,我将硬币值添加到当前收集的硬币中。但是当游戏结束时,它有时会显示正确的答案,有时它会为收集的值添加 2 个或更多值。
//CoinCount script
void OnTriggerEnter2D(Collider2D colInfo)
{
int inc = 0;
if (colInfo.gameObject.CompareTag("Coin"))
{
inc = 5;
coinCount += inc;
print("coinCount" + coinCount);
AudioManager.instance.PlaySound("Coin");
}
currentBalance += inc;
PlayerPrefs.SetInt("CoinCount", currentBalance);
PlayerPrefs.Save();
}
我尝试维护一个公共类来管理硬币,但它会给出相同的结果。例如,如果我收集了 5 个价值为 5 的硬币,它应该显示 25 作为总硬币数。有时是 30 和 35。
public class GameScoreManager : MonoBehaviour
{
public static int value;
public Text currentScoreText;
// Start is called before the first frame update
void Start()
{
value = 0;
}
// Update is called once per frame
void Update()
{
currentScoreText.text = "$" + value.ToString();
print("Game coin count" + value);
}
}
这是我创建 GameScoreManager 类后的 CoinCount 脚本。
void OnTriggerEnter2D(Collider2D colInfo)
{
if (colInfo.gameObject.CompareTag("Coin"))
{
GameScoreManager.value += scoreValue;
}
}
我为每个硬币附加了这个脚本,以便在击中玩家后自行销毁它
public class DestroyCoin : MonoBehaviour
{
public GameObject effect;
//This script destroy the coin
void OnTriggerEnter2D(Collider2D colInfo)
{
if (colInfo.CompareTag("Player"))
{
Instantiate(effect, transform.position, transform.rotation);
Destroy(gameObject);
}
}
}
非常感谢您的帮助
【问题讨论】:
-
一般情况下:您不应该使用
PlayerPrefs来保存玩家进度。您的第一个代码 sn-p 与第二个代码有何关系?是这两种不同的方法还是两者都用? -
我编辑了这个问题。我尝试了两种方法并给出了相同的结果。
-
你确定
OnTriggerEnter2D只被调用一次吗?硬币是否可能正在移动或旋转,有时您会因为该运动而输入硬币,退出并再次进入? -
看起来你应该设置断点和debug你的代码,以便查看
GameScoreManager.value += scoreValue;行被调用的位置和时间 -
作为一般规则:不要在代码中的不同位置销毁您的硬币,而不是将其价值添加到玩家的分数中。这只是一种不好的做法,并为错误的发生而尖叫! (即使你认为它在技术上应该有效)即使它确实有效,你仍然应该对这样做感到非常内疚,因为它只是丑陋的 AF。