Unity2d中如何删除Checkpoint信息

Posted

技术标签:

【中文标题】Unity2d中如何删除Checkpoint信息【英文标题】:How to delete Checkpoint information in Unity2d 【发布时间】:2021-12-05 05:52:07 【问题描述】:

我有一个有效的检查点系统,它会保存坐标,但是当玩家通过关卡或场景时,下一个场景会加载到与上一关相同的位置。

我试着做一个

PlayerPrefs.DeleteAll();

但是我有一个场景菜单,可以在你每次完成一个关卡时解锁场景,而 PlayerPrefs.DeleteAll(); 删除了整个已通过关卡的列表。

如何删除下一个场景的检查点信息以在正确的位置加载。

此脚本在播放器脚本中:

private void Start()

    Rigidbody2D = GetComponent<Rigidbody2D>();
    Animator = GetComponent<Animator>();
    Advertisement.Initialize(gameId);

    if (PlayerPrefs.GetFloat("checkpointX") != 0)
    
        transform.position=(new Vector2(PlayerPrefs.GetFloat("checkpointX"), PlayerPrefs.GetFloat("checkpointY")));
    


public void recheadCheckPoint(float x, float y)

    PlayerPrefs.SetFloat ("checkpointX",x);
    PlayerPrefs.SetFloat ("checkpointY",y);

那么,它会将信息带到 CheckPointScript:

public class CheckPoint : MonoBehaviour

  
    private Animator Animator;
    public AudioClip Cat;

    private void Start()
    
        Animator = GetComponent<Animator>();
        


private void OnTriggerEnter2D(Collider2D collision)

    DixonMovement Dixon = collision.GetComponent<DixonMovement>();
    CheckPoint checkpoint = collision.GetComponent<CheckPoint>();

    if (Dixon != null)
    

        
        collision.GetComponent<DixonMovement>().recheadCheckPoint(transform.position.x, transform.position.y);
        Animator.SetTrigger("Duerme");
        Camera.main.GetComponent<Audiosource>().PlayOneShot(Cat);
    

    if (checkpoint != null)
    


        collision.GetComponent<DixonMovement>().recheadCheckPoint(transform.position.x, transform.position.y);
        Animator.SetTrigger("Duerme");
        Camera.main.GetComponent<AudioSource>().PlayOneShot(Cat);
    


然后我有了允许玩家加载新解锁关卡的场景控制器。

public void levelToLoad(int level)

    SceneManager.LoadScene(level);
    

如何在不影响其他 PlayerPrefs 的情况下删除 recheadCheckPoint(float x, float y) 以开始新关卡?

【问题讨论】:

除了答案中关于加载和保存的内容外,如果您只需要同一会话中的信息,我建议不要将值保存在 PlayerPrefs 中。 PlayerPrefs 在实现方面可能很慢并且非常特定于平台。在这种情况下,您可以改用静态变量。 【参考方案1】:

我有一个有效的检查点系统,它保存坐标,但是当玩家通过关卡或场景时,下一个场景加载到与最后一级。

除了删除检查点数据之外,您还可以保存检查点所在级别的id。然后在加载下一个级别时,您可以检查检查点是否位于当前级别 如果不是,则将其替换为当前级别的开始检查点。

或者,您可以保存 检查点 id 并通过查找匹配的检查点并从中获取起始位置或如果没有找到则使用默认位置来确定生成位置,而不是位置。

此外,如果到达检查点保存了玩家的当前位置,而不是由检查点确定的位置,则根据游戏的不同,玩家可能会处于不利位置。即玩家被敌人立即射击或发现的位置。

【讨论】:

【参考方案2】:

我想你要找的是PlayerPrefs.DeleteKey

public static void ResetCheckpoint()

    PlayerPrefs.DeleteKey("checkpointX");
    PlayerPrefs.DeleteKey("checkpointY");


顺便说一句,对于您的加载,您目前获得了两倍的价值!相反,您可以使用PlayerPrefs.HasKey

if (PlayerPrefs.HasKey("checkpointX"))

    transform.position = new Vector2(PlayerPrefs.GetFloat("checkpointX"), PlayerPrefs.GetFloat("checkpointY"));

【讨论】:

感谢您的帮助!并感谢您注意到这一点,我已经对其进行了更改并且效果很好。

以上是关于Unity2d中如何删除Checkpoint信息的主要内容,如果未能解决你的问题,请参考以下文章

Spark Streaming metadata checkpoint

FLinkFlink checkpoint 实现数据连续计算 恢复机制 拓扑图 变化 如何处理

如何用unity2d制作2drpg游戏场景

unity2d如何判断高度

记flink checkpoint 无法写入问题

检查点(Checkpoint)过程如何处理未提交的事务