游戏制作之路(39)加载人形的动画4

栏目: 后端 · 发布时间: 5年前

内容简介:在前面只是实现不同动画之间进行无条件地转换执行,其实在游戏里,经常要切换动画执行的,比如让一个角色行走时播放的动画是行走的动画,如果角色要跳起来,播放的动画是跳动的动画,如果角色转身时,应该播放转身的动画。现在所有的动画都放到动画编辑器里了,如果想要动画在状态之间有条件地进行切换,就需要增加切换条件参数,这样才可以在脚本里设置触发条件。怎么样来添加触发切换状态的条件呢?下面就来解决这个问题。先要在动画编辑器里添加条件参数,如下图:在这里点击Parameters选项面,然后出现添加状态转换参数,再点击下面的加

在前面只是实现不同动画之间进行无条件地转换执行,其实在游戏里,经常要切换动画执行的,比如让一个角色行走时播放的动画是行走的动画,如果角色要跳起来,播放的动画是跳动的动画,如果角色转身时,应该播放转身的动画。现在所有的动画都放到动画编辑器里了,如果想要动画在状态之间有条件地进行切换,就需要增加切换条件参数,这样才可以在脚本里设置触发条件。怎么样来添加触发切换状态的条件呢?下面就来解决这个问题。先要在动画编辑器里添加条件参数,如下图:

游戏制作之路(39)加载人形的动画4

在这里点击Parameters选项面,然后出现添加状态转换参数,再点击下面的加号,就可以添加条件参数,如下图添加一个参数从空闲切换到跳动:

游戏制作之路(39)加载人形的动画4

点击加号之后,会弹出一个菜单,这个菜单里有几种数据类型,在这里选择Bool类型,就可以添加像C处这样的参数,把这个参数的名称改为Standing_Jump,当设置为true表示从空闲切换到跳动,设置false时从跳动状态切换到空闲状态,如下图:

游戏制作之路(39)加载人形的动画4

在这里,这个参数默认是false状态,因为后面那个选择框并没有勾选。

接着下来要把这个参数关联到切换连接线里,如下图:

游戏制作之路(39)加载人形的动画4

在这里选中空闲到跳转的连接线,然后在右边看到条件添加列表地方,在那里点击加号,就可以把这个条件变量添加到状态里了,如下图:

游戏制作之路(39)加载人形的动画4

从上图可以看到添加Standing_Jump,后面的true就是表示在代码设置为true时就可以播放跳动动画。同理,也可以设置相反的状态切换,点击从跳动到空闲的连接线,设置如下图:

游戏制作之路(39)加载人形的动画4

这里设置状态为false从跳动切换到空闲状态。

通过上面几步的设置,就把动态的状态条件创建完成了,下一步就是创建脚本代码,编写相应的控制代码了。接着来创建一个脚本youCond.cs来绑定you这个对象,如下图:

游戏制作之路(39)加载人形的动画4

点击A处的按钮,就可以添加脚本,把脚本命名为上面的名称。就可以打开脚本进行编辑,在里面添加下面的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class YouCond : MonoBehaviour {
    private Animator anim;
    private AnimatorStateInfo currentBaseState;

    private float timeCount = 0.0f;

    static int idleState = Animator.StringToHash("Base Layer.standing_idle");
    static int jumpState = Animator.StringToHash("Base Layer.Standing_Jump");
    // Use this for initialization
    void Start ()
    {
        anim = GetComponent<Animator>();
        timeCount = 0;
    }
	
	// Update is called once per frame
	void Update ()
    {
        currentBaseState = anim.GetCurrentAnimatorStateInfo(0);
        if (currentBaseState.fullPathHash == idleState)
        {
            if (Input.GetButtonUp("Jump"))
            {
                anim.SetBool("Standing_Jump", true);
                Debug.Log("Jump");
                timeCount = 0;
            }
        }
        else if (currentBaseState.fullPathHash == jumpState)
        {
            Debug.Log("Jump......");
            timeCount += Time.deltaTime;
            if (timeCount > 5.0f)
            {
                anim.SetBool("Standing_Jump", false);
            }
        }
    }
}

在这段代码里,主要使用Animator对象和AnimatorStateInfo对象,并且使用Animator.StringToHash()函数来计算指定动画的名称,这样计算出来的动画就是一串数字,可以大大地提高比较的速度,比字符串比较要快很多。同理,访问currentBaseState.fullPathHash也是为了更快的速度。

到这里,已经把人形动画学习完成了,也可以通过脚本进行触发指定的动画了。但还一个更复杂的动画Blend Tree,唯一的区别就是Montion指向的类型变成了Blend Tree类型,那么一个Blend Tree其实也就是一个状态,和状态不同的地方就是一个状态只能设定一个动画,而一个Blend Tree则可以设定为多个动画的混合。多个动画混合比较复杂,这里就不再学习了,有兴趣后面再自己学习。

https://blog.csdn.net/caimouse/article/details/51749579


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

注意力经济: 如何把大众的注意力变成生意

注意力经济: 如何把大众的注意力变成生意

吴修铭 / 中信出版集团股份有限公司 / 2018-4-1 / 69

编辑推荐 这本书由万维钢作序,并在《得到》日课中多次推荐!中文版未上市之前,中文前沿媒体就在力推这本书!关于注意力争夺战的历史和现在,作者给了权威的梳理和定位! 百年来,在争夺注意力的战场上,媒体、广告、商人、企业和大众成为博弈的主角。商人是如何在注意力争夺战中获利的?媒体是如何在改变报道形式的?广告是如何进化的?以及,营销是如何变得随处可见、无孔不入的呢?这本书讲述了令商人或企业从吸......一起来看看 《注意力经济: 如何把大众的注意力变成生意》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器