using UnityEngine; using System; using System.Reflection; namespace Bonjour.Utils{ //The following helper provide a MonoBehaviro instance on the scene which can be used for calling MonoBehavior Methods such as Co routines public static class ComponentUtils { public static T GetCopyOf(this Component comp, T other) where T : Component { Type type = comp.GetType(); if (type != other.GetType()) return null; // type mis-match BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default | BindingFlags.DeclaredOnly; PropertyInfo[] pinfos = type.GetProperties(flags); foreach (var pinfo in pinfos) { if (pinfo.CanWrite) { try { pinfo.SetValue(comp, pinfo.GetValue(other, null), null); } catch { } // In case of NotImplementedException being thrown. For some reason specifying that exception didn't seem to catch it, so I didn't catch anything specific. } } FieldInfo[] finfos = type.GetFields(flags); foreach (var finfo in finfos) { finfo.SetValue(comp, finfo.GetValue(other)); } return comp as T; } public static Component CopyComponent(Component original, GameObject destination) { System.Type type = original.GetType(); Component copy = destination.AddComponent(type); // Copied fields can be restricted with BindingFlags System.Reflection.FieldInfo[] fields = type.GetFields(); foreach (System.Reflection.FieldInfo field in fields) { field.SetValue(copy, field.GetValue(original)); } return copy; } } }