unity3d控制模型动画_unity3d角色人物模型动画怎么控制 - CSDN
  • Unity中,我们可以使用2D的Spine动画来制作核心战斗模块,当然也能用3D模型来制作,这时候我们需要学会使用的工具类就是Unity为我们提供的Animation动画控制类。  当我们将一个模型导入Unity中时,我们可以看到...

            在Unity中,我们可以使用2D的Spine动画来制作核心战斗模块,当然也能用3D模型来制作,这时候我们需要学会使用的工具类就是Unity为我们提供的Animation动画控制类。

            当我们将一个模型导入Unity中时,我们可以看到资源文件下有Animations和Materials两个目录,它们分别用于存放此3D模型的动画和材质。


    一、动画设置:

            在Animations目录下随便选中一个动画文件(以.anim为后缀),在属性(Inspector)面板中查看它的相关属性:

            

            我们可以看到这里设置的主要就是此动画的播放方式有五种:Default、Once、Loop、Ping Pong、Clamp Forever,但在实际使用中:

            Default和Once以及Clamp Forever并无明显区别,都是播放一次停止在最后一帧

            Loop:无限地循环播放动画

            Ping Pong:顾名思义就是反弹的意思,它的执行方式就是执行完一次动作之后反过来倒序执行一次回到初始状态。


    二、模型的动作选择:

            选中我们当前操作的模型,在Inspector中可以看到模型下面绑定了一个动画控制器,其中第一个属性Animation就是此模型的默认动作,切换动作其实就是通过改变这个属性的值来实现的:

            

            在模型的控制脚本中,我们可以声明一个公有的Animation对象,然后通过拖拽的方式在属性面板中为这个对象进行赋值:

            

    三、关键方法:

            Animation类在控制动作的方法中,比较常用的有:Play、Stop、PlayQueued、IsPlaying和AddClip

    1.Play:播放一个动作的接口,但必须是在之前的动作播放完的前提下再调用才有效,假如正在执行其他动作,则调用此方法无效

    2.Stop:无论当前是否正在执行动作,都立即停止在当前帧

    3.PlayQueued添加多个动作队列的时候调用,此时模型会依次执行队列中的动作,可用于动作拼接

    4.IsPlaying:判断当前是否正在执行动作

    5.AddClip:添加一个动画裁剪,即可只播放指定起点帧到终点帧部分的动作内容

    四:实践展示:

            在场景中放置一个模型,并用UGUI放置三个按钮,用于切换动作,预览图如下:

       

            在Canvas下我们绑定了模型的控制脚本ModelController:

    <span style="font-size:18px;">using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    
    public class ModelController : MonoBehaviour {
    	public Animation mAnimation;
    	
    	Button button_run,button_walk, button_attack;
    	// Use this for initialization
    	void Start () {
            /*Transform model_obj = GameObject.Find("qiya").transform;
            Animation animation = model_obj.GetComponent<Animation>();
            Debug.Log("length");
            animation.Stop();*/
            button_run = transform.FindChild("Button_run").GetComponent<Button>();
    		button_walk = transform.FindChild("Button_walk").GetComponent<Button>();
            button_attack = transform.FindChild("Button_jump").GetComponent<Button>();
    		
    		EventTriggerListener.Get(button_run.gameObject).onClick = OnButtonClick;
    		EventTriggerListener.Get(button_walk.gameObject).onClick = OnButtonClick;
    		EventTriggerListener.Get(button_attack.gameObject).onClick = OnButtonClick;
    	}
    
        /// <summary>
        /// 在这里监听按钮的点击事件
        /// </summary>
        /// <param name="go"></param>
        private void OnButtonClick(GameObject go) {
            if (go == button_run.gameObject){
                //确保可以立即切换动作
                mAnimation.Stop();
    			mAnimation.Play("move");
            }else if (go == button_walk.gameObject){
                mAnimation.Stop();
                AnimationClip clip = mAnimation.clip;
                //添加一个剪辑,设置起始帧与结束帧
                mAnimation.AddClip(clip, "walk",0,10,false);
                mAnimation.Play("walk");
            }
            else if (go == button_attack.gameObject){
                mAnimation.Stop();
                //保证第一个动画播放完毕在播放第二个动画
                mAnimation.PlayQueued("attack0",QueueMode.PlayNow);
                mAnimation.PlayQueued("idle0", QueueMode.CompleteOthers);
            }
        }
    	
    	// Update is called once per frame
    	void Update () {
    	
    	}
    }
    </span>
            如此,我们就实现了模型动作切换的处理。


    四、控制模型移动:

        移动包括两种形式:水平移动和旋转

        首先,我们需要设定两个常数:水平移动速度(TranslateSpeed)和中心旋转速度(RotateSpeed),然后通过获取模型的transform组件,然后调用相应的方法来实现模型的移动,例如:

    //向前移动
    model_obj.Translate(Vector3.forward * Time.deltaTime * TranslateSpeed);
    //向后移动
    model_obj.Translate(Vector3.forward * Time.deltaTime * (-TranslateSpeed));
    //向右旋转
    model_obj.Rotate(Vector3.up * Time.deltaTime * RotateSpeed);
    //向左旋转
    model_obj.Rotate(Vector3.up * Time.deltaTime * (-RotateSpeed));

    展开全文
  • using System.Collections;using System.Collections.Generic;...[System .Serializable ]public class Anim//游戏控制动画{ public AnimationClip idle; public AnimationClip runForward; publi...
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;


    [System .Serializable ]
    public class Anim//游戏控制动画
    {
        public AnimationClip idle;
        public AnimationClip runForward;
        public AnimationClip runBackward;
        public AnimationClip runRight;
        public AnimationClip runleft;
    }


    public class playermove : MonoBehaviour {
        public float h = 0.0f;
        public float v = 0.0f;
        //分配变量,
        private Transform tr;
        //移动速度变量
        public float movespeed = 10.0f;
        //旋转可使用Rotate函数,
        public float rotSpeed = 100.0f;
        //要显示到检视视图的动画类变量
        public Anim anim;
        //要访问下列3d模型animation组件对象的变量
        public Animation _animation;


        
       


    // Use this for initialization
    void Start () {
            //向脚本初始部分分配Tr组件
            tr = GetComponent<Transform>();
            
            //查找位于自身下级的anim组件并分配到变量。
            _animation = GetComponentInChildren<Animation>();


            _animation.clip = anim.idle;
            _animation.Play();


            


    }

    // Update is called once per frame
    void Update () {
             h = Input.GetAxis("Horizontal");
             v = Input.GetAxis("Vertical");


            Debug.Log("H=" + h.ToString());
            Debug.Log("V="+ v.ToString());


            //计算左右前后的移动方向向量。
            Vector3 moveDir = (Vector3.forward * v) + (Vector3.right * h);


            //translate(移动方向*time.deltatime*movespeed,space.self)
            tr.Translate(moveDir.normalized *Time.deltaTime*movespeed , Space.Self);


            //vector3.up轴为基准,以rotspeed速度旋转
            tr.Rotate(Vector3.up * Time.deltaTime * rotSpeed * Input.GetAxis("Mouse X"));


            if (v >= 0.1f)
            {
                //前进动画
                _animation.CrossFade(anim.runForward.name, 0.3f);
            }
            else if (v <= -0.1f)
            {
                //back animation
                _animation.CrossFade(anim.runBackward.name, 0.3f);
            }
            else if (h >= 0.1f)
            {
                //right animation
                _animation.CrossFade(anim.runRight.name, 0.3f);
            }
            else if (h <= -0.1f)
            {
                //left animation 
                _animation.CrossFade(anim.runleft.name, 0.3f);
            }
            else
            {
                _animation.CrossFade(anim.idle.name, 0.3f);


            }


            //以键盘输入值为基准,执行要操作的动画
        
           
    }
    }
    展开全文
  • FBX的使用与Animation设置是一个很有必要的技能,对于美工MM送过来的3D模型你应该懂得如何将其设置到游戏场景之中使用...下面列举两个例子,说明FBX的使用与Animation设置,说白了,就是3D模型如何在Unity3D中使用。 文

    FBX的使用与Animation设置是一个很有必要的技能,对于美工MM送过来的3D模型你应该懂得如何将其设置到游戏场景之中使用,不然真的羞死人的,这都不会。毕竟游戏里面许许多多的主角的动作都是一系列已经做好的3D动画,包括行走、攻击动作等,很少人在update()中来写一大堆来实现的。下面列举两个例子,说明FBX的使用与Animation设置,说白了,就是3D模型如何在Unity3D中使用。

    文中所用到的两个3D模型:

    Ezreal:http://download.csdn.net/detail/yongh701/9866792

    Alice:http://download.csdn.net/detail/yongh701/9866791

    一、材质贴图已打包为DDS、动画需要切割的FBX

    1、导入

    Ezreal是一个材质贴图已打包为DDS的FBX,其文件结构如下图所示:


    那么在Unity3D中直接导入这个FBX文件即可。


    导入之后如下图所示,可以看到Unity3D能够自动识别此类3D模型,同时,还能识别到3D模型中带有的动画,并且整个FBX模型所带的动画我们还能做个大致的预览,一般情况下,Take 001就是模型最初的动作。


    这个模型被导入到Unity3D就是一个预设Prefab存在,你可以随意拖放,关于什么是预设Prefab,在《【Unity3D】利用预设、实例化Instantiate和协程完成生成器》(点击打开链接)我已经提到过了,这里不再赘述了。我们可以直接将这个Ezreal拖入场景当中,并且在(0,5,-10)拖一个Directional light,给模型提供合理的光照,大家可以看到3D模型已经基本能够使用了。


    2、动画切割

    但这样还不行,我们刚才明明看到这个FBX模型是带有动画Take 001,而且Take 001里面带有3个动作的,一个是模型在静止时发呆的动作、一个是行走动作、一个是攻击的动作。我们需要将这样动作应用到模型上面来。

    首先,我们要在FBX模型的控制面板,设置Rig中的Animation Type为Legacy,Generation按默认就行,然后点击Apply将动画应用到这个模型上。在Unity3D一般使用Legacy动画。


    之后,我们需要对动画进行切割。打开Animation面板,添加三个片段,分别是idle发呆、run跑步、attack攻击,然后分别修改好名字。同时设置好其在Take 001的开始帧与结束帧,设置开始、结束帧的时候,可以边播放动画,边调试。一般美工MM也会告诉你,她设置的各段具体的开始结束帧,这里Ezreal的三段分别为0-39、40-65、66-96。同时对于idle与run的循环模式都从Once改成Loop,因为这是一个长期存在的行为。之后点击Apply,则可以看到Take 001被切割成我们要求的三段。


    3、动画处理

    之后我们则可以对这个模型附着如下的脚本AnimationScript.cs:

    using UnityEngine;
    using System.Collections;
    
    public class AnimationScript : MonoBehaviour
    {
        void Start()
        {
            Animation animation = this.animation;//动画控制器
            animation.Play("idle");//上来直接播放idle动画
        }
        void OnGUI()
        {
            if (GUI.Button(new Rect(0, 0, 100, 30), "行走"))
            {
                animation.Play("run");
            }
            if (GUI.Button(new Rect(100, 0, 100, 30), "停止"))
            {
                animation.Play("idle");
            }
            if (GUI.Button(new Rect(200, 0, 100, 30), "攻击"))
            {
                animation.Play("attack");
                animation.PlayQueued("idle");//播放完attack之后再播放idle
            }
        }
    }
    

    可以看到脚本很短,甚至大家看代码都能直接知道意思,运行结果如下:


    可以看到基本能够达到一个比较不错的水平了,如果你能有个做fbx模型做得很好的MM,和她配合下,其实基本实现很多东西了……当然现实中哪有这么浪漫?基本上要么自己一手包,要么就到外面的三维公司里面买,或者小成本点的,就自己收集些免费的fbx素材……

    上面的动画可以看到行走run这个动画,循环之间的分P还有点小跳跃,这个要么就是没切割好,要么就是动画本身问题,在整个动画,三个动作之间,留得空隙过短,导致不好分割,很遗憾,我这里是后者……毕竟这个素材我也是在网上收集的……


    这里说完一大类的FBX,下面说另一大类的FBX


    二、材质贴图没打包、动画不需要切割的FBX

    1、导入

    alice是一个材质贴图没打包好的fbx模型,文件模型如下图所示:


    那么我们需要在Unity3D的Assets根目录新建一个Textures文件夹,不可改名,就叫这个名字,不为什么。通过Import New Asset...一个一个将材质贴图导入,Import New Asset..貌似不支持多选的,所以只能一个一个导入。所以为了减少鼠标点击次数,请让你的美工MM,打包材质吧!那些做工精致的模型,估计材质贴图要上万。


    之后,我们才在Assets根目录导入这个FBX模型,一定要遵守这个顺序,不然导入的模型会丢失材质的。

    同样可以将个模型拖拽出来,沿Y轴旋转180度,也就是Rotation设置Y为180,并且与上面模型一样,在(0,5,-10)拖一个Directional light,给模型提供合理的光照。在Rig的动画同样设置为Legacy并且应用到模型。


    2、由于这个模型只有一个无须切割的动画,因此可以直接附着如下脚本AnimationScript2.cs:

    using UnityEngine;
    using System.Collections;
    
    public class AnimationScript2 : MonoBehaviour
    {
        void Start()
        {
            Animation animation = this.animation;
            animation.Stop();//由于只有一条动画,无须切割,Unity3D默认将会直接播放这个动画的
        }
        void OnGUI()
        {
            if (GUI.Button(new Rect(0, 0, 100, 30), "行走"))
            {
                animation.Play();
            }
            if (GUI.Button(new Rect(100, 0, 100, 30), "重新行走"))
            {
                animation.Rewind();
            }
            if (GUI.Button(new Rect(200, 0, 100, 30), "停止"))
            {
                animation["Take 001"].normalizedTime = 0;//定位到此动画的第0帧
                animation.Sample();//跳转
                animation.Stop();//再停止
            }
        }
    }
    
    这里基本已经完全展示如何使用Animation类的基本方法来控制动画了,其中这里唯一需要注意的一点,animation.Stop();单单是暂停动画,如果你想将动画调回第一帧再播放,需要如上的来使用Animation类的基本方法。

    运行效果如下所示:



    估计这两大例子基本已经能让大家明白Unity3D中3D模型的使用。

    展开全文
  • 描述:游戏运行中,某个特定手办模型在拖拽到场景中的某个位置后突然不显示,在Hierarchy中双击下这个模型又显示了%%%¥%……&%…… 排查:模型本身莫得问题,面数和其他模型也差不多,问了shader大佬说没做...

    描述:游戏运行中,某个特定手办模型在拖拽到场景中的某个位置后突然不显示,在Hierarchy中双击下这个模型又显示了%%%¥%……&%……

    排查:模型本身莫得问题,面数和其他模型也差不多,问了shader大佬说没做什么特殊处理,加载的时候代码里也没做特殊处理--------------------------TAT

    看图:

    好端端的模型

    拖拽过程

    松手(播了段动画然后消失,但是能点击,还能继续拖拽拽到其他地方还会出现)

    找到原因:历经各种实验发现,当scene场景右键旋转到视野里没有这个模型的时候,这个模型就会被停止渲染(What???)看图

    这样不会有问题

    这样就会有问题!!!(在scene场景看不到这个模型)

    但是在运行的时候所有应该被渲染的东西都会被sceneCamrea照到啊!!!再次仔细对比其他模型,发现这个模型被拖拽后会播放一个从天而降的动画!!!会跳很高,高到SceneCamera照不到它!!然而这个模型的culingMode用的是cullUpdateTransform,这会让它在照相机照不到的地方不渲染,然后就停止渲染了!!!(吐血~~~)

    解决办法:

    1 改模型动画,让它不至于跳出相机范围(需要动画小哥哥或者小姐姐配合)

    2 改Animator参数,至于怎么改,什么时候改,当然还是看项目需求啦,因为我们的模型数量比较多,所以是代码控制的,只有特定的模型被加载上来的时候才会被改这个参数。手动在编辑器中改也可以,如图

    完事儿。本人小菜鸟一只,水平不到位,欢迎大神纠错,但是不要开嘲讽哦~~~

    展开全文
  • 通过一个接口统一Animation 和 Animator 的动画控制. using System.Collections.Generic; using UnityEngine; [SerializeField] public interface AnimPlayInterface { bool isPlaying(); void Init(GameObject...
  • unity 代码控制动画播放
  • Unity3D一个带动画模型

    2020-07-29 14:20:44
    Unity3D一个带动画模型(魔兽) 动画
  • 解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D的动画系统(Legacy),虽然4.0出了新的动画控制系统,使用了一下功能相比原来确实强大不少,但还是将这次对于...
  • 模型动画片段上设置动画事件 反正麻烦,u3d有两种动画播放系统Animation\Animator, 没有办法预览 有的模型和动画是分开的,这时点击动画就没有办法播放,因为它找不到对应的模型. 只读动画片段 改 可写 大多数模型...
  • 文件是unity3d资源包,可以直接导入使用,拖拽到你的场景中即可开始使用和修改
  • 如果你指的是模型动画的话 是没办法取到具体的帧数的 因为那个动画是连续的曲线动画。只能知道现在在第几帧和第几帧之间。 通过nbalexis的方法计算:AnimationState.normalizedTime 的值始终都是从0到1的,然后你...
  • Unity3D角色FBX模型带动作动画,已经做好了动作动画的切割,直接导入即可使用,动画名称见FBX文件夹。Unity4.x版本的东西,应该是各个版本兼容。本资源收集于互联网,本人讲过整理与加工,仅供学习交流使用。毕竟在...
  • Unity3D源程序 模型动画 内部包含Unity3D 程序源码示例
  • Unity3D控制动画播放

    2016-05-02 13:22:26
      用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西。这次做一个TPS的项目就...解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D动画系统(Le
  • 创建一个地图和若干巡逻兵(使用动画); 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算; 巡逻兵碰撞到障碍物,则会自动选下一个点为目标; 巡逻兵在...
  • 对于2D手游,或许是更换对应的序列帧,也或许是如同3D手游一般,更换模型动画。对于游戏中的人物,一般分为头、上身、下身、武器四大部分就可以了。所以在游戏中,我们把这四部分单独做四个模型动画,然后动态拼接为...
  • using UnityEngine; using System.Collections; using System.IO; public class FrameAnimation : MonoBehaviour { public Texture2D image; public int w; public int h;... public float nextT...
  • 1 导入素材,会得到一个FBX的人物模型和一个AnimationControl动画控制器 2 将Zombienurse_Rig拖动到场景中,新生成一个僵尸护士 3 选择Asset中的ZombieAniController,并【Window】->...
  • 本篇将讲解一个通过Button来触发动画控制器的Trigger实现模型动画播放的实例,并不涉及其他动画播放的控制方法,但其他动画控制的解决思路都是类似的。 1.导入一个模型,创建一个动画控制器,并命名。 2.将动画文件...
  • Unity3D游戏开发FBX模型载入与人物行走动画的播放
1 2 3 4 5 ... 20
收藏数 7,859
精华内容 3,143
关键字:

unity3d控制模型动画