using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Xml;
using System.IO;
using System.Text;
using System;

public class MyEditor : Editor
{
    /// <summary>
    /// 以下是SceneXML部分
    /// </summary>

    // 写当前obj,node的信息  ok!
    static void ExportGameObjectAsXML(XmlDocument xmlDoc, GameObject objParent, XmlElement nodeParent)
    {
        // 0. 将当前obj转化为预制体并保存到指定位置。注意:不要把子节点的内容包括进来
        // 不着急。先手工存成预制体,然后一个个处理

        // 1. 写入node的属性
        nodeParent.SetAttribute("name", objParent.name);                    // node Name
        nodeParent.SetAttribute("ID", objParent.name);                      //node ID
        nodeParent.SetAttribute("FBX", objParent.name);                     //node Prefab
        float objposition_x;
        float objposition_y;
        float objposition_z;
        objposition_x = objParent.GetComponent<Transform>().position.x;
        objposition_y = objParent.GetComponent<Transform>().position.y;
        objposition_z = objParent.GetComponent<Transform>().position.z;
        nodeParent.SetAttribute("Transform", objposition_x + " " + objposition_y + " " + objposition_z);  //Position
        float objrotation_x;
        float objrotation_y;
        float objrotation_z;
        objrotation_x = objParent.GetComponent<Transform>().eulerAngles.x;
        objrotation_y = objParent.GetComponent<Transform>().eulerAngles.y;
        objrotation_z = objParent.GetComponent<Transform>().eulerAngles.z;
        nodeParent.SetAttribute("Rotation", objrotation_x + " " + objrotation_y + " " + objrotation_z);  //Rotation
        float objscale_x;
        float objscale_y;
        float objscale_z;
        objscale_x = objParent.GetComponent<Transform>().localScale.x;
        objscale_y = objParent.GetComponent<Transform>().localScale.y;
        objscale_z = objParent.GetComponent<Transform>().localScale.z;
        nodeParent.SetAttribute("Scale", objscale_x + " " + objscale_y + " " + objscale_z);  //Scale

        // 2. 遍历obj的子节点,写入相关node
        for (int i = 0; i < objParent.transform.childCount; i++)
        {
            GameObject childObj = objParent.transform.GetChild(i).gameObject;
            string nodeName = "Part";
            if (childObj.gameObject.transform.childCount > 0)                   //判断节点类型
                nodeName = "Assembly";

            XmlElement childNode = xmlDoc.CreateElement(nodeName);
            nodeParent.AppendChild(childNode);
            ExportGameObjectAsXML(xmlDoc, childObj, childNode);
        }
    }

