Unity 3D中的帧动画播放

2023-11-18

帧动画(Frame By Frame)的原理

链接: 项目实例资源
关键是连续的关键帧分解动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。虽然每一帧都不一样,处理的信息量大,但是,帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容,很适合于表演细腻的动画。例如:人物或动物急剧转身、 头发及衣服的飘动、走路、说话以及精致的3D效果等等。

在2D游戏中实现帧动画的方式

在Canvas下创建一个Image节点,图片要是Sprite (2D and UI)
在这个节点下加上一个C#脚本
在脚本里实现图片的播放

脚本代码

[RequireComponent(typeof(Image))] 当前代码强制要求加入一个Image组件或者其他的组件,需要在代码中加入这一行代码,如果节点上有这个组件就使用,如果没有就创建。
//名字空间
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

//当前代码强制要求加入一个Image组件,如果没有Image组件,那么就自动加上
//如果有就使用
[RequireComponent(typeof(Image))]
public class frame_anim : MonoBehaviour {
    //帧动画所需要的画面
    public Sprite[] sprite_frame;
    //帧动画的时间间隔
    public float duration = 0.1f;
    //是否循环播放
    public bool is_loop = false;
    //是否在加载时播放
    public bool play_onload = false;

    private float played_time; //过去的时间
    private bool is_playing = false;
    private Image img;  //时间间隔一到需要播放的图片
    //private bool loop = false;
	// Use this for initialization
	void Start () {
		//获取此节点上的Image组件
        this.img = this.transform.GetComponent<Image>();
        if (this.play_onload)  //判断是否在加载时播放
        {
            if (this.is_loop)  //判断播放方式
            {
                this.play_loop();
            }
            else
            {
                this.play_once();
            }
        }
    } 
    //只播放一次
    void play_once()
    {
        if (this.sprite_frame.Length <= 1) return;
        this.played_time = 0;
        this.is_playing = true;
        this.is_loop = false;

    }
   //循环播放
    void play_loop()
    {
        if (this.sprite_frame.Length <= 1) return;
        this.played_time = 0;
        this.is_playing = true;
        this.is_loop = true;
        

    }
    //停止播放
    void stop_play()
    {
        this.is_playing = false;
    }
	// Update is called once per frame
	void Update () {
        if (this.is_playing == false)
        {
            return;

        }
        float dt = Time.deltaTime;
        this.played_time += dt;  
        //向下取整
        int index = (int)(this.played_time / this.duration);//需要播放画面的下标

        //是否循环播放
        if (this.is_loop == false)  
        {
            if (index >= this.sprite_frame.Length)  //停止播放
            {
                this.is_playing = false;
                this.played_time = 0;
            }else
            {
                this.img.sprite = this.sprite_frame[index];
            }
        }
        //播放一次
        else
        {
            //while (index >= this.sprite_frame.Length)
            //{
                //this.played_time -= (this.duration * this.sprite_frame.Length);
                index %= this.sprite_frame.Length;
            //}
            this.img.sprite = this.sprite_frame[index];
        }
	}
}

图片下标设置

Unity3d编辑器里设置每一帧的图片

帧动画

Size 为播放图片的数组大小 Element0~size-1 为每一帧的图片
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 3D中的帧动画播放 的相关文章

  • 设计模式(二十二) 策略模式

    有时候对象需要按照某种策略改变行为 我们可以利用策略模式 将策略或算法提取出来 作为单独的类实现 使用策略模式 可以让具体算法和应用对象分离 方便的根据不同条件替换策略 下面举一个例子 我们有一个计算器 它会按照快和慢两种策略来计算结果 所

随机推荐

  • 解决Linux普通用户使用Wireshark的权限不足的问题

    dumpcap需要root权限才能使用 如果是普通用户 Wireshark就没有权限使用dumpcap进行截取封包 解决方法 将dumpcap更改为Wireshark用户组 sudo chgrp wireshark usr bin dump
  • vue3_父子组件传参

    最近在看b站 小满zs 的vue3教程 巩固一下 1 父 gt 子组件 父组件自定义一个属性 用v bind 绑定在子组件上
  • couldn't find native method

    有两个原因 1 java这边native方法没有 native void renderFrameStart 2 c这边没有实现native方法 12 29 15 52 27 901 32735 32735 com ffmpegtest E
  • vue模板语法(上)

    目录 一 插值 什么是插值 建立一个html来编写插值 输出结果 二 指令 什么是指令 建立一个html来编写指令 输出结果 编辑 动态参数 输出结果 三 过滤器 什么是过滤器 建立一个html来编写过滤器 输出结果 4 计算属性 监听属性
  • STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

    STM32F103C8T6驱动舵机SG90 配置定时器TIM2 TIM3 TIM4的多种重映射模式下的不同IO口 1 使用到的工具介绍 2 整个简单介绍 3 程序的介绍 1 使用到的工具介绍 keil5 烧写软件FlyMcu exe 硬件为
  • CS143-project2 局部特征匹配 Local Feature Matching

    本项目通过harris算法对图像进行兴趣点的检测和提取 然后计算兴趣点周围4 4区域的8个方向特征向量 最后对获取到的特征向量对进行匹配 本算法对旋转 缩放 亮度变化保持一定程度的稳定性 环境 操作系统 WIN7 实现平台 MATLAB20
  • Flask 项目部署(Docker + Flask + uwsgi + Nginx)

    文章目录 一 项目背景 二 项目部署 2 1 项目基础环境 2 2 获得 Python 环境的所需依赖 2 3 配置 gunicorn 2 4 编写 Dockerfile 2 5 编写 docker compose 选用 2 6 Docke
  • CS224W 第一讲 图论基本知识回顾

    网络的组成 一个网络由 对象 关系 系统 组成 网络的表示 有向图和无向图 节点的度 这里平均度数分别为 2E N 和 E N 同时 有向图有一个很重要的概念就是 所有的出度和入度是相同的 完全图 clique or Complete gr
  • 前端传递base64编码,java后端接收,并转为MultipartFile对象

    前端传递的base64 通过url Base64中的 和 字符变为形如 XX 的形式 所以后端接收的字符串是带 的 所以需要解码 String decode URLDecoder decode avatar 下面是工具类 base64转为m
  • 3DMax 卡死、白屏、渲染死机问题总结

    白屏 3dmax出现白屏解决方法 以下是ChatGPT给出的答案 内存不足 3DsMax需要大量的内存才能正常运行 如果你的计算机内存不足 3DsMax就会卡死 解决办法是升级你的计算机内存或者关闭一些不必要的程序来释放内存 显卡驱动过时
  • C++之tuple

    2023年6月4日 周日下午 今天下午简单学习了一下tuple 现在来简单介绍一下tuple 功能 生成一个含不同数据类型的元素列 创建 可以通过声明或make tuple来创建tuple include
  • 在Qt中,如何布局,让控件显示在自己想要的位置

    想到一个办法 可以使用QGridLayout 使用空的QLabel填充空白位置 空的QLabel是透明的 所以看起来就是被填充区域为空白 可以让自己想要显示的控件显示在右上方或者左下方或者任何想要显示的地方 绿色为填充的空QLabel 如图
  • 网课重学宣言:御风计划

    当前状态 我报了网课 2023年4月份报的花了1w3 现在是快7月份了 但是我没学多少 这一份课程的学习困难重重 如今我面临两个选择 一个是放弃这么课 跟着流程继续学习 能学一点是一点 然后把其他精力放在别的方面 另一个是重新延期学习 重新
  • Qt下监测内存泄漏

    在写Qt应用程序时 由于是采用C 语言 经常会碰到一个令人棘手的问题 那就是内存泄漏 虽然后面C 为了防止内存泄漏 发布了智能指针以用来避免内存泄漏 但是并不能完全避免 而且智能指针使用不当 同样会造成非常严重的问题 这里智能指针就不在赘述
  • 项目在was 7.0上部署问题解决方案

    年前 在做项目的时候 遇到客户要求应用服务器采用WebSphere服务器 之前从来没有接触过该类服务器 所以项目在架构部署上遇到了很多问题 现在给自己做个笔记 记录一下在websphere应用上遇到的问题 为以后做参考 同时 给有遇到此问题
  • 谈GPT-2(附大量网址)

    文章目录 前言 关于GPT 2 各个版本的GTP 2 中文版GTP 2 语料链接 15亿参数版GPT 2 OpenGPT 2 前言 GPT 2这个名字不知有多少人知道 但有很多人应该都知道埃隆 马斯克的OpenAI吧 OpenAI 由诸多硅
  • Python时间模块之calendar模块

    目录 简介 calendar month isleap calendar leapdays monthcalendar monthrange timegm 总结 简介 在项目开发中做功能经常会用到关于时间的操作 比如会员过期的定时任务 一些
  • 计算机视觉需要学什么?CV知识点

    最近有人问计算机视觉需要学什么 我自己本身是通过自学然后找到了计算机视觉相关的工作 这里我分享一下自己的当初掌握的知识点 希望能帮助到你 以下内容仅供参考 计算机视觉需要学什么 学习计算机视觉需要具备的知识储备有 1 图像处理的知识 图像处
  • 记录一次rabbitmq ConfirmCallback不生效的问题

    记录一次rabbitmq回调函数不生效的问题 application yml里是否存在 springboot版本的问题 改为2 1 7 RELEASE即可 以上都未生效的话 检查一下是否自己写了连接rabbitmq的bean 在里面加上下面
  • Unity 3D中的帧动画播放

    帧动画 Frame By Frame 的原理 链接 项目实例资源 关键是连续的关键帧分解动作 也就是在时间轴的每帧上逐帧绘制不同的内容 使其连续播放而成动画 虽然每一帧都不一样 处理的信息量大 但是 帧动画具有非常大的灵活性 几乎可以表现任