Unity自定义序列帧播放器

2023-10-28


创建原因

使用Animator进行序列帧控制的话,播放到指定帧,重新播放这些操作使用起来非常的不方便,所以自己写了一个序列帧播放的脚本。


一、主要功能

1、播放,从指定帧播放
    public void Play() 
    {
        Play(0);
    }
    public void Play(int startFrame)
    {
        currentFrame = startFrame;
        spriteLoader.sprite = allAnimationTextures[startFrame];
        isPlaying = true;
    }
2、跳转到指定帧
   	public void Skip(int frame,bool isPause = false)
    {
        currentFrame = frame;
        spriteLoader.sprite = allAnimationTextures[frame];
        if (isPause)
        {
            Pause();
        }
    }
3、暂停 和 停止
	public void Pause()
	{
	     isPlaying = false;
	}
	
	public void Stop(bool isClear = false) 
	{
		currentFrame = allAnimationTextures.Count-1;
		if (isClear)
		{
		    spriteLoader.sprite = null;
		}
		else
		{
		    spriteLoader.sprite = allAnimationTextures[currentFrame];
		}
		Pause();
	}
4、播放完成回调
    public void OnComplete(Action action) 
    {
        onComplete += action;
    }

二、代码

// ========================================================
// Description:2D动画播放器
// Author:MDC
// Creat Time:2022-09-29 22:18:00
// Tips:针对Animator对2D动画控制不方便而创建,方便进行跳转、暂停、播放、完成回调等操作。
// ========================================================
using System;
using System.Collections.Generic;
using UnityEngine;


[RequireComponent(typeof(SpriteRenderer))]
public class AnimationPlayer : MonoBehaviour
{
    [Header("循环播放")]
    public bool isLoop = false;
    [Header("启动时播放")]
    public bool awakePlay = false;
    [Header("播放帧率1-120")]
    [Range(1,120)]
    public int frameRate = 25;                  


    public float time                           //动画时长
    {
        get { return allAnimationTextures.Count / frameRate; }
    }                      
    public int CurrentFrame
    {
        get { return currentFrame; }
    }
    public bool IsPlaying 
    {
        get { return isPlaying; }
    }


    [SerializeField]
    private List<Sprite> allAnimationTextures;      //所有动画贴图
    private int currentFrame = 0;                   //当前帧
    private bool isPlaying = false;                 //是否正在播放        
    private Action onComplete;                      //播放完成事件
    private SpriteRenderer spriteLoader;            //图片加载器
    private float timer;                            //计时器

    private void Awake()
    {
        spriteLoader = GetComponent<SpriteRenderer>();
        if (awakePlay)
        {
            isPlaying = true;
        }
    }

    void Start()
    {
       
    }

    void Update()
    {
        SlidePlay();
    }


    private void SlidePlay() 
    {
        timer+=Time.deltaTime;
        if (timer < 1f/ frameRate)
        {
            return;
        }
        timer = 0;

        if (isPlaying)
        {
            if (currentFrame == allAnimationTextures.Count)
            {
                if (isLoop)
                {
                    currentFrame = 0;
                }
                else
                {
                    isPlaying = false;
                    if (onComplete != null)
                    {
                        onComplete.Invoke();
                        onComplete = null;
                    }
                    return;
                }
            }
            spriteLoader.sprite = allAnimationTextures[currentFrame];

            currentFrame++;
        }
    }



    public void Play() 
    {
        Play(0);
    }


    /// <summary>
    /// 从第startFrame开始播放
    /// </summary>
    /// <param name="startFrame"></param>
    public void Play(int startFrame)
    {
        currentFrame = startFrame;
        spriteLoader.sprite = allAnimationTextures[startFrame];
        isPlaying = true;
    }


    /// <summary>
    /// 跳转到指定帧,isPause为true时跳转后暂停
    /// </summary>
    /// <param name="frame"></param>
    /// <param name="isPause"></param>
    public void Skip(int frame,bool isPause = false)
    {
        currentFrame = frame;
        spriteLoader.sprite = allAnimationTextures[frame];
        if (isPause)
        {
            Pause();
        }
    }

    /// <summary>
    /// 暂停播放
    /// </summary>
    public void Pause()
    {
        isPlaying = false;
    }

    /// <summary>
    /// 停止播放,isClear为true时清除画面
    /// </summary>
    /// <param name="isClear"></param>
    public void Stop(bool isClear = false) 
    {
        currentFrame = allAnimationTextures.Count-1;
        if (isClear)
        {
            spriteLoader.sprite = null;
        }
        else
        {
            spriteLoader.sprite = allAnimationTextures[currentFrame];
        }
        Pause();
    }

    /// <summary>
    /// 播放完成回调
    /// </summary>
    /// <param name="action"></param>
    public void OnComplete(Action action) 
    {
        onComplete += action;
    }


}

实际上除了播放完成触发事件之外我还做了一个扩展版,包含 指定帧触发事件 和 循环情况下一遍播放完成后触发事件,但是因为怀疑可能会存在bug给大家带来困扰所以并未粘贴,扩展版大家可以点击这里下载查看,有兴趣的可以私聊沟通。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity自定义序列帧播放器 的相关文章

  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • Unity3d Terrain地形制作系列(一)

    游戏简单地形 地形制作 地形制作 第一步在场景里加载一个地形对象 第二步 我们在属性面板里找到绘制地形 然后选择Set Height 绘制高度 应该我们要制作低凹的效果 所有先让他有个高度 不然是不能实现低凹的效果 如图 我们然后选择绘制地
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐

  • 清理windows10自带的xbox等应用的脚本

    最近在系统封装中发现即使在母盘中删除了windows10自带的xbox等应用 再次重装之后仍然还是会有 通过Dism 对镜像分析未发现有相关的可删减的模块 遂采用PowerShell脚本去解决 Set ExecutionPolicy rem
  • CocosCreator环境搭建生成android应用apk cocos2d android NDK win10系统

    有问题找我 100 次 苹果mac系统下cocos2d android和ios含NDK开发环境搭建 安装说明20161129 点这里 一 工具 不能用中文路径或放在中文路径下 操作系统 win10专业版 1 android NDK andr
  • MySQL中SQL语句——DQL(数据查询语句)

    前言 首先对于数据库有一定的了解 会对于Mysql的学习有一定的帮助 数据库主要分为 DB 数据库 DBMS 数据库管理系统 SQL 结构化查询语言 用于和DBMS通信的语言 这篇要讲的DQL 数据查询语句 是属于SQL语言中的一种语言 因
  • 宋浩概率论与数理统计-第二章-笔记

    概率论与数理统计 第二章 2 1 随机变量的概念 2 2 1 离散型随机变量及其概率分布 连续型随机变量及其概率密度函数 2 2 2 分布函数的定义 离散型的分布函数 例题 连续型的分布函数 例题 2 2 3 常见的分布 离散型常见分布 0
  • React滚动条优化-滚动条滚动到最底部

    当消息较多出现滚动条时 有后续新消息的话总将滚动条滚动到最底部 声明一个 ref 并设置到聊天列表的容器元素上 用于操作聊天列表元素的引用 const chatListRef useRef null div 通过 useEffect 监听聊
  • C# Image和字节流的互化

    using System using System Collections Generic using System Linq using System Text using System Drawing using System IO n
  • 《当程序员的那些狗日日子》六

    当程序员的那些狗日日子 五十一 太不给力的年终奖 2009年12月中旬 敖总请研发部各人去台湾六天游 这是敖总每年一次的对研发部同仁的特别恩惠 此外此次台湾游敖总还请了负责技术支持的另外三位同事一同前往 由于办证及其他原因 最后只有立经理
  • Tips系列之飞书云文档

    飞书云文档可谓是飞书套件中深受用户喜爱的功能之一 今天就给大家呈上几个小Tips 让你深入了解飞书云文档 1 新建在线文档 表格和文件夹 电脑桌面端 方式 1 点击飞书桌面端左侧的云文档按钮 登录云文档首页 点击云文档首页右上角新建按钮 选
  • Qtimer使用多次connect的误区

    本人目前小白一枚 所及问题只为方便查看 忘大神们勿喷 有指导意见的本人会很高兴 在使用一个定时器时多次调用start 和stop 时完全没有问题的 先讲一下是start 的作用 Qt的帮助文档如下 This is an overloaded
  • 直接修改gba_修改GBA游戏本身

    满意答案 vhewq 2013 07 14 采纳率 42 等级 11 已帮助 7209人 如何Hack GBA ROM 作者 zhaosili zZ 转载请注明 本文假定你已经了解80x86汇编 尽管指令集不同 并且会使用TRW2000 尽
  • 蓝桥杯练习系统题解目录

    蓝桥杯历年省赛试题汇总及试题详解 https blog csdn net weixin 42069140 article details 88910340 蓝桥杯历年决赛试题汇总及试题详解 https blog csdn net weixi
  • 原生JS实现视频上传

    原生JS实现视频上传可以通过以下步骤实现 在HTML中添加一个文件输入框和一个提交按钮
  • 从CMOS到触发器(二)

    1 双稳态器件 双稳态器件是指稳定状态有两种 一种是0 一种是1的器件 双稳态器件是存储器件的基本模块 双稳器件的的一种电路结构是 交叉耦合反相器 结构 如下图所示 连个反相器连在一起 这就构成了一个双稳态器件 为什么是双稳态呢 我们现在就
  • Qt 一个信号连接多个槽函数后的执行顺序

    当我们想一个信号触发多个槽函数的时候 又对执行顺序有要求 要么要知道这些槽函数的执行顺序 Qt5后 在信号发射后 槽函数会按照链接顺序执行 下面写个简单的例子来验证一下 环境 win10 Qt 5 13 0 QPushButton btn1
  • Docker入门到实践 (十四) Docker企业级容器镜像仓库HarBor的搭建与配置

    文章目录 一 前言 二 企业级容器镜像仓库HarBor的介绍 三 HarBor 特性 四 HarBor 组件介绍 五 HarBor 与 Registry的区别 六 HarBor的安装与配置 1 安装环境要求 1 1 硬件要求 1 2 软件要
  • sqli-labs Less-5 (报错注入)

    在实际场景中 如果没有一个合适的数据返回点 而是仅仅带入Sql数据进行查询 就需要报错注入 1 less 5 正常情况 我们构造闭合 发现没有问题 利用前几关的思路 发现无论怎么操作都是 You are in 这个时候一般的思路就行不通 发
  • 视频合并python

    不同尺寸 不同个数的视频都可以合并 左右拼接 from moviepy editor import clips VideoFileClip r A 0000 raw converted avi VideoFileClip r bird A
  • tf.image.non_max_suppression()会扩充数据

    tf image non max suppression boxes scores max output size iou threshold 0 5 score threshold float inf name None tf image
  • cookie,session,token的区别和作用

    1 cookie session token的出现的背景 很久很久以前 Web 基本上就是文档的浏览而已 既然是浏览 作为服务器 不需要记录谁在某一段时间里都浏览了什么文档 每次请求都是一个新的HTTP协议 就是请求加响应 尤其是我不用记住
  • Unity自定义序列帧播放器

    目录 创建原因 一 主要功能 1 播放 从指定帧播放 2 跳转到指定帧 3 暂停 和 停止 4 播放完成回调 二 代码 创建原因 使用Animator进行序列帧控制的话 播放到指定帧 重新播放这些操作使用起来非常的不方便 所以自己写了一个序