    //将所有游戏场景导出为XML格式 ok!
    [MenuItem("ProcessPlan/ExportScene")]
    static void ExportXML()
    {
        if (Selection.activeGameObject)
        {
            // 1. 选择存储xml文件的路径(窗口化自选路线)
            string filepath = EditorUtility.SaveFilePanel("Save scene", "", Selection.activeGameObject.name + "_scene.xml", "xml");
            if (!File.Exists(filepath))
            {
                File.Delete(filepath);
            }
            // 2. 定义xml文档
            XmlDocument xmlDoc = new XmlDocument();                                    // XML Define
            XmlDeclaration dec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);    // XML Declaration
            xmlDoc.AppendChild(dec);

            // 3. 定义xml的根节点
            XmlElement root = xmlDoc.CreateElement("World");           // Root note 
            root.SetAttribute("Speed", "20.1245215500000010");         // ??
            root.SetAttribute("Delay", "30000.0000000000000000");      // ??
            xmlDoc.AppendChild(root);

            // 4. 定义当前选中的场景节点
            GameObject sceneObj = Selection.activeGameObject;           //找到选中节点/高亮节点
            XmlElement sceneNode = xmlDoc.CreateElement("Scene");       // 定义场景节点
            root.AppendChild(sceneNode);
            ExportGameObjectAsXML(xmlDoc, sceneObj, sceneNode);         //写入note信息
            // 5.保存
            xmlDoc.Save(filepath);
            // 6.刷新与声明
            AssetDatabase.Refresh();
            Debug.Log("XML file has been generated!");
        }
        else
        {
            Debug.Log("You must select one target!");
        }
    }



    /// <summary>
    /// 以下是AO部分
    /// </summary>

    static void GetCurveParameters(XmlDocument xmlDoc, AnimationCurve curve, XmlElement nodeParent, string propertyName)       // obj: tool, part
    {
        XmlElement nodeCurve = xmlDoc.CreateElement("Curve");       // rotation
        nodeCurve.SetAttribute("name", propertyName);
        nodeParent.AppendChild(nodeCurve);

        foreach(Keyframe kf in curve.keys)
        {
            XmlElement CurveNodeKey = xmlDoc.CreateElement("KeyFrame");
            CurveNodeKey.SetAttribute("inTangent", kf.inTangent.ToString());
            CurveNodeKey.SetAttribute("outTangent", kf.outTangent.ToString());
            CurveNodeKey.SetAttribute("TangentMode", kf.tangentMode.ToString());
            CurveNodeKey.SetAttribute("time", kf.time.ToString());
            CurveNodeKey.InnerText = kf.value.ToString();

            nodeCurve.AppendChild(CurveNodeKey);
        }
    }

    // export steps of a process
    static void ExportPartsPart(XmlDocument xmlDoc, GameObject objParent, XmlElement nodeParent)       // obj: parts, tools
    {
        //1. 遍历该对象的子节点
        for (int i = 0; i < objParent.transform.childCount; i++)
        {
            GameObject objPart = objParent.transform.GetChild(i).gameObject;         // tool

            //1. 判断是否存在动画组件
            Animator ani = objPart.GetComponent<Animator>();
            if (ani != null)
            {
                XmlElement nodePart = xmlDoc.CreateElement("Part");
                nodeParent.AppendChild(nodePart);

                nodePart.SetAttribute("name", objPart.name);
                nodePart.SetAttribute("ID", objPart.name);

                AnimationClip[] clips = ani.runtimeAnimatorController.animationClips;

                // 取出关键数据
                foreach (AnimationClip clip in clips)
                {
                    foreach (var binding in AnimationUtility.GetCurveBindings(clip))
                    {
                        AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding);
                        GetCurveParameters(xmlDoc, curve, nodePart, binding.propertyName);
                    }
                }
            }
        }
    }

    // export steps of a process
    static void ExportToolsTool(XmlDocument xmlDoc, GameObject objParent, XmlElement nodeParent)       // obj: tools
    {
        //1. 遍历该对象的子节点
        for (int i = 0; i < objParent.transform.childCount; i++)
        {
            GameObject objTool = objParent.transform.GetChild(i).gameObject;         // tool

            //1. 判断是否存在动画组件
            Animator ani = objTool.GetComponent<Animator>();
            if (ani != null)
            {
                XmlElement nodeTool = xmlDoc.CreateElement("Tool");
                nodeParent.AppendChild(nodeTool);

                nodeTool.SetAttribute("name", objTool.name);
                nodeTool.SetAttribute("ID", objTool.name);

                AnimationClip[] clips = ani.runtimeAnimatorController.animationClips;

                // 取出关键数据
                foreach (AnimationClip clip in clips)
                {
                    foreach (var binding in AnimationUtility.GetCurveBindings(clip))
                    {
                        AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding);
                        GetCurveParameters(xmlDoc, curve, nodeTool, binding.propertyName);
                    }
                }
            }
            else
            {
                Debug.LogError("Please add animation to: " + objTool.name);
            }
        }
    }

    // export steps of a process
    static void ExportStepsChildren(XmlDocument xmlDoc, GameObject obj, XmlElement AOnode)
    {
        //1. 遍历该对象的子节点
        for (int i = 0; i < obj.transform.childCount; i++)
        {
            GameObject AOchildObj = obj.transform.GetChild(i).gameObject;               // parts or tools node
            XmlElement AOchildNode = xmlDoc.CreateElement(AOchildObj.name);

            AOnode.AppendChild(AOchildNode);

            if (AOchildObj.name == "Tools")
                ExportToolsTool(xmlDoc, AOchildObj, AOchildNode);
            else if (AOchildObj.name == "Parts")
                ExportPartsPart(xmlDoc, AOchildObj, AOchildNode);

        }
    }

    // export steps of a process
    static void ExportProcessSteps(XmlDocument xmlDoc, GameObject obj, XmlElement AOnode)
    {
        //1. 遍历该对象的子节点
        for (int i = 0; i < obj.transform.childCount; i++)
        {
            GameObject AOchildObj = obj.transform.GetChild(i).gameObject;
            XmlElement AOchildNode = xmlDoc.CreateElement("Step");
            AOchildNode.SetAttribute("StepName", AOchildObj.name);
            AOchildNode.SetAttribute("StepID", AOchildObj.name);

            AOnode.AppendChild(AOchildNode);
            ExportStepsChildren(xmlDoc, AOchildObj, AOchildNode);
        }
    }

    // Export processes of a plan
    static void ExportAOProcesses(XmlDocument xmlDoc, GameObject objAO, XmlElement AOnode)
    {
        //1. 遍历该对象的子节点
        for (int i = 0; i < objAO.transform.childCount; i++)
        {
            GameObject AOProcessObj = objAO.transform.GetChild(i).gameObject;

            XmlElement AOchildNode = xmlDoc.CreateElement("Process");
            AOchildNode.SetAttribute("ProcessName", AOProcessObj.name);
            AOchildNode.SetAttribute("ProcessID", AOProcessObj.name);
            AOchildNode.SetAttribute("WorkerName", "Cho");
            AOchildNode.SetAttribute("WorkerID", "00846");

            AOnode.AppendChild(AOchildNode);

            ExportProcessSteps(xmlDoc, AOProcessObj, AOchildNode);
        }
    }

    [MenuItem("ProcessPlan/ExportAO")]
    static void ExportAOXML()
    {
        if (Selection.activeGameObject)
        {
            // 1. 选择存储xml文件的路径
            string filepath = EditorUtility.SaveFilePanel("Save AO!", "", Selection.activeGameObject.name + "_AO.xml", "xml");
            if (!File.Exists(filepath))
            {
                File.Delete(filepath);
            }

            // 2. 定义xml文档
            XmlDocument xmlDoc = new XmlDocument();                                    // XML Define
            XmlDeclaration dec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);    // XML Declaration
            xmlDoc.AppendChild(dec);

            // 4. 定义当前选中的场景节点
            XmlElement planNode = xmlDoc.CreateElement("Plan");                               //工艺规划节点
            xmlDoc.AppendChild(planNode);
            planNode.SetAttribute("SceneName", "Scene01");
            planNode.SetAttribute("SceneID", "S01");
            planNode.SetAttribute("PlanName", Selection.activeGameObject.name);
            planNode.SetAttribute("PlanID", Selection.activeGameObject.name);

            GameObject sceneObj = Selection.activeGameObject;
            ExportAOProcesses(xmlDoc, sceneObj, planNode);                                        //写入note信息

            // 5.保存
            xmlDoc.Save(filepath);

            // 6.刷新与声明
            AssetDatabase.Refresh();
            Debug.Log("AOXML file has been generated!");
        }
        else
        {
            Debug.Log("You must select one target!");
        }
    }

    /// <summary>
    /// 点击后,所有设置了AssetBundle名称的资源会被 分单个打包出来
    /// </summary>
    /// 
    [MenuItem("ProcessPlan/Build (Single)")]
    static void Build_AssetBundle()
    {
        string pathStr = EditorUtility.OpenFolderPanel("Please select a Path", "", "");

        // BuildPipeline.BuildAssetBundles(Application.dataPath + "/Test_AssetBundle", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
        BuildPipeline.BuildAssetBundles(pathStr, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
        // 刷新
        AssetDatabase.Refresh();
    }

}

