有一个游戏对象,上面挂着 3 个脚本,如下:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class SaveAndRead : MonoBehaviour {
  6.  
  7. public static SaveAndRead instance;
  8.  
  9. /// <summary>
  10. /// 保存所有 单独的DataStore
  11. /// </summary>
  12. public List<DataStore> allAloneDataStores = new List<DataStore>();
  13.  
  14. /// <summary>
  15. /// 初始化SaveAndRead类
  16. /// </summary>
  17. public void InitSaveAndRead()
  18. {
  19. if (instance == null)
  20. {
  21. instance = new SaveAndRead();
  22. }
  23. }
  24.  
  25. void Awake()
  26. {
  27. InitSaveAndRead();
  28. GetAll_AreaDataStoresInTrigger();
  29. }
  30.  
  31. void GetAll_AreaDataStoresInTrigger()
  32. {
  33. //拿到所有子物体的 AreaAloneDataStores类
  34. AreaAloneDataStores[] temp_list02 = GetComponentsInChildren<AreaAloneDataStores>();
  35. for (int i = ; i < temp_list02.Length; i++)
  36. {
  37. for (int j = ; j < temp_list02[i].aloneDataStores.Count; j++)
  38. {
    allAloneDataStores.Add(temp_list02[i].aloneDataStores[j]);
  39. }
  40. }
  41. }
  42. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class DistinguishDataStoresInTrigger : MonoBehaviour {
  6.  
  7. /// <summary>
  8. /// 存放单独游戏对象的类
  9. /// </summary>
  10. AreaAloneDataStores temp_AreaAloneDataStorest;
  11. /// <summary>
  12. /// 存放触发Trigger的所有游戏对象的List
  13. /// </summary>
  14. public List<GameObject> objs = new List<GameObject>();
  15.  
  16. void Start()
  17. {
  18. //拿到存放单独游戏对象的类
  19. temp_AreaAloneDataStorest = gameObject.GetComponent<AreaAloneDataStores>();
  20. //确保先通过 OnTriggerEnter 拿到游戏对象 , 再调用 GetAllDataStores 拿到游戏对象上的 DataStore
  21. Invoke("GetAllDataStores", 1f);
  22. }
  23. /// <summary>
  24. /// 拿到所有触发Trigger的游戏对象
  25. /// </summary>
  26. /// <param name="other"></param>
  27. void OnTriggerEnter(Collider other)
  28. {
  29. if (other.gameObject.layer == )
  30. {
  31. objs.Add(other.gameObject);
  32. other.gameObject.SetActive(false);
  33. }
  34. }
  35. /// <summary>
  36. /// 拿到所有的DataStore
  37. /// </summary>
  38. void GetAllDataStores()
  39. {
  40. for (int i = ; i < objs.Count; i++)
  41. {
  42. //拿到 Trigger 的 DataStoreSaveToTrigger 脚本里面存的 DataStore
  43. DataStore temp_DataStore = objs[i].GetComponent<DataStoreSaveToTrigger>().dataStore;
  44. //Debug.Log(this.name + "--" + objs[i].name);
  45. //判断 DataStore 是否是Alone的,并加到不同的类的List里
  46. if (temp_DataStore.isAloneSave == true)
  47. {
    temp_AreaAloneDataStorest.aloneDataStores.Add(temp_DataStore);
  48. }
  49. }
  50. }
  51. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class AreaAloneDataStores : MonoBehaviour {
  6.  
  7. /// <summary>
  8. /// 单独的DataStore的List
  9. /// </summary>
  10. public List<DataStore> aloneDataStores = new List<DataStore>();
  11. }

Bug:

代码的意思是通过 DistinguishDataStoresInTrigger 脚本拿到一些游戏对象,然后对这些游戏对象上的 DataStoreSaveToTrigger 脚本里的 DataStore进行分类,DataStore里的isAloneSave是true时,就把 DataStore 放在 AreaAloneDataStores类 的 aloneDataStores 里。

当时是有2个 DataStore 的 isAloneSave 是 true ,在 DistinguishDataStoresInTrigger 脚本 进行判断后,也确实放了2个 DataStore 到 AreaAloneDataStores类 的 aloneDataStores 里,但是在 SaveAndRead脚本 里通过 temp_list02[i].aloneDataStores 来获得AreaAloneDataStores类 的 aloneDataStores 时,里面却一个也没有。

原因:

是 DistinguishDataStoresInTrigger脚本 里的 Invoke("GetAllDataStores", 1f);

因为它所以在 DistinguishDataStoresInTrigger脚本 执行了 Start 方法 1 秒之后,才开始执行 GetAllDataStores 方法,才把 2 个 DataStore 放到 AreaAloneDataStores类 的 aloneDataStores 里。

而 SaveAndRead脚本 在Awake 方法里就通过 GetAll_AreaDataStoresInTrigger 方法拿到了 AreaAloneDataStores类 的 aloneDataStores 。

所以在 SaveAndRead脚本里拿到 AreaAloneDataStores类 的 aloneDataStores 的时候,DistinguishDataStoresInTrigger脚本 还没有把 2 个 DataStore 放到 AreaAloneDataStores类 的 aloneDataStores 里。

解决方法:

把 SaveAndRead类 Awake 方法里的 GetAll_AreaDataStoresInTrigger();  改为 Invoke("GetAll_AreaDataStoresInTrigger", 2f); 就可以了。

那些经历过的Bug Unity的Invoke方法的更多相关文章

  1. Unity Invoke 方法

    Invoke() 方法是 Unity3D 的一种委托机制 如: Invoke("a", 5);   它的意思是:5 秒之后调用 a() 方法: 使用 Invoke() 方法需要注意 ...

  2. (@WhiteTaken)Unity中Invoke的用法

    今天无意间读到大神写的代码,看到了Invoke函数,于是产生兴趣.后来才明白自己要学习的东西还有很多. 下面讲用法. Invoke是延时调用函数,在用Invoke函数之前需要引入命名空间using U ...

  3. Unity中Invoke 和 InvokeRepeating的区别

    Invoke() 方法是 Unity3D 的一种委托机制 如: Invoke("Test", 5);   它的意思是:5 秒之后调用 Test() 方法: 使用 Invoke() ...

  4. Unity MonoBehaviour.Invoke 调用

    使用 Invoke() 方法需要注意 3点: 1 :它应该在 脚本的生命周期里的(Start.Update.OnGUI.FixedUpdate.LateUpdate)中被调用: 2:Invoke(); ...

  5. JAVA深入研究——Method的Invoke方法。

    在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...

  6. JAVA深入研究——Method的Invoke方法

    http://www.cnblogs.com/onlywujun/p/3519037.html 在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用 ...

  7. JAVA深入研究——Method的Invoke方法(转)

    在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...

  8. 深入解析Java反射-invoke方法

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...

  9. JAVA深入研究——Method的Invoke方法(转)

    原文地址:http://www.cnblogs.com/onlywujun/p/3519037.html 在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一 ...

随机推荐

  1. 数据结构_sfdg(小F打怪)

    问题描述 小 F 很爱打怪, 今天因为系统 bug, 他提前得知了 n 只怪的出现顺序以及击倒每只怪得到的成就值 ai. 设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒钟出现一只新怪且没被击倒 ...

  2. java全栈day04--方法

    day04内容介绍 1  方法基础知识 2  方法高级内容 3  方法案例 一  方法的概念 A:为什么要有方法 提高代码的复用性 B   什么是方法 完成特定功能的代码块 修饰符  返回值类型  方 ...

  3. HDU 5373 The shortest problem (数学)

    题意:给定两个数的n和m,有一种操作,把 n 的各位数字加起来放到 n后面形成一个新数n,问重复 m 次所得的数能否整除 11. 析:这个题首先要知道一个规律奇数位的和减去偶数位的和能被11整除的数字 ...

  4. Vue国际化的使用

    首先是是在main.js文件中把国际化引入进来 import Vue from 'vue' import App from './App' import router from './router' ...

  5. Jquery学习理解 (课堂)

    Jquary概述 3 1.Jquary简介 3 1.1什么是jquery 3 2.使用jquary 4 2.1浏览器如何解析HTML文件 4 2.2利用选择器定位节点 4 2.3调用方法操作节点 5 ...

  6. 【RMQ】【Sparse_Table算法】

    摘自网友,具体哪个忘记了,抱歉~ 定义: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题: 对于长度为n的数列A,回答若干询问RMQ(A,i,j) ...

  7. oracle数据库性能

    性能视图V$开头 V$SYSTEM_EVENT 正在等待的资源的系统信息 V$SESSION_EVENT 会话累计发生的等待事件 V$SESSION_WAIT 会话正在等待或者曾经等待的详细时间信息 ...

  8. P4719 【模板】动态dp

    \(\color{#0066ff}{ 题目描述 }\) 给定一棵\(n\)个点的树,点带点权. 有\(m\)次操作,每次操作给定\(x,y\),表示修改点xx的权值为\(y\). 你需要在每次操作之后 ...

  9. D. Minimum Diameter Tree 思维+猜结论

    D. Minimum Diameter Tree 思维+猜结论 题意 给出一颗树 和一个值v 把该值任意分配到任意边上 使得\(\sum\limits_{i,j}p_{ij}=v\) 使得 这颗树任意 ...

  10. 去除掉svn目录

    使用svn提交时,造成有些文件锁住不能使用,百度得到下面相似问题以及解决方法: /*********************************************************** ...