// 复制一个帧数据 // @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); }
// 模拟帧数据 //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); } }
// 绘制帧图像图标 // @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(); // 图标 }
// 绘制帧 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); }