コード例 #1
0
        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);
        }
コード例 #2
0
    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();
    }
コード例 #3
0
        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);
        }
コード例 #4
0
    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;
    }
コード例 #5
0
ファイル: nodeParser.cs プロジェクト: liro0206/EgretUnity
        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);
        }
コード例 #6
0
    //当前选择的动画片段
    //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();
    }
コード例 #7
0
 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);
 }