Unity 如何设定 Animator分割播放

项目有个需求,一整段非常长的Animator 动画, 分割成一份份的播放,我们点击相应的按钮就播放某个时间点的动画,废话不多说

新建一个空物体加上toggle group,

下面是一堆的toggle并在Group里加上父亲

 private Animator myAnimator;
    public List<Toggle> myTogglesList;
    private float playTime;
    public void Awake()
    {
        myAnimator = GameObject.Find("XXX/xxx").GetComponent<Animator>();
        myTogglesList.AddRange(transform.GetComponentsInChildren<Toggle>());
    }
    public void Start()
    {
        base.Start();
        for (int i = 0; i < myTogglesList.Count; i++)
        {
            Toggle go = myTogglesList[i];
            myTogglesList[i].onValueChanged.AddListener((bool value) => OnClickBtn(go.gameObject, value));
        }
    }

void Update()
    {
     //playTime  得到当前时间点
        playTime = myAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime;
        Debug.Log(playTime);
        if (myTogglesList[0].isOn && playTime > 0.1f)
        {
         //Animator.Play("ANI1", 0, 0f)  第一参数 ANI1动画名  第二参数0,为0层, 第三参数 0f,为开始时间
            myAnimator.Play("ANI1", 0, 0f);
        }
        if (myTogglesList[1].isOn && playTime > 0.3f)
        {
            myAnimator.Play("ANI1", 0, 0.1f);
        }
        if (myTogglesList[2].isOn && playTime > 0.5f)
        {
            myAnimator.Play("ANI1", 0, 0.3f);
        }
        if (myTogglesList[3].isOn && playTime > 0.8f)
        {
            myAnimator.Play("ANI1", 0, 0.5f);
        }
  .........................
    }
    private void OnClickBtn(GameObject go, bool value)
    {
        switch (go.name)
        {
            case "btn01 (1)":
                myAnimator.Play("ANI1", 0, 0f);
                break;
            case "btn01 (2)":
                myAnimator.Play("ANI1", 0, 0.1f);
                break;
            case "btn01 (3)":
                myAnimator.Play("ANI1", 0, 0.3f);
                break;
            case "btn01 (3)":
                myAnimator.Play("ANI1", 0, 0.5f);
                break;
                .........................
        }
    }

补充:Unity animator不剪辑动画实现 分段播放动画

我就废话不多说了,大家还是直接看代码吧~

public Animator anim;
    private AnimatorStateInfo animInfo;
    /// <summary>
    /// 控制动画暂停和播放
    /// </summary>
    int playSpeed = 0;
    void Update()
    {
        animInfo = anim.GetCurrentAnimatorStateInfo(0);
        //判断正在播放Take 001动画
        if (animInfo.normalizedTime < 0.99f && animInfo.IsName("Take 001"))
        {
            //第一段动画
            if (animInfo.normalizedTime > 0.19 && animInfo.normalizedTime < 0.2)
            {
                //达到条件时暂停播放动画
                print("暂停播放1");
                anim.speed = playSpeed;
            }
            //第二段动画
            else if (animInfo.normalizedTime > 0.39 && animInfo.normalizedTime < 0.4)
            {
                print("暂停播放2");
                anim.speed = playSpeed;
            }
            else
            {
                //自动设置回停止播放条件
                playSpeed = 0;
            }
        }
     }

    /// <summary>
    /// 开始播放动画
    /// </summary>
    private void PlayAnim()
    {
        //设置播放动画条件
        playSpeed = 1;
    }

animInfo.normalizedTime 动画状态标准化时间,一段动画值为从0~1。到1则动画播放完毕

animInfo.IsName("Take 001") 当前播放的动画,Take 001是动画名称

原理:首先要知道每段动画结束帧,然后该段动画结束帧除于总帧得到该结束帧在animInfo.normalizedTime 的值,最后作为条件暂停动画,继续播放动画可实现下一段动画的启停。

比如:有一个动画100帧,不剪辑,需要播放多段动画。

