public void PasteAllMarked() { int components = Parser.Cabinet.Components.Count; try { Parser.Cabinet.BeginLoadingSkippedComponents(); foreach (object obj in Gui.Scripting.Variables.Values) { if (obj is Unity3dEditor && (Unity3dEditor)obj != this) { Unity3dEditor editor = (Unity3dEditor)obj; HashSet <Component> remove = new HashSet <Component>(); HashSet <Component> replace = new HashSet <Component>(); foreach (Component asset in editor.Marked) { Component loaded; if (asset is NotLoaded) { loaded = editor.Parser.Cabinet.LoadComponent(asset.pathID); remove.Add(asset); replace.Add(loaded); } else { loaded = asset; } switch (asset.classID2) { case UnityClassID.Texture2D: Texture2D tex = (Texture2D)loaded; tex.Clone(Parser.Cabinet); break; case UnityClassID.Cubemap: Cubemap cubemap = (Cubemap)loaded; cubemap.Clone(Parser.Cabinet); break; case UnityClassID.Material: Material mat = (Material)loaded; mat.Clone(Parser.Cabinet); break; case UnityClassID.Mesh: Mesh mesh = (Mesh)loaded; mesh.Clone(Parser.Cabinet); break; case UnityClassID.Shader: Shader shader = (Shader)loaded; shader.Clone(Parser.Cabinet); break; case UnityClassID.Sprite: Sprite sprite = (Sprite)loaded; sprite.Clone(Parser.Cabinet); break; case UnityClassID.Animator: Parser.Cabinet.MergeTypeDefinition(loaded.file, UnityClassID.GameObject); Parser.Cabinet.MergeTypeDefinition(loaded.file, UnityClassID.Transform); Animator anim = (Animator)loaded; anim.m_GameObject.instance.Clone(Parser.Cabinet); break; case UnityClassID.GameObject: Parser.Cabinet.MergeTypeDefinition(loaded.file, UnityClassID.GameObject); Parser.Cabinet.MergeTypeDefinition(loaded.file, UnityClassID.Transform); GameObject gameObj = (GameObject)loaded; Component clone = gameObj.Clone(Parser.Cabinet); Animator vAnim = new Animator(Parser.Cabinet, 0, 0, 0); vAnim.m_Avatar = new PPtr <Avatar>((Component)null); vAnim.m_GameObject = new PPtr <GameObject>(clone); if (loaded.file.Bundle.numContainerEntries(gameObj.m_Name, UnityClassID.GameObject) > 1) { Report.ReportLog("Warning! Animator " + gameObj.m_Name + " has multiple entries in the AssetBundle's Container."); } vAnim.file.Bundle.AddComponent(vAnim.m_GameObject.instance.m_Name, clone); VirtualAnimators.Add(vAnim); if (loaded != asset) { foreach (Animator a in editor.VirtualAnimators) { if (a.m_GameObject.asset == asset) { a.m_GameObject = new PPtr <GameObject>(loaded); break; } } } break; case UnityClassID.Avatar: Avatar avatar = (Avatar)loaded; avatar.Clone(Parser.Cabinet); break; case UnityClassID.MonoBehaviour: MonoBehaviour monoB = (MonoBehaviour)loaded; monoB.Clone(Parser.Cabinet); break; case UnityClassID.TextAsset: TextAsset text = (TextAsset)loaded; text.Clone(Parser.Cabinet); break; } } do { HashSet <Tuple <Component, Component> > loopSet = new HashSet <Tuple <Component, Component> >(AssetCabinet.IncompleteClones); AssetCabinet.IncompleteClones.Clear(); foreach (var pair in loopSet) { Component src = pair.Item1; Component dest = pair.Item2; Type t = src.GetType(); MethodInfo info = t.GetMethod("CopyTo", new Type[] { t }); info.Invoke(src, new object[] { dest }); } }while (AssetCabinet.IncompleteClones.Count > 0); foreach (Component asset in remove) { editor.Marked.Remove(asset); } foreach (Component asset in replace) { editor.Marked.Add(asset); } } } } finally { Parser.Cabinet.EndLoadingSkippedComponents(); if (components != Parser.Cabinet.Components.Count) { Changed = true; } } }
public void CopyTo(AnimatorController dest) { dest.m_ControllerSize = m_ControllerSize; using (MemoryStream mem = new MemoryStream()) { m_Controller.WriteTo(mem, dest.file.VersionNumber); BinaryWriter writer = new BinaryWriter(mem); writer.Write(m_TOS.Count); for (int i = 0; i < m_TOS.Count; i++) { writer.Write(m_TOS[i].Key); writer.WriteNameA4U8(m_TOS[i].Value); } mem.Position = 0; dest.m_Controller = new ControllerConstant(mem, dest.file.VersionNumber); BinaryReader reader = new BinaryReader(mem); int tosSize = reader.ReadInt32(); dest.m_TOS = new List <KeyValuePair <uint, string> >(tosSize); for (int i = 0; i < tosSize; i++) { dest.m_TOS.Add(new KeyValuePair <uint, string>(reader.ReadUInt32(), reader.ReadNameA4U8())); } } dest.m_AnimationClips = new List <PPtr <AnimationClip> >(m_AnimationClips.Count); for (int i = 0; i < m_AnimationClips.Count; i++) { Component clip = m_AnimationClips[i].instance; if (clip != null && dest.file != file) { if (dest.file.Bundle != null) { clip = dest.file.Bundle.FindComponent(m_AnimationClips[i].instance.m_Name, UnityClassID.AnimationClip); if (clip == null) { clip = m_AnimationClips[i].instance.Clone(dest.file); } else if (clip is NotLoaded) { NotLoaded notLoaded = (NotLoaded)clip; if (notLoaded.replacement != null) { clip = notLoaded.replacement; } else { clip = dest.file.LoadComponent(dest.file.SourceStream, notLoaded); } } } else { Report.ReportLog("AnimationClip " + m_AnimationClips[i].instance.m_Name + " not copied."); clip = null; } } dest.m_AnimationClips.Add(new PPtr <AnimationClip>(clip)); } if (file.VersionNumber >= AssetCabinet.VERSION_5_0_0) { using (MemoryStream stream = new MemoryStream()) { m_StateMachineBehaviourVectorDescription.WriteTo(stream); stream.Position = 0; dest.m_StateMachineBehaviourVectorDescription = new StateMachineBehaviourVectorDescription(stream); } dest.m_StateMachineBehaviours = new PPtr <MonoBehaviour> [m_StateMachineBehaviours.Length]; for (int i = 0; i < m_StateMachineBehaviours.Length; i++) { MonoBehaviour m = m_StateMachineBehaviours[i].instance; MonoBehaviour clone = m != null?m.Clone(dest.file) : null; dest.m_StateMachineBehaviours[i] = new PPtr <MonoBehaviour>(clone); } dest.m_MultiThreadedStateMachine = m_MultiThreadedStateMachine; } }