unity DontDestroyOnLoad后跳转场景后不会出现重复物体

记录一下在DontDestroyOnLoad后,反复来回跳转场景确保物体的唯一性,话不多说看代码

public class Manager : MonoBehaviour
{
    private static Manager Instance;

    public static Manager GetInstance()
    {
        return Instance;
    }
      private void Awake()
  {
      if (Instance == null)
      {
          Instance = this;

          MaskCanvas = TraverseAllObjects("MaskCanvas").gameObject;
          Brake = TraverseAllObjects("BrakeCanvas").gameObject;
           DontDestroyOnLoad(gameObject);
           DontDestroyOnLoad(MaskCanvas);
           DontDestroyOnLoad(Brake);
      }
      else
      {
          if (Instance != this)
          {
              Destroy(TraverseAllObjects("MaskCanvas").gameObject);
              Destroy(TraverseAllObjects("BrakeCanvas").gameObject);
              Destroy(gameObject);
          }
      }
}    public static Transform TraverseAllObjects(string name)
 {
     
     Transform s = null;
     try
     {
         // 获取场景中所有的根物体
         GameObject[] rootObjects = SceneManager.GetActiveScene().GetRootGameObjects();
         // 遍历所有根物体和它们的子物体
         foreach (GameObject rootObject in rootObjects)
         {
          //   print(rootObject);
             TraverseHierarchy(rootObject.transform, name, ref s);
         }
         return s;
     }
     catch (System.Exception e) { return s; }
 }

 private static void TraverseHierarchy(Transform parent, string name, ref Transform returnObj)
 {
     try
     {
         if (parent.name == name)
         {
             returnObj = parent;
         }
     }
     catch (System.Exception) { }
     // 遍历当前父物体下的所有子物体
     foreach (Transform child in parent)
     {
         // 处理子物体,这里可以添加你的逻辑
         try
         {
             //  print(child.name+"   "+ name);
             if (child.name == name)
             {
                 returnObj = child;
             }

         }
         catch (System.Exception)
         {
             TraverseHierarchy(child, name, ref returnObj);

         }
         // 递归调用遍历子物体的子物体
         TraverseHierarchy(child, name, ref returnObj);

     }
 }
}

上面代码中不仅保留了物体的唯一性,还加入了一个查找Hierarchy面板物体的功能,查找范围在主场景中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值