예제 #1
0
    // 复制一个帧数据
    // @frameData:要复制的帧数据
    // return:帧数据
    public static EffectFrameData CopyFrameData(EffectFrameData frameData)
    {
        EffectFrameData nFrameData = new EffectFrameData();

        nFrameData.n  = frameData.n;
        nFrameData.aI = new EffectImageData[frameData.aI.Length];

        for (int i = 0; i < frameData.aI.Length; ++i)
        {
            EffectImageData imgData  = frameData.aI[i];
            EffectImageData nImgData = new EffectImageData();

            nImgData.i  = imgData.i;
            nImgData.sX = imgData.sX;
            nImgData.sY = imgData.sY;
            nImgData.r  = imgData.r;

            nImgData.c[0] = imgData.c[0];
            nImgData.c[1] = imgData.c[1];
            nImgData.c[2] = imgData.c[2];
            nImgData.c[3] = imgData.c[3];

            nFrameData.aI[i] = nImgData;
        }

        return(nFrameData);
    }
    // 从帧数据里面获取指定id的图片数据
    // @frameData:帧数据
    // @imgId:要获取的图片id
    public static EffectImageData GetImgDataFromFrame(EffectFrameData frameData, int imgId)
    {
        for (int i = 0; i < frameData.aI.Length; ++i)
        {
            EffectImageData imgData = frameData.aI[i];
            if (imgData.i == imgId)
            {
                return(imgData);
            }
        }

        return(null);
    }
예제 #3
0
    // 模拟帧数据
    //private void SimulateFrameData()
    //{
    //    int defFrameNum = m_effectData.aF.Length;
    //    for (int i = 0; i < defFrameNum - 1; ++i)
    //    {
    //        EffectFrameData frame1 = m_effectData.aF[i];
    //        EffectFrameData frame2 = m_effectData.aF[i + 1];

    //        m_listFrameData.Add(frame1);

    //        for (int j = frame1.n + 1; j < frame2.n; ++j)
    //        {
    //            EffectFrameData nFrameData = new EffectFrameData();
    //            nFrameData.n = j;

    //            m_listFrameData.Add(nFrameData);

    //            List<EffectImageData> listImgData = new List<EffectImageData>();

    //            for (int k = 0; k < frame1.aI.Length; ++k)
    //            {
    //                EffectImageData imgData1 = frame1.aI[k];
    //                EffectImageData imgData2 = GetImgDataFromFrame(frame2, imgData1.i);

    //                if(imgData2 != null)
    //                {
    //                    EffectImageData nImgData = new EffectImageData();
    //                    nImgData.i = imgData1.i;
    //                    nImgData.sX = EffectEditorUtil.EvaluteInperpolation(imgData1.sX, imgData2.sX, frame1.n, frame2.n, j);
    //                    nImgData.sY = EffectEditorUtil.EvaluteInperpolation(imgData1.sY, imgData2.sY, frame1.n, frame2.n, j);
    //                    nImgData.pX = EffectEditorUtil.EvaluteInperpolation(imgData1.pX, imgData2.pX, frame1.n, frame2.n, j);
    //                    nImgData.pY = EffectEditorUtil.EvaluteInperpolation(imgData1.pY, imgData2.pY, frame1.n, frame2.n, j);
    //                    nImgData.r = EffectEditorUtil.EvaluteInperpolation(imgData1.r, imgData2.r, frame1.n, frame2.n, j);
    //                    nImgData.c[0] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[0], imgData2.c[0], frame1.n, frame2.n, j);
    //                    nImgData.c[1] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[1], imgData2.c[1], frame1.n, frame2.n, j);
    //                    nImgData.c[2] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[2], imgData2.c[2], frame1.n, frame2.n, j);
    //                    nImgData.c[3] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[3], imgData2.c[3], frame1.n, frame2.n, j);

    //                    listImgData.Add(nImgData);
    //                }
    //                else
    //                {
    //                    listImgData.Add(imgData1);
    //                }

    //                nFrameData.aI = listImgData.ToArray();
    //            }
    //        }
    //    }

    //    m_listFrameData.Add(m_effectData.aF[defFrameNum - 1]);
    //}

    //// 从帧数据里面获取指定id的图片数据
    //private EffectImageData GetImgDataFromFrame(EffectFrameData frameData, int imgId)
    //{
    //    for(int i =0; i < frameData.aI.Length; ++i)
    //    {
    //        EffectImageData imgData = frameData.aI[i];
    //        if (imgData.i == imgId)
    //            return imgData;
    //    }

    //    return null;
    //}

    // 根据指定的帧更新显示
    // @effData:特效数据
    // @frameData:帧数据
    public void UpdateByFrame(EffectData effData, EffectFrameData frameData)
    {
        // 先创建足够的图片资源
        if (m_listImg.Count < frameData.aI.Length)
        {
            for (int i = m_listImg.Count; i < frameData.aI.Length; ++i)
            {
                Image img = Image.Instantiate(m_imgTemplate);
                img.transform.SetParent(transform);
                img.hideFlags = HideFlags.HideInHierarchy;

                m_listImg.Add(img);
            }
        }

        for (int i = 0; i < frameData.aI.Length; ++i)
        {
            Image           img       = m_listImg[i];
            EffectImageData imgData   = frameData.aI[i];
            EffectAssetData assetData = GetEffectImgAssetData(effData, imgData.i);
            if (assetData == null)
            {
                continue;
            }

            img.gameObject.SetActive(true);

            img.sprite = Resources.Load <Sprite>("EffectRaw/" + assetData.n);
            img.rectTransform.sizeDelta = new Vector2(assetData.w, assetData.h);
            img.transform.localPosition = new Vector3(imgData.pX, imgData.pY, 0);
            img.transform.localRotation = Quaternion.Euler(0, 0, imgData.r);
            img.transform.localScale    = new Vector2(imgData.sX, imgData.sY);
            img.color = new Color32((byte)imgData.c[0], (byte)imgData.c[1], (byte)imgData.c[2], (byte)imgData.c[3]);
        }

        for (int i = frameData.aI.Length; i < m_listImg.Count; ++i)
        {
            Image img = m_listImg[i];
            img.gameObject.SetActive(false);
        }
    }
