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();
}
}
导出的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>