【问题标题】:Coin Persist script not working correctlyCoin Persist 脚本无法正常工作
【发布时间】:2021-08-12 08:58:32
【问题描述】:

我正在创建一个带有硬币拾取功能的 2D 平台游戏,一切正常,但是当您进入下一关时,该关卡的硬币拾取将无法正确加载。

我有一个带有 screenPersist 脚本的 screen Persist 游戏对象,然后我有一个带有 coinPickup 脚本的拾取物(硬币)。

唯一的问题是当您进入下一个级别时,该级别的硬币将无法加载。 分数和其他一切都很好。

以下是我的 scipts 示例。

  1. screenPesist 脚本。

     public class ScreenPersist : MonoBehaviour
     {
         int startingSceneIndex;
    
         private void Awake()
         {
             int numScenePersist = FindObjectsOfType<ScreenPersist>().Length;
    
             if (numScenePersist > 1)
             {
                 Destroy(gameObject);
             } else
             {
                 DontDestroyOnLoad(gameObject);
             }
         }
    
         // Start is called before the first frame update
         void Start()
         {
             startingSceneIndex = SceneManager.GetActiveScene().buildIndex;
         }
    
         // Update is called once per frame
         void Update()
         {
             int currentScenIndex = SceneManager.GetActiveScene().buildIndex;
    
             if (currentScenIndex != startingSceneIndex)
             {
                 Destroy(gameObject);
             }
         }
     }
    
  2. 硬币拾取脚本。

    public class CoinPickup : MonoBehaviour
    {
        [SerializeField] AudioClip coinPickupSFX;
        [SerializeField] int piontsForCoinPickup;
    
         private void OnTriggerEnter2D(Collider2D collision)
         {
             FindObjectOfType<GameSesion>().addToScore(piontsForCoinPickup);
             AudioSource.PlayClipAtPoint(coinPickupSFX, 
             Camera.main.transform.position);
             Destroy(gameObject);
         }
    }
    

【问题讨论】:

  • 我不确定 ScreenPersists 类与硬币加载有何关系。看起来您正在检查您是否在每一帧的起始场景中。如果您当前不在 satarting 场景中,则您正在销毁 ScreenPersist 游戏对象。
  • 我将硬币放在作为 screenPersist 游戏对象的子项嵌套的拾取游戏对象中
  • 我尝试在没有 screenPersist 类的情况下这样做,但是每次玩家死亡并且场景在检查点重新开始时,您已经拾取的硬币都会再次产生。
  • 如果你想在最后一个检查点重生玩家,那么就这样做。无需重新加载整个场景。跟踪最后一个检查点,并在玩家死亡后将其移动到那里。
  • 谢谢我已经解决了这个问题,我对 Unity 和 C# 还是很陌生,所以非常感谢您的帮助。

标签: c# unity3d


【解决方案1】:

如果您只是检查计数并删除,您目前无法控制 ScreenPersist GameObject 的哪个实例被销毁。 维护 DontDestroyOnLoad() 对象的单个实例的正确方法是这样的:

 public static ScreenPersist m_screenPersist;
private void Awake()
{
    DontDestroyOnLoad(gameObject);
    if (m_screenPersist == null) m_screenPersist = this;
    else Destroy(gameObject);
}

理想情况下,您不希望将硬币拾取作为 ScreenPersist GameObject 的子对象。最好有一个游戏管理器来更优雅地处理它,最后将您需要持久化的任何数据写入 ScreenPersist 类,或者写入可以用作 DontDestroyOnLoad 游戏对象的同一个 GameManager 类

【讨论】:

    【解决方案2】:

    如果您的硬币拾取器是 ScreenPersists 附加到的游戏对象的子对象,那么您正在销毁该对象。

    在更新方法(称为每一帧)中,您正在检查您是否在起始场景中。该对象将持续到下一个场景。加载场景后,它将检查它是否仍在起始场景中。如果没有,那么它会带着它的孩子毁灭自己。

    如果你想让它持久存在,我不确定你为什么要销毁它。所以解决办法就是把update方法里的东西去掉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 2015-07-27
      相关资源
      最近更新 更多