unity把场景和动画生成xml_子节点

导出的xml文件

scene.xml

<?xml version="1.0" encoding="utf-8"?>
<World Speed="20.1245215500000010" Delay="30000.0000000000000000">
  <Scene name="Plan01" ID="Plan01" FBX="Plan01" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
    <Assembly name="Process_legs" ID="Process_legs" FBX="Process_legs" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
      <Assembly name="P1" ID="P1" FBX="P1" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
        <Assembly name="Parts" ID="Parts" FBX="Parts" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
          <Part name="Leg01" ID="Leg01" FBX="Leg01" Transform="-5 0.35 -0.7" Rotation="0 0 0" Scale="0.05 0.7 0.05" />
          <Part name="Leg02" ID="Leg02" FBX="Leg02" Transform="-5 0.35 -1.36" Rotation="0 0 0" Scale="0.05 0.7 0.05" />
          <Part name="Leg03" ID="Leg03" FBX="Leg03" Transform="-5 0.35 -1.9" Rotation="0 0 0" Scale="0.05 0.7 0.05" />
          <Part name="Leg04" ID="Leg04" FBX="Leg04" Transform="-5 0.35 -2.44" Rotation="0 0 0" Scale="0.05 0.7 0.05" />
        </Assembly>
        <Part name="Tools" ID="Tools" FBX="Tools" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1" />
        <Part name="Hands" ID="Hands" FBX="Hands" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1" />
      </Assembly>
      <Assembly name="P2" ID="P2" FBX="P2" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
        <Assembly name="Parts" ID="Parts" FBX="Parts" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
          <Part name="Desktop" ID="Desktop" FBX="Desktop" Transform="-5 0.025 1" Rotation="0 0 0" Scale="2 0.05 1.5" />
        </Assembly>
      </Assembly>
      <Assembly name="P3" ID="P3" FBX="P3" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
        <Assembly name="Parts" ID="Parts" FBX="Parts" Transform="0 0 0" Rotation="0 0 0" Scale="1 1 1">
          <Part name="Magbox" ID="Magbox" FBX="Magbox" Transform="-5 0.15 0" Rotation="0 0 0" Scale="0.3 0.3 0.3" />
        </Assembly>
      </Assembly>
    </Assembly>
  </Scene>