예제 #4
0
    // 绘制帧图像图标
    // @imgData:图像数据
    private void DrawFrameImageItem(EffectImageData imgData)
    {
        if (CheckImgIsValid(imgData.i))
        {
            GUI.backgroundColor = Color.green;
        }
        else
        {
            GUI.backgroundColor = Color.red;
        }

        GUILayout.BeginVertical(new GUIStyle(EditorStyles.textField), GUILayout.Width(200), GUILayout.Height(480)); // 图标
        GUI.backgroundColor = m_defaultBgClr;

        GUILayout.BeginHorizontal(); // 第1行
        GUILayout.Label("资源id:", GUILayout.Width(55));
        imgData.i = EditorGUILayout.IntField(imgData.i, GUILayout.Width(100));

        if (GUILayout.Button("-", GUILayout.Width(20)))
        {
            List <EffectImageData> listData = new List <EffectImageData>(m_frameData.aI);
            listData.Remove(imgData);

            m_frameData.aI = listData.ToArray();
        }

        GUILayout.EndHorizontal(); // 第1行


        GUILayout.BeginHorizontal(); // 第2行
        Vector2 pos = new Vector2(imgData.pX, imgData.pY);

        pos        = EditorGUILayout.Vector2Field("位置:", pos);
        imgData.pX = pos.x;
        imgData.pY = pos.y;
        GUILayout.EndHorizontal();   // 第2行

        GUILayout.BeginHorizontal(); // 第3行
        Vector2 scale = new Vector2(imgData.sX, imgData.sY);

        scale      = EditorGUILayout.Vector2Field("缩放:", scale);
        imgData.sX = scale.x;
        imgData.sY = scale.y;
        GUILayout.EndHorizontal();   // 第3行

        GUILayout.BeginHorizontal(); // 第4行
        imgData.r = EditorGUILayout.FloatField("旋转:", imgData.r);
        GUILayout.EndHorizontal();   // 第4行

        GUILayout.BeginHorizontal(); // 第5行
        Color32 clr = new Color32((byte)imgData.c[0], (byte)imgData.c[1], (byte)imgData.c[2], (byte)imgData.c[3]);

        clr          = EditorGUILayout.ColorField("颜色:", clr);
        imgData.c[0] = clr.r;
        imgData.c[1] = clr.g;
        imgData.c[2] = clr.b;
        imgData.c[3] = clr.a;
        GUILayout.EndHorizontal(); // 第5行

        GUILayout.FlexibleSpace();


        GUILayout.BeginHorizontal(); // 最后1行

        if (GUILayout.Button("<"))
        {
            List <EffectImageData> listData = new List <EffectImageData>(m_frameData.aI);
            int idx = listData.IndexOf(imgData);

            if (idx == 0)
            {
                return;
            }

            listData.Remove(imgData);
            listData.Insert(idx - 1, imgData);
            m_frameData.aI = listData.ToArray();
        }

        GUILayout.Label("改层级", GUILayout.Width(40));

        if (GUILayout.Button(">"))
        {
            List <EffectImageData> listData = new List <EffectImageData>(m_frameData.aI);
            int idx = listData.IndexOf(imgData);

            if (idx == listData.Count - 1)
            {
                return;
            }

            listData.Remove(imgData);
            listData.Insert(idx + 1, imgData);
            m_frameData.aI = listData.ToArray();
        }

        GUILayout.EndHorizontal(); // 最后1行

        GUILayout.EndVertical();   // 图标
    }