得知第一段的结束帧在20帧,那么20/100=0.2,0.2则为normalizedTime 值作为动画暂停条件(写条件的时候可以设个范围)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Unity 实现给物体动态添加事件

    介绍一个方法给物体动态的添加事件(点击 拖拽等) using System.Events; using System.EventSystems; //_go is the gameobject which need add event //_go 是物体,因为EventTrigger是unity中的一个组件,我们要用添加组件的方式来给物体添加事件触发组件 //_type is the EventTriggerType(point , drag , clickdown...... //_type

  • unity中点击某一个按钮播放某一个动作的操作

    1.创建动画控制器,双击打开动画控制器,创建 状态并添加动画片段,并且状态与状态之间进行连线,往返的都要有,在Animator的左上角–Parameters–点击加±-Trigger–命名(要求:第一个状态的名字+To+第二个状态的名字) 2.给状态与状态之间添加参数条件 选中状态与状态之间的线–检视视图上的Condition–点击+号–选择对应的参数条件 3.创建一个Button 切换到2D场景,在层级视图–Create–UI–Button按钮,调整到合适的位置,选中Canvas,把脚本挂上去

  • Unity 按钮事件封装操作(EventTriggerListener)

    我就废话不多说了,大家还是直接看代码吧~ using UnityEngine; using UnityEngine.EventSystems; namespace Mx.UI { public class EventTriggerListener :UnityEngine.EventSystems.EventTrigger { public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; public

  • Unity 修改FBX模型动画的操作

    如何在Unity里修改FBX模型自带的动画 我们在把模型做成预制体的时候会出现,模型当前看到的位置和动画播放的位置不一致,而且模型动画文件又是只能读不能改 就这种情况 修改办法 选择模型的动画文件按Ctrl+D复制一份出来再修改就行了,然后在重新引用复制出来的新动画文件 补充:unity中对导入的FBX动画进行重新编辑 在unity中,当我们打开一个fbx自带的动画的时候,会发现动画的关键帧视灰色的,在动画的名字后面有(read-only)的字样,我们没有办法对fbx的动画进行重新编辑,在某些情

  • Unity 如何批量修改FBX模型

    由于模型数量有点多,并且都要修改参数,还有从里面提取动画.就搜搜查查,搞了个小工具,批量的修改 FBX 模型的 参数,以及提取动画相关. using UnityEditor; using UnityEngine; using System.IO; using System.Collections; using System.Collections.Generic; public class ModifyMoidel : Editor { [MenuItem("BenBen/修改模型ModelSc

  • unity 如何判断鼠标是否在哪个UI上(两种方法)

    第一种 可以得到UI,再根据名字判断是不是自己自己要点击的UI 其中参数canvas拖入此UI的canvas /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { Poin

  • Unity中3DText显示模糊不清的解决方案

    在Unity中,当我们想要给3D物体一个文字说明时,使用Canvas下的Text虽然也能通过缩放实现,但是实现起来比较麻烦,改动的多,大小和位置也不容易控制. 此时就需要用到我们的3DText了,对于初次使用这个组件的"攻城狮"来说,会发现在Game场景中很模糊 具体修改操作如下: 此时,只需要选中当前3DText的物体,修改TextMesh组件下的Character Size和Font Size两个属性值.例如: 在这里,Character Size值越小,同时Font Size越大

  • Unity中EventTrigger的几种使用操作

    说起EventTrigger事件触发器,它的使用可以说是无处不在,EventTrigger继承了很多的事件接口,这些接口对我们开发是十分有用的. 弄懂EventTrigger在以后开发游戏过程中可以说是事半功倍. namespace UnityEngine.EventSystems { [AddComponentMenu ("Event/Event Trigger")] public class EventTrigger : MonoBehaviour, IEventSystemHan

  • Unity 点击UI与点击屏幕冲突的解决方案

    Unity 有点击屏幕进行移动操作,通过Input.GetMouseButtonDown(0).如果点击到了一些UI上面会触发点击屏幕事件. 引入UnityEngine.EventSystems,用函数判断一下即可 using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.EventSystems; public class

  • Unity 如何设定 Animator分割播放

    项目有个需求,一整段非常长的Animator 动画, 分割成一份份的播放,我们点击相应的按钮就播放某个时间点的动画,废话不多说 新建一个空物体加上toggle group, 下面是一堆的toggle并在Group里加上父亲 private Animator myAnimator; public List<Toggle> myTogglesList; private float playTime; public void Awake() { myAnimator = GameObject.Fin

  • 关于Unity动画状态机Animator使用教程

    目录 一.前言 二.Animator组件 三.Animator Controller文件 四.Animation Clip文件 五. 状态机的状态(State) 1.Any State状态 2.Entry状态 3.Exit状态 六.动画状态的属性 七.状态间的过渡关系(Transitions) 八.添加状态控制参数 九.编辑切换状态的条件 十.代码中控制状态 十一.检查动画状态 方法1.AnimatorStateInfo 方法2.继承StateMachineBehaviour 十二.控制播放速度

  • 聊聊Unity自定义组件之序列帧播放组件问题

    我们知道在unity中播放序列帧动画有两种方式,第一种是利用Unity自带的animation组件来播放,我们只需要在工程目录中全选选中所有我们需要播放的图片,将其拖动到Hiercarchy上,Unity就会帮我们自动创建一个animation片段,我们就可以用animation组件来控制我们的动画,不过这种方式创建的图片Sprite Renderer类型的.第二种方式就是创建一个Image组件,利用代码创建一个sprite,写一段代码利用Update函数来逐帧替换Image的sprite来实现

  • Unity代码实现序列帧动画播放器

    序列帧动画经常用到,最直接的方式就是用Animation录制.但某些情况下这种方式并不是太友好,需要靠代码的方式进行序列帧动画的实现. 代码实现序列帧动画,基本的思路是定义一个序列帧的数组/列表,根据时间的流逝来确定使用哪一帧并更新显示. NGUI的UI2DSpriteAnimation已经实现了此功能,但是它支持的目标只有Native2D的SpriteRenderer组件或者NGUI自身的UI2DSprite组件,并不支持UGUI的Image组件. 当然可以通过改写源码的方式来添加对Image

  • Unity通过BlendShape实现面部表情过渡切换Animation教程

    目录 一.前言 二.BlendShape(动画师.MAYA) 三.Unity控制BlendShapes 1.SkinnedMeshRenderer控制BlendShape 2.Animation控制BlendShape 四.结束语 一.前言 点关注不迷路,持续输出Unity干货文章. 嗨,大家好,我是新发. 在Unity项目中,我们可能需要实现3D角色表情的过渡切换,比如像这样子: 在Unity中如何做这个功能呢?今天就来跟大家讲一下. 二.BlendShape(动画师.MAYA) 在Maya中

  • Unity实战之制作动画编辑器

    为了更方便地为UI视图添加动画,将动画的编辑功能封装在了UI View类中,可以通过编辑器快速的为视图编辑动画.动画分为两种类型,一种是Unity中的Animator动画,该类型直接通过一个字符串类型变量记录动画State状态的名称即可,播放时调用Animator类中的Play方法传入该名称.另一种是DoTween动画,支持视图的移动.旋转.缩放.淡入淡出动画的编辑: 首先看一下动画相关的几个类的数据结构: using System; using UnityEngine; using DG.Tw

  • Android自定义View 实现闹钟唤起播放闹钟铃声功能

    先上图看一下闹钟唤期页面的效果 实现的功能: 1:转动的图片根据天气情况更换 2:转动时间可以设置,转动结束,闹铃声音就结束 3:光圈颜色渐变效果 直接上代码啦: package com.yuekong.sirius.extension.customview; import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; import andro

  • java音乐播放器课程设计

    一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中对多媒体编程的应用. 二.课程设计的要求 利用学到的编程知识和编程技巧,要求学生: 1.系统设计要能完成题目所要求的功能,设计的软件可以进行简单的播放及其他基本功能. 2.编程简练,可用,尽可能的使系统的功能更加完善和全面 3.说明书.流程图要清楚. 三.课程设计内容 1.课程设计的题目及简介 音乐播放软件要求: 有图形界面,能播放MP3歌曲,有播放列表,前一首.

  • 详解Unity 实现语音识别功能

    现在语音识别已经被广泛的应用到各个领域中,在Unity开发中,语音识别也非常受欢迎.大部分人都会选择科大讯飞的语音识别功能,但是在一些小的项目中,使用科大讯飞的就有点大材小用了.今天就介绍一下Unity自带的语音识别功能.说是语音识别,其实unity本身还是做不到的,Unity自带的语音识别功能其实是关键字识别.比如我在Unity中设定好一句话汇总的几个关键词.当我再说这句话的时候就会和识别到.经过测试发现当一句话中有八个关键字,这句话就会非常好的被识别出来. 接下来就一起来实现一下: 首先贴一

  • Unity中webgl使用避雷要素指南

    目录 1.不支持ios设备播放音频(无论是MP3还是ogg格式) 2.在ios设备的浏览器(无论是Safari 还是微信浏览器) 3.发布到webgl的时候注意所有Text都需要使用自定义的字体 4.若要更改loading界面 5.如果想做微信小程序可以通过laya进行后期制作 6.在本地iis服务器运行没有问题 7.在webgl中使用对象池模式可能会出现莫名其妙的状况 8.在webgl中调用接口动态生成元素还有个坑 1.不支持ios设备播放音频(无论是MP3还是ogg格式) 目前是通过unit

随机推荐