</World>

AO.xml

<?xml version="1.0" encoding="utf-8"?>
<Plan SceneName="Scene01" SceneID="S01" PlanName="Plan01" PlanID="Plan01">
  <Process ProcessName="Process_legs" ProcessID="Process_legs" WorkerName="Cho" WorkerID="00846">
    <Step StepName="P1" StepID="P1">
      <Parts>
        <Part name="Leg01" ID="Leg01">
          <Curve name="m_LocalPosition.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-5</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">-0.95</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.35</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.35</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-0.7</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">-0.7</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.7</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.7</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
        </Part>
        <Part name="Leg02" ID="Leg02">
          <Curve name="m_LocalPosition.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-5</KeyFrame>
            <KeyFrame inTangent="5.1408" outTangent="5.1408" TangentMode="136" time="0.5833333">-3.7148</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.95</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.35</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0.5833333">0.35</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.35</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-1.36</KeyFrame>
            <KeyFrame inTangent="0.57024" outTangent="0.57024" TangentMode="136" time="0.5833333">-1.21744</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">-0.7</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0.5833333">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0.5833333">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0.5833333">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0.5833333">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.7</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0.5833333">0.7</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.7</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0.5833333">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
        </Part>
        <Part name="Leg03" ID="Leg03">
          <Curve name="m_LocalPosition.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-5</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">-0.95</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.35</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.35</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-1.9</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.7</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.7</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.7</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
        </Part>
        <Part name="Leg04" ID="Leg04">
          <Curve name="m_LocalPosition.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-5</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.95</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.35</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.35</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-2.44</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.7</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.7</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.7</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
        </Part>
      </Parts>
      <Tools />
      <Hands />
    </Step>
    <Step StepName="P2" StepID="P2">
      <Parts>
        <Part name="Desktop" ID="Desktop">
          <Curve name="m_LocalPosition.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-5</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.025</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.725</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">1</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">2</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">2</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.05</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.05</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">1.5</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">1.5</KeyFrame>
          </Curve>
        </Part>
      </Parts>
    </Step>
    <Step StepName="P3" StepID="P3">
      <Parts>
        <Part name="Magbox" ID="Magbox">
          <Curve name="m_LocalPosition.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">-5</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.15</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.9</KeyFrame>
          </Curve>
          <Curve name="m_LocalPosition.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="localEulerAnglesRaw.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.x">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.3</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.3</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.y">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.3</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.3</KeyFrame>
          </Curve>
          <Curve name="m_LocalScale.z">
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="0">0.3</KeyFrame>
            <KeyFrame inTangent="0" outTangent="0" TangentMode="136" time="1">0.3</KeyFrame>
          </Curve>
        </Part>
      </Parts>
    </Step>
  </Process>
</Plan>