예제 #5
0
    // 绘制帧
    private void DrawFrame()
    {
        GUI.backgroundColor = Color.black;
        GUILayout.BeginVertical(new GUIStyle(EditorStyles.textField), GUILayout.Width(WINDOW_WIDTH - 250), GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true));
        GUI.backgroundColor = m_defaultBgClr;
        m_frameScroPos      = GUILayout.BeginScrollView(m_frameScroPos, true, false, GUILayout.Height(120), GUILayout.Width(WINDOW_WIDTH - 270)); // true, false, GUILayout.Width(200), GUILayout.Height(100));

        EffectFrameData[] arrFrameData = m_effectData.aF;
        GUILayout.BeginHorizontal();
        for (int i = 0; i < arrFrameData.Length; ++i)
        {
            EffectFrameData frameData = arrFrameData[i];

            if (CheckFrameIsValid(frameData))
            {
                GUI.contentColor = Color.white;
            }
            else
            {
                GUI.contentColor = Color.red;
            }

            GUILayout.Label((frameData.n + 1).ToString(), m_styleFrameFont, GUILayout.Width(20));
            GUI.contentColor = m_defaultConClr;
        }

        GUILayout.Space(20);
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        for (int i = 0; i < arrFrameData.Length; ++i)
        {
            EffectFrameData frameData = arrFrameData[i];

            if (m_frameData == frameData)
            {
                GUI.backgroundColor = Color.green;
            }

            if (GUILayout.Button("", m_styleFrame, GUILayout.Width(20), GUILayout.Height(80)))
            {
                m_frameData = frameData;
            }

            GUI.backgroundColor = m_defaultBgClr;
        }

        GUILayout.Space(20);
        GUILayout.EndHorizontal();

        GUILayout.EndScrollView(); // 帧


        GUI.backgroundColor = Color.black;
        GUILayout.BeginHorizontal(new GUIStyle(EditorStyles.textField), GUILayout.Width(WINDOW_WIDTH - 250), GUILayout.Height(50));
        GUI.backgroundColor = m_defaultBgClr;

        GUILayout.BeginVertical();

        GUILayout.BeginHorizontal(new GUIStyle(EditorStyles.textField), GUILayout.Width(WINDOW_WIDTH - 250), GUILayout.Height(32));

        if (m_frameData == null)
        {
            GUI.contentColor = Color.white;
            GUILayout.Label("当前未选中帧");
            GUI.contentColor = m_defaultConClr;
        }
        else
        {
            GUI.contentColor = Color.white;
            GUILayout.Label("当前帧:", GUILayout.Width(50));
            GUI.contentColor = m_defaultConClr;
            int no = EditorGUILayout.IntField(m_frameData.n + 1, GUILayout.Width(100));
            if (no < 1)
            {
                no = 1;
            }

            m_frameData.n = no - 1;

            if (GUILayout.Button("播放", GUILayout.Width(50)))
            {
                if (!Application.isPlaying || EffectEditorUI.Inst == null)
                {
                    ShowNotification(new GUIContent("播放失败!,UNITY为在运行状态"));
                    return;
                }

                EffectEditorUI.Inst.Play(m_effectData);
            }
        }

        GUILayout.EndHorizontal();

        //if (m_frameData == null)
        //{
        //    GUILayout.Label("当前未选中帧", m_styleTittle, GUILayout.Width(WINDOW_WIDTH - 250), GUILayout.Height(32));
        //}
        //else
        //{
        //    GUILayout.BeginHorizontal();
        //    GUILayout.Label("当前选中第" + (m_frameData.frameNo + 1) + "帧:", GUILayout.Width(WINDOW_WIDTH - 250), GUILayout.Height(32));

        //    GUILayout.EndHorizontal();
        //    //GUILayout.Label("当前选中第" + (m_frameData.frameNo + 1) + "帧", m_styleTittle, GUILayout.Width(WINDOW_WIDTH - 250), GUILayout.Height(32));
        //}

        GUILayout.BeginHorizontal();
        if (GUILayout.Button("添加显示"))
        {
            if (m_frameData == null)
            {
                ShowNotification(new GUIContent("添加失败!当前没选中帧"));
                return;
            }

            List <EffectImageData> listData = new List <EffectImageData>(m_frameData.aI);
            listData.Add(new EffectImageData());
            m_frameData.aI = listData.ToArray();
        }
        if (GUILayout.Button("添加新帧"))
        {
            List <EffectFrameData> listFrame = new List <EffectFrameData>(m_effectData.aF);
            int             frameNum         = listFrame.Count;
            EffectFrameData nFrameData       = frameNum > 0 ? CopyFrameData(listFrame[frameNum - 1]) : new EffectFrameData();

            if (frameNum > 0)
            {
                nFrameData.n++;
            }

            listFrame.Add(nFrameData);
            m_effectData.aF = listFrame.ToArray();
            m_frameData     = nFrameData;
        }
        if (GUILayout.Button("复制选中帧到末尾"))
        {
            if (m_frameData == null)
            {
                ShowNotification(new GUIContent("复制失败!当前没选中帧"));
                return;
            }

            List <EffectFrameData> listFrame = new List <EffectFrameData>(m_effectData.aF);
            int             frameNum         = listFrame.Count;
            EffectFrameData nFrameData       = frameNum > 0 ? CopyFrameData(m_frameData) : new EffectFrameData();

            if (frameNum > 0)
            {
                nFrameData.n = listFrame[frameNum - 1].n + 1;
            }

            listFrame.Add(nFrameData);
            m_effectData.aF = listFrame.ToArray();
            m_frameData     = nFrameData;
        }
        if (GUILayout.Button("删除当前帧"))
        {
            if (m_frameData == null)
            {
                ShowNotification(new GUIContent("删除失败!当前没选中帧"));
                return;
            }

            List <EffectFrameData> listFrame = new List <EffectFrameData>(m_effectData.aF);
            int idx = listFrame.IndexOf(m_frameData);
            listFrame.Remove(m_frameData);

            m_effectData.aF = listFrame.ToArray();
            m_frameData     = null;

            if (listFrame.Count > 0)
            {
                if (idx == 0)
                {
                    m_frameData = listFrame[idx];
                }
                else if (idx >= listFrame.Count - 1)
                {
                    m_frameData = listFrame[listFrame.Count - 1];
                }
                else
                {
                    m_frameData = listFrame[idx];
                }
            }
        }

        GUILayout.EndHorizontal();

        GUILayout.EndVertical();
        GUILayout.EndHorizontal();

        // 帧数据
        m_frameDataScroPos = GUILayout.BeginScrollView(m_frameDataScroPos, true, false, GUILayout.Height(500), GUILayout.Width(WINDOW_WIDTH - 270)); // true, false, GUILayout.Width(200), GUILayout.Height(100));
        GUILayout.BeginHorizontal();
        if (m_frameData != null)
        {
            for (int i = 0; i < m_frameData.aI.Length; ++i)
            {
                EffectImageData imgData = m_frameData.aI[i];
                DrawFrameImageItem(imgData);
            }
        }
        GUILayout.EndHorizontal();
        GUILayout.EndScrollView(); // 帧数据



        GUILayout.FlexibleSpace();
        GUILayout.EndVertical(); // 大
    }
    // 模拟特效指定帧的帧数据
    // @effectData:特效数据
    // @frameNo:帧的编号
    // return:有效的帧序号,返回对应的帧数据;否则null
    public static EffectFrameData SimulateFrameData(EffectData effectData, int frameNo)
    {
        int defFrameNum = effectData.aF.Length;

        if (effectData.aF.Length < 2 || frameNo < 0)
        {
            return(null);
        }

        EffectFrameData lastFrameData = effectData.aF[defFrameNum - 1];

        if (frameNo > lastFrameData.n)
        {
            return(null);
        }

        // 找出最近的帧数据索引
        int targetLeftFrameIdx = 0;

        for (int i = 0; i < defFrameNum - 1; ++i)
        {
            EffectFrameData tmpFrame = effectData.aF[i];
            if (frameNo >= tmpFrame.n)
            {
                targetLeftFrameIdx = i;
            }
        }

        EffectFrameData frame1 = effectData.aF[targetLeftFrameIdx];
        EffectFrameData frame2 = effectData.aF[targetLeftFrameIdx + 1];

        EffectFrameData nFrameData = new EffectFrameData();

        nFrameData.n = frameNo;

        List <EffectImageData> listImgData = new List <EffectImageData>();

        for (int k = 0; k < frame1.aI.Length; ++k)
        {
            EffectImageData imgData1 = frame1.aI[k];
            EffectImageData imgData2 = GetImgDataFromFrame(frame2, imgData1.i);

            if (imgData2 != null)
            {
                EffectImageData nImgData = new EffectImageData();
                nImgData.i    = imgData1.i;
                nImgData.sX   = EffectEditorUtil.EvaluteInperpolation(imgData1.sX, imgData2.sX, frame1.n, frame2.n, frameNo);
                nImgData.sY   = EffectEditorUtil.EvaluteInperpolation(imgData1.sY, imgData2.sY, frame1.n, frame2.n, frameNo);
                nImgData.pX   = EffectEditorUtil.EvaluteInperpolation(imgData1.pX, imgData2.pX, frame1.n, frame2.n, frameNo);
                nImgData.pY   = EffectEditorUtil.EvaluteInperpolation(imgData1.pY, imgData2.pY, frame1.n, frame2.n, frameNo);
                nImgData.r    = EffectEditorUtil.EvaluteInperpolation(imgData1.r, imgData2.r, frame1.n, frame2.n, frameNo);
                nImgData.c[0] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[0], imgData2.c[0], frame1.n, frame2.n, frameNo);
                nImgData.c[1] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[1], imgData2.c[1], frame1.n, frame2.n, frameNo);
                nImgData.c[2] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[2], imgData2.c[2], frame1.n, frame2.n, frameNo);
                nImgData.c[3] = (int)EffectEditorUtil.EvaluteInperpolation(imgData1.c[3], imgData2.c[3], frame1.n, frame2.n, frameNo);

                listImgData.Add(nImgData);
            }
            else
            {
                listImgData.Add(imgData1);
            }

            nFrameData.aI = listImgData.ToArray();
        }

        return(nFrameData);
    }