public retData CheckBones(AniClip clip) { retData ret = new retData(); ret.info = string.Format("人物骨骼数:{0},动作骨骼数:{1}", allBones.Count, clip.boneinfo.Count); var count = Mathf.Min(clip.boneinfo.Count, allBones.Count); // for (int i = 0; i < count; i++) { if (allBones[i] != clip.boneinfo[i]) { ret.errorBones.Add(allBones[i]); ret.errorBones.Add(clip.boneinfo[i]); } //丢失节点 if (ani.transform.Find(clip.boneinfo[i]) == null) { ret.notExsitBones.Add(clip.boneinfo[i]); } } return(ret); }
private void DrawAniClipItem(AniClip clip) { GUILayout.BeginHorizontal(GUILayout.Width(300)); if (this._curClip == null) { return; } if (this._curClip.name == clip.name) { GUI.color = Color.green; } else { GUI.color = Color.white; } if (GUILayout.Button(clip.name)) { this._curClip = clip; } GUI.color = GUI.backgroundColor; if (GUILayout.Button("确定", GUILayout.Width(100))) { SkillBlock sb = new SkillBlock(); sb.AniName = clip.name; sb.Events = new List <SkillEvent>(); this._skillBlocks.Insert(this._index, sb); this.Close(); } GUILayout.EndHorizontal(); }
private int ClipFillTexture(ref Texture2D RefTexture, int Index, int BaseFrame) { AnimationClip Clip = _Clips [Index]; int TotalFrames = GetClipLength(Clip); Vector3[] BaseMeshVerts = _BaseMesh.vertices; // get base verts Vector3[,] Difference = new Vector3[BaseMeshVerts.Length, TotalFrames]; // create difference array // calculate difference vectors and macimal magnitude float MaxMagniture = 0f; // to find max magnitude for (int y = 0; y < TotalFrames; y++) // for each frame { Vector3[] FrameVerts = GetMesh(Clip, y).vertices; // get mesh at frame for (int x = 0; x < FrameVerts.Length; x++) // for each vertex in frame { Vector3 Vert = FrameVerts[x] - BaseMeshVerts[x]; // gradient of frame now and base mesh Difference [x, y] = Vert; float Magnitude = Vert.magnitude; if (Magnitude > MaxMagniture) { MaxMagniture = Magnitude; } } } // write in the texture for (int x = 0; x < Difference.GetLength(0); x++) { for (int y = 0; y < Difference.GetLength(1); y++) { Vector3 Direction = Difference [x, y]; float Magnitude = Direction.magnitude; Direction = Direction.normalized; RefTexture.SetPixel(x, (BaseFrame + y), new Color( RemappedPos(Direction.x), RemappedPos(Direction.y), RemappedPos(Direction.z), Magnitude / MaxMagniture )); } } _AniClips [Index] = new AniClip(_Clips[Index].name, BaseFrame, TotalFrames, MaxMagniture, _Clips[Index].frameRate); // set AniClip return(BaseFrame + TotalFrames); }
public static void Show(FB.PosePlus.AniPlayer aniPlayer = null, AniClip clip = null, int curfunc = -1, int curframe = -1) { var window = EditorWindow.GetWindow <Window_StateBlockFuncs>(false, "Block详细编辑"); window.Init(); if (clip != null) { _clip = Window_StateTable.aniPlayer.GetClip(Window_StateTable.selectBlock.playani); _subclip = clip.GetSubClip(Window_StateTable.selectBlock.playsubani); Debug.Log(Window_StateTable.selectBlock.playani); } else { _clip = clip; _subclip = clip.GetSubClip(Window_StateTable.selectBlock.playsubani); } if (curframe >= 0) { selectFrame = curframe; } if (curfunc >= 0) { SelectSelectFunc(Window_StateTable.selectBlock.funcs[curfunc]); } else { SelectSelectFunc(null); } clip = Window_StateTable.aniPlayer.GetClip(Window_StateTable.selectBlock.playani); if (clip != null) { _subclip = clip.GetSubClip(Window_StateTable.selectBlock.playsubani); } if (curfunc >= 0 && curfunc <= Window_StateTable.selectBlock.funcs.Count - 1) { SelectSelectFunc(Window_StateTable.selectBlock.funcs[curfunc]); } if (aniPlayer != null) { _aniPlayer = aniPlayer; } pickfunc = null; }
public string SaveAniClip(AniClip clip) { int id = clip.GetInstanceID(); string name = null; if (savecache.TryGetValue(id, out name)) { return(name); } using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { BitHelper.WriteAniClip(clip, ms); byte[] bs = ms.ToArray(); string sha1 = ResLibTool.ComputeHashString(bs); name = sha1 + ".aniclip.bin"; bufs[name] = bs; } return(name); }
//当前选择的动画片段 //private AniClip curClip = null; private void ShowClipFrame(AniClip ani) { GUILayout.Label("Animation pos:(" + curframe + "/" + ani.aniFrameCount + ")"); int nf = (int)GUILayout.HorizontalScrollbar(curframe, 1, 0, ani.aniFrameCount); anipos = EditorGUILayout.BeginScrollView(anipos, true, false, GUILayout.Height(230)); GUILayout.BeginHorizontal(); for (int i = 0; i < ani.aniFrameCount; i++) { var obc = GUI.backgroundColor; if (curframe == i) { GUI.backgroundColor = Color.green; } GUILayout.BeginVertical(GUILayout.Width(1)); var oc = GUI.color; string txt = "F"; if (ani.frames[i].key) { GUI.color = new Color(1.0f, 0.4f, 0.6f, 1.0f); txt = "K"; } GUILayout.Label(i.ToString()); if (GUILayout.Button(txt)) { nf = i; } //关键帧下需要条垂直的空格 if (ani.frames[i].key) { GUILayout.Space(123); } GUI.color = oc; if (ani.frames[i].key == false) { //调整曲线 GUILayout.BeginHorizontal(); GUILayout.Space(5); float lerp = GUILayout.VerticalScrollbar(ani.frames[i].lerp, 0.01f, 1.0f, 0, GUILayout.Height(120)); if (lerp != ani.frames[i].lerp) { ani.frames[i].lerp = lerp; ani.CalcLerpFrameOne(i); if (i == curframe) { SetFrame(curframe, true); EditorUtility.SetDirty(ani); } } GUILayout.EndHorizontal(); } //box帧按钮 string b_txt = "F"; if (ani.frames[i].box_key) { GUI.color = new Color(1.0f, 0.4f, 0.6f, 1.0f); b_txt = "K"; } if (GUILayout.Button(b_txt)) { nf = i; } GUI.color = oc; string d_txt = "○"; if (ani.frames[i].dot_key) { GUI.color = new Color(1.0f, 0.4f, 0.6f, 1.0f); d_txt = "●"; } if (GUILayout.Button(d_txt)) { nf = i; } GUILayout.EndVertical(); GUI.color = oc; GUI.backgroundColor = obc; } SetFrame(nf); GUILayout.EndHorizontal(); GUILayout.EndScrollView(); }
void ParseBlock(StateActionBlock block, AI_StateItem ai_item, AI_StateAttribute ai_attribute) { foreach (var f in block.funcs) { if (f.classname.Equals("attack")) { AniClip ac = ap.GetClip(block.playani); SubClip subAc = null; if (block.playsubani != "" && block.playsubani != null) { subAc = ac.GetSubClip(block.playsubani); } int begin = 0; int end = 0; if (subAc != null) { begin = (int)subAc.startframe; end = (int)subAc.endframe; } else { begin = 0; end = ac.frames.Count - 1; } for (int i = begin; i <= end; i++) //第一层,遍历frame { foreach (var box in ac.frames[i].boxesinfo) //第二层遍历box { if (box.mBoxType.Equals("box_attack")) { float pos = (box.mPosition.z + box.mSize.z / 2); if (ai_attribute.attackpos < pos) { ai_attribute.attackpos = pos; } } } } } else if (f.classname.Equals("move") || f.classname.Equals("force")) { ai_attribute.movenum = (ai_attribute.movenum + f.vecParam0); //记下位移 作为判断条件 } } foreach (var s in table.allStates) { if (s.conditions.Count == 0) { continue; } foreach (var c in s.conditions) { if (!c.stateBefore.Equals("stand") && !c.stateBefore.Equals("walk")) { if (c.stateBefore.Equals(ai_attribute.name)) { AI_CanChangeState _s = new AI_CanChangeState(); _s.state = s.name; if (c.cmdActive != "5") { _s.cmdstr = c.cmdActive; ai_attribute.canChangeState.Add(_s); } } } } } ai_item.cmdAttribute.Insert(0, ai_attribute); }