private static void CloseCameraTestTool()
 {
     if (Camera.main != null)
     {
         CameraTestTool instance = Camera.main.gameObject.GetComponent <CameraTestTool>();
         if (instance != null)
         {
             GameObject.DestroyImmediate(instance);
         }
     }
     else
     {
         Debug.LogError("Cant find main camera.");
     }
 }
    public override void OnInspectorGUI()
    {
        CameraTestTool cameraTestTool = (CameraTestTool)target;

        cameraTestTool.m_TargetTransCache = EditorGUILayout.ObjectField("Target: ", cameraTestTool.m_TargetTransCache, typeof(Transform)) as Transform;
        //EditorGUILayout.Separator();
        EditorGUILayout.Space();

        cameraTestTool.m_fDefaultDistance = EditorGUILayout.FloatField("Default Distance: ", cameraTestTool.m_fDefaultDistance);
        cameraTestTool.m_fDefaultPitch    = EditorGUILayout.FloatField("Default Pitch: ", cameraTestTool.m_fDefaultPitch);
        cameraTestTool.m_fDefaultYaw      = EditorGUILayout.FloatField("Default Yaw: ", cameraTestTool.m_fDefaultYaw);
        if (GUILayout.Button("Rest to default"))
        {
            cameraTestTool.m_fDistance = cameraTestTool.m_fDefaultDistance;
            cameraTestTool.m_fPitch    = cameraTestTool.m_fDefaultPitch;
            cameraTestTool.m_fYaw      = cameraTestTool.m_fDefaultYaw;
        }
        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        cameraTestTool.m_fDistance = EditorGUILayout.FloatField("Distance: ", cameraTestTool.m_fDistance);
        cameraTestTool.m_fDistance = EditorGUILayout.Slider(cameraTestTool.m_fDistance, cameraTestTool.m_fDistanceMin, cameraTestTool.m_fDistanceMax);
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        cameraTestTool.m_fPitch = EditorGUILayout.FloatField("Pitch: ", cameraTestTool.m_fPitch);
        cameraTestTool.m_fPitch = EditorGUILayout.Slider(cameraTestTool.m_fPitch, cameraTestTool.m_fPitchMin, cameraTestTool.m_fPitchMax);
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        cameraTestTool.m_fYaw = EditorGUILayout.FloatField("Yaw: ", cameraTestTool.m_fYaw);
        cameraTestTool.m_fYaw = EditorGUILayout.Slider(cameraTestTool.m_fYaw, -180, 180);
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.Space();

        base.OnInspectorGUI();

        EditorGUILayout.LabelField("Camera Anim Name:  " + cameraTestTool.m_ExportFileName);

        if (GUILayout.Button("Clear Pitch Curve"))
        {
            cameraTestTool.m_PitchRock = new AnimationCurve();
        }
        if (GUILayout.Button("Clear Yaw Curve"))
        {
            cameraTestTool.m_YawRock = new AnimationCurve();
        }
        if (GUILayout.Button("Clear Distance Curve"))
        {
            cameraTestTool.m_DistanceRock = new AnimationCurve();
        }
        if (GUILayout.Button("Clear Offset Curve"))
        {
            cameraTestTool.m_OffsetYRock = new AnimationCurve();
        }
        if (GUILayout.Button("Clear All Curve"))
        {
            if (EditorUtility.DisplayDialog("警告,不可撤销", "清除正在编辑的所有曲线吗?", "是的", "再想想"))
            {
                cameraTestTool.m_PitchRock    = new AnimationCurve();
                cameraTestTool.m_YawRock      = new AnimationCurve();
                cameraTestTool.m_DistanceRock = new AnimationCurve();
                cameraTestTool.m_OffsetYRock  = new AnimationCurve();
            }
        }
        cameraTestTool.m_fRockDely = EditorGUILayout.FloatField("Delay Time: ", cameraTestTool.m_fRockDely);
        cameraTestTool.m_fRockTime = EditorGUILayout.FloatField("Rock Time: ", cameraTestTool.m_fRockTime);
        if (GUILayout.Button("Test Rock"))
        {
            cameraTestTool.StartTestRock();
            if (cameraTestTool.m_TargetTransCache != null)
            {
                AnimationTest animationTest = cameraTestTool.m_TargetTransCache.gameObject.GetComponentInChildren <AnimationTest>();
                if (animationTest != null)
                {
                    animationTest.Play();
                }
            }
        }
        EditorGUILayout.Space();

        if (GUILayout.Button("Export"))
        {
            string defaultName = cameraTestTool.m_ExportFileName == string.Empty ?
                                 "CameraAnimCurve" + (Convert.ToInt32(System.DateTime.Now.ToString("ddHHmmss")) * 10).ToString() :
                                 cameraTestTool.m_ExportFileName;
            string savePath = EditorUtility.SaveFilePanel("保存摄像机动画", DefaultSaveDir, defaultName, "txt");
            if (savePath.Length != 0)
            {
                cameraTestTool.m_ExportFileName = System.IO.Path.GetFileName(savePath);
                ExportCurve2TXT(cameraTestTool, savePath);
            }
        }
        if (GUILayout.Button("Import"))
        {
            if (EditorUtility.DisplayDialog("警告,不可撤销", "导入会覆盖正在编辑的所有曲线,确定要这么做吗?", "是的", "再想想"))
            {
                string defaultFilePath = DefaultSaveDir + cameraTestTool.m_ExportFileName + ".txt";
                string filePath        = EditorUtility.OpenFilePanel("打开摄像机动画", defaultFilePath, "txt");
                if (filePath.Length != 0)
                {
                    cameraTestTool.m_ExportFileName = System.IO.Path.GetFileName(filePath);
                    ReadCurveFromTxt(cameraTestTool, filePath);
                }
            }
        }
    }
    public void ReadCurveFromTxt(CameraTestTool cameraTestTool, string filePath)
    {
        StreamReader srRet;
        FileInfo     RetFile = new FileInfo(filePath);

        if (RetFile.Exists == false)
        {
            EditorUtility.DisplayDialog("出错了", "找不到指定的文件", "确定");
            return;
        }
        srRet = new StreamReader(filePath, System.Text.Encoding.Unicode);

        List <String> strList = new List <string>();
        // 表头
        string strLine = srRet.ReadLine();
        int    curveId = -1;

        if (strLine == null || srRet.EndOfStream == true)
        {
            EditorUtility.DisplayDialog("出错了", "数据文件错误", "确定");
            return;
        }
        // 读取总时长和延迟
        string[] SplitArrayNew = strLine.Split(new char[] { '\t' });
        cameraTestTool.m_fRockTime = (float)Convert.ToDouble(SplitArrayNew[SplitArrayNew.Length - 2]);
        cameraTestTool.m_fRockDely = (float)Convert.ToDouble(SplitArrayNew[SplitArrayNew.Length - 1]);

        // 第一行
        strLine       = srRet.ReadLine();
        SplitArrayNew = strLine.Split(new char[] { '\t' });
        if (SplitArrayNew[0] != null && SplitArrayNew[0] != "")
        {
            curveId = Convert.ToInt32(SplitArrayNew[0]);
        }
        else
        {
            EditorUtility.DisplayDialog("出错了", "数据文件错误", "确定");
            return;
        }

        if (curveId == 0)
        {
            strList.Add(strLine);
            // 读Pitch
            while (strLine != null && srRet.EndOfStream == false)
            {
                strLine = srRet.ReadLine();
                if (strLine != null)
                {
                    SplitArrayNew = strLine.Split(new char[] { '\t' });
                    if (SplitArrayNew[0] != null && SplitArrayNew[0] != "")
                    {
                        curveId = Convert.ToInt32(SplitArrayNew[0]);
                        break;
                    }
                    strList.Add(strLine);
                }
            }
            cameraTestTool.m_PitchRock = CreateCurve(strList);
            strList.Clear();
        }

        if (curveId == 1)
        {
            strList.Add(strLine);
            // 读Yaw
            while (strLine != null && srRet.EndOfStream == false)
            {
                strLine = srRet.ReadLine();
                if (strLine != null)
                {
                    SplitArrayNew = strLine.Split(new char[] { '\t' });
                    if (SplitArrayNew[0] != null && SplitArrayNew[0] != "")
                    {
                        curveId = Convert.ToInt32(SplitArrayNew[0]);
                        break;
                    }
                    strList.Add(strLine);
                }
            }
            cameraTestTool.m_YawRock = CreateCurve(strList);
            strList.Clear();
        }
        if (curveId == 2)
        {
            strList.Add(strLine);
            // 读Distance
            while (strLine != null && srRet.EndOfStream == false)
            {
                strLine = srRet.ReadLine();
                if (strLine != null)
                {
                    SplitArrayNew = strLine.Split(new char[] { '\t' });
                    if (SplitArrayNew[0] != null && SplitArrayNew[0] != "")
                    {
                        curveId = Convert.ToInt32(SplitArrayNew[0]);
                        break;
                    }
                    strList.Add(strLine);
                }
            }
            cameraTestTool.m_DistanceRock = CreateCurve(strList);
            strList.Clear();
        }
        if (curveId == 3)
        {
            strList.Add(strLine);
            // 读Offset
            while (strLine != null && srRet.EndOfStream == false)
            {
                strLine = srRet.ReadLine();
                if (strLine != null)
                {
                    SplitArrayNew = strLine.Split(new char[] { '\t' });
                    if (SplitArrayNew[0] != null && SplitArrayNew[0] != "")
                    {
                        curveId = Convert.ToInt32(SplitArrayNew[0]);
                        break;
                    }
                    strList.Add(strLine);
                }
            }
            cameraTestTool.m_OffsetYRock = CreateCurve(strList);
        }
    }
    public void ExportCurve2TXT(CameraTestTool cameraTestTool, string savePath)
    {
        StreamWriter swRet;
//		FileInfo RetFile = new FileInfo(savePath);
//		if (RetFile.Exists)
//		{
//			swRet = new StreamWriter(savePath, true, System.Text.Encoding.Unicode);
//		}
//		else
        {
            swRet = new StreamWriter(savePath, false, System.Text.Encoding.Unicode);
            swRet.WriteLine("曲线ID\t描述\t曲线节点索引\t时间\t值\t切入正切角度\t切出正切角度\t正切模式\t开始WrapMode(0Default 1Clamp 1Once 2Loop 4PingPong 8ClampForever)\t结束WrapMode(0Default 1Clamp 1Once 2Loop 4PingPong 8ClampForever)\t"
                            + cameraTestTool.m_fRockTime + "\t"
                            + cameraTestTool.m_fRockDely);
        }
        int nIndex = 0;

        if (cameraTestTool.m_PitchRock.length > 0)
        {
            int keyCount = 0;
            for (int i = 0; i < cameraTestTool.m_PitchRock.keys.Length; i++)
            {
                Keyframe frame = cameraTestTool.m_PitchRock.keys[i];
                string   strLine;
                if (i == 0)
                {
                    strLine = nIndex + "\t" + "Pitch" + "\t";
                }
                else
                {
                    strLine = "" + "\t" + "" + "\t";
                }
                strLine += keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" +
                           frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)cameraTestTool.m_PitchRock.preWrapMode + "\t" + (int)cameraTestTool.m_PitchRock.postWrapMode;

                swRet.WriteLine(strLine);
                keyCount++;
            }
        }

        nIndex = 1;
        if (cameraTestTool.m_YawRock.length > 0)
        {
            int keyCount = 0;
            for (int i = 0; i < cameraTestTool.m_YawRock.keys.Length; i++)
            {
                Keyframe frame = cameraTestTool.m_YawRock.keys[i];
                string   strLine;
                if (i == 0)
                {
                    strLine = nIndex + "\t" + "Yaw" + "\t";;
                }
                else
                {
                    strLine = "" + "\t" + "" + "\t";
                }
                strLine += keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" +
                           frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)cameraTestTool.m_YawRock.preWrapMode + "\t" + (int)cameraTestTool.m_YawRock.postWrapMode;

                swRet.WriteLine(strLine);
                keyCount++;
            }
        }

        nIndex = 2;
        if (cameraTestTool.m_DistanceRock.length > 0)
        {
            int keyCount = 0;
            for (int i = 0; i < cameraTestTool.m_DistanceRock.keys.Length; i++)
            {
                Keyframe frame = cameraTestTool.m_DistanceRock.keys[i];
                string   strLine;
                if (i == 0)
                {
                    strLine = nIndex + "\t" + "Distance" + "\t";;
                }
                else
                {
                    strLine = "" + "\t" + "" + "\t";
                }
                strLine += keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" +
                           frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)cameraTestTool.m_DistanceRock.preWrapMode + "\t" + (int)cameraTestTool.m_DistanceRock.postWrapMode;
                swRet.WriteLine(strLine);
                keyCount++;
            }
        }

        nIndex = 3;
        if (cameraTestTool.m_OffsetYRock.length > 0)
        {
            int keyCount = 0;
            for (int i = 0; i < cameraTestTool.m_OffsetYRock.keys.Length; i++)
            {
                Keyframe frame = cameraTestTool.m_OffsetYRock.keys[i];
                string   strLine;
                if (i == 0)
                {
                    strLine = nIndex + "\t" + "Offset" + "\t";;
                }
                else
                {
                    strLine = "" + "\t" + "" + "\t";
                }
                strLine += keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" +
                           frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)cameraTestTool.m_OffsetYRock.preWrapMode + "\t" + (int)cameraTestTool.m_OffsetYRock.postWrapMode;
                swRet.WriteLine(strLine);
                keyCount++;
            }
        }
        swRet.Close();
        swRet.Dispose();
    }