// does this type sync anything? otherwise we don't need to show syncInterval
        bool SyncsAnything(Type scriptClass)
        {
            // check for all SyncVar fields, they don't have to be visible
            foreach (FieldInfo field in InspectorHelper.GetAllFields(scriptClass, typeof(NetworkBehaviour)))
            {
                if (field.IsSyncVar())
                {
                    return(true);
                }
            }

            // has OnSerialize that is not in NetworkBehaviour?
            // then it either has a syncvar or custom OnSerialize. either way
            // this means we have something to sync.
            MethodInfo method = scriptClass.GetMethod("OnSerialize");

            if (method != null && method.DeclaringType != typeof(NetworkBehaviour))
            {
                return(true);
            }

            // SyncObjects are serialized in NetworkBehaviour.OnSerialize, which
            // is always there even if we don't use SyncObjects. so we need to
            // search for SyncObjects manually.
            // Any SyncObject should be added to syncObjects when unity creates an
            // object so we can check length of list so see if sync objects exists
            FieldInfo         syncObjectsField = scriptClass.GetField("syncObjects", BindingFlags.NonPublic | BindingFlags.Instance);
            List <SyncObject> syncObjects      = (List <SyncObject>)syncObjectsField.GetValue(serializedObject.targetObject);

            return(syncObjects.Count > 0);
        }
        void OnEnable()
        {
            if (target == null)
            {
                Debug.LogWarning("NetworkBehaviourInspector had no target object"); return;
            }

            // If target's base class is changed from NetworkBehaviour to MonoBehaviour
            // then Unity temporarily keep using this Inspector causing things to break
            if (!(target is NetworkBehaviour))
            {
                return;
            }

            Type scriptClass = target.GetType();

            syncVarNames = new List <string>();
            foreach (FieldInfo field in InspectorHelper.GetAllFields(scriptClass, typeof(NetworkBehaviour)))
            {
                if (field.IsSyncVar() && field.IsVisibleField())
                {
                    syncVarNames.Add(field.Name);
                }
            }

            syncListDrawer = new SyncListDrawer(serializedObject.targetObject);

            syncsAnything = SyncsAnything(scriptClass);
        }
 public SyncListDrawer(UnityEngine.Object targetObject)
 {
     this.targetObject = targetObject;
     syncListFields    = new List <SyncListField>();
     foreach (FieldInfo field in InspectorHelper.GetAllFields(targetObject.GetType(), typeof(NetworkBehaviour)))
     {
         if (field.IsSyncObject() && field.IsVisibleSyncObject())
         {
             syncListFields.Add(new SyncListField(field));
         }
     }
 }