Unity3D 学习笔记9 —— 3D模型动画控制

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://linsh-tech.blog.csdn.net/article/details/51130401

        在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));

展开阅读全文

没有更多推荐了,返回首页