用PlayerPrefs保存心脏

本文关键字:心脏 保存 PlayerPrefs | 更新日期: 2023-09-27 18:05:43

我正在用unity c#创建一个2d小行星射击游戏。我需要的是为下一关保留玩家的心。所以我刚刚取得了成绩,现在我需要的是挽救心脏。分数是为下一关保存的,所以它是这样运作的,在第一个关卡中,你在结束时有3000分,你进入下一个关卡,然后它将从3000开始,但如果你点击重新开始,或者如果你退出,你将从0开始。这就是得分的原理,同样的道理也适用于心脏。所以如果你带着1颗心完成第一关,那么你需要带着1颗心进入第二关。如果你完成2与3红心3红心将开始,如果你点击重启或如果你退出,那么它将从默认开始。心是图像UI,我想做像得分与球员的偏好,但我不确定如何。

if (col.gameObject.tag == "AsteroidBig") {
            if (heart.enabled == true && heart1.enabled == true && heart2.enabled == true) {
                heart.enabled = false;
                Instantiate (explosion, col.transform.position, col.transform.rotation);
                Vector3 pos = new Vector3 (0f, 0f, 0f);
                Instantiate (player, pos, Quaternion.identity);
                Destroy (col.gameObject);
                Destroy (this.gameObject);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
            } else if (heart1.enabled == true && heart2.enabled == true) {
                heart1.enabled = false;
                Instantiate (explosion, col.transform.position, col.transform.rotation);
                Vector3 pos = new Vector3 (0f, 0f, 0f);
                Instantiate (player, pos, Quaternion.identity);
                Destroy (col.gameObject);
                Destroy (this.gameObject);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
            } else if (heart2.enabled == true) {
                heart2.enabled = false;
                Instantiate (explosion, col.transform.position, col.transform.rotation);
                Vector3 pos = new Vector3 (0f, 0f, 0f);
                Instantiate (player, pos, Quaternion.identity);
                Destroy (col.gameObject);
                Destroy (this.gameObject);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
            } else if (heart.enabled == false && heart1.enabled == false && heart2.enabled == false) {
                Instantiate (explosion, col.transform.position, col.transform.rotation);
                Destroy (col.gameObject);
                Destroy (this.gameObject);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
                Instantiate (medast[Random.Range(0,medast.Length)],col.transform.position,col.transform.rotation);
                GameOverPanel.SetActive (true);
            }
        }

一个带有红心的if语句看起来是这样的,它有点混乱,但它是这样的。如果你触碰小行星,它会检查是否有3颗红桃,其中一颗为假,如果你有2颗红桃,那么另一颗将为假,以此类推,直到你没有红桃,你输掉。这就是碰撞的逻辑。请帮助拯救这颗心,问任何问题,因为我知道它是混乱的。

用PlayerPrefs保存心脏

您有两个选择,取决于哪个对您来说更容易。

1)创建一个静态类当你加载一个新关卡时,静态类不会重置,所以你可以在那里存储任何关于玩家的信息
public class GameData
{
    public static int NumberOfHearts = 3;
}

在你的代码中,你将更新NumberOfHearts以反映当你被小行星触摸时你有多少颗心。例如,

GameData.NumberOfHearts--; //We just got touched by an asteroid

2)场景管理器(不适用,如果你使用Application.LoadLevel())

你可以在场景的根部为你的玩家创建一个GameObject。
然后当你加载关卡时,你就会打电话SceneManager.MoveGameObjectToScene(playerObject, "sceneName")

有关MoveGameObjectToScene的更多信息,请参阅此处。

在这种情况下,对象将与任何脚本和子对象一起延续,因此您将在下一个关卡中拥有所有的心脏。