冰咖啡 结论: 所有的寻找对象的函数原则上都不应该出现在Update/FixedUpdate这些频繁调用的函数里,这些函数往往在Start Awake OnEnable等这些初始化或者事件函数里使用。 Transform.Find (高效,可路径、可隐藏、) GameObject.Find (低效) GameObject.FindWithTag (少用) GameObject.FindGameObjectsWithTag (少用) Resources.FindObjectsOfTypeAll (低效,少用) Object.FindObjectsOfType (Type type) (低效,少用) GetComponentsInChildren( true)(低效,少用) 来源:https://blog.csdn.net/qq_42672770/article/details/107285591
肉饼 区别老大了! GameObject.Find是一个静态方法,transform.Find是一个实例方方法。这点决定了他的调用方法和调用情况完全不同。 var go = GameObject.Find("Player"); // 必须通过gameObject实例拿到transform实例,才可调用 var result = gameObject.transform.Find(sph); transform.Find只能查找返回子物体的transform。为什么GameObject.Find就可以查找全部呢?接下条区别 GameObject.Find是递归查找,而transform.Find不能递归。当然可以自己写方法去递归。 这两者返回的东西不同,GameObject.Find返回的是GameObject类型。transform.Find返回的是Transform类型。 Transform result = gameObject.transform.Find(sph); GameObject.Find查不到失活的物体,transform.Find失活物体的transform也能查到。
玉生于林 任何寻找的函数都不应当在Updata之类的生命周期中被调用,应当本地存储一个私有引用存储,这样可以有效的避免查找时的性能浪费。 在Unity开发中,大多数情况下,只使用Transform.find就已经足够了,例如查找下属所有某个脚本之类的。这种在管理清晰的情况下都不需要使用。 因为游戏的整体,包括子弹,玩家,道具,UI,都处于管理中,想要获取哪一个属性都可以找到,为什么还要去Get获取呢?