热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity实用小工具---2D贴图之波动效果

最近项目有一个需求:用图片实现桶中的水涨效果效果如下:找不到好的贴图,效果比较丑,请见谅!哈哈!思路:修改贴图的像素值,具体做法见代码usingDG.Twe

最近项目有一个需求: 用图片实现桶中的水涨效果

效果如下:

效果图

找不到好的贴图,效果比较丑,请见谅! 哈哈!

思路: 修改贴图的像素值,具体做法见代码

using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// 
/// 利用像素来实现波动效果
/// SetPixels32 function works only on RGBA32, ARGB32, RGB24 and Alpha8 texture formats. For other formats SetPixels is ignored. 
/// The texture also has to have Is Readable flag set in the import settings.
/// 
public class PixelBoDong : MonoBehaviour {

    public RawImage CurRawImage;

    [Header("动画时间")]
    public float AnimTime = 3f;
    [Header("波动底图")]
    public Texture2D ShowTexture;
    [Header("当前波动的起始高度,百分比相对于贴图高度")]
    public float HPrecent;
    [Header("当前波动振幅,相对于贴图高度")]
    public float CurSwingPrecent;
    [Header("波动周期")]
    public float CurSwingCycle;
    [Header("相位值,百分比相对于贴图宽度")]
    public float CurXiangWei;

    // 振幅值
    private int m_CurSwingValue;

    private Color32[] m_PixelsBase;
    private Color32[] m_PixelsDrawLine;

    private Tween m_CurTween;

    private void Awake()
    {
        InitData();
    }

    private void InitData()
    {
        HPrecent = Mathf.Clamp(HPrecent, 0, 1f);
        CurSwingPrecent = Mathf.Clamp(CurSwingPrecent, 0, 1f);
        CurXiangWei = Mathf.Clamp(CurXiangWei, 0, 1f);
    }

    [ContextMenu("Ceshi")]
    public void DrawBoDongAnim()
    {
        if (m_CurTween != null) {
            m_CurTween.Kill();
            m_CurTween = null;
        }

        if (ShowTexture == null) return;

        ShowTexture = GameObject.Instantiate(ShowTexture);

        m_CurSwingValue = Convert.ToInt32(CurSwingPrecent * ShowTexture.height);

        // RawImage 初始化贴图
        CurRawImage.texture = ShowTexture;
        CurRawImage.SetNativeSize();
        // 获取原像素点
        m_PixelsBase = ShowTexture.GetPixels32();
        // 参照高度
        int baseH;
        // 存储像素值
        m_PixelsDrawLine = new Color32[m_PixelsBase.Length];

        float endValue = ShowTexture.width * CurXiangWei;
        m_CurTween = DOTween.To(() => 0, (v) =>
        {
            // 实时刷新参照高度
            baseH = Convert.ToInt32(HPrecent * Mathf.Clamp(v, 0, endValue) / endValue * ShowTexture.width);

            Array.Copy(m_PixelsBase, m_PixelsDrawLine, m_PixelsBase.Length);
            for (int i = 0, len = ShowTexture.width; i float tmpD = m_CurSwingValue * Mathf.Sin(CurSwingCycle * i - v);
                int tmpH = Mathf.Clamp(Convert.ToInt32(tmpD) + baseH, 0, ShowTexture.height - 1);
                for (int y = tmpH, lenY = ShowTexture.height; y new Color32(1, 1, 1, 0);
                }
            }

            ShowTexture.SetPixels32(m_PixelsDrawLine);
            ShowTexture.Apply();

        }, endValue, AnimTime).SetEase(Ease.Linear).SetLoops(-1, LoopType.Incremental);
    }
}

注意事项

  • 打开贴图的可读写属性
  • 贴图的格式为 RGBA32、ARGB32、 RGB24 and Alpha8
  • 需引入DOTween 插件,但最后提供的包中已包含该插件
  • 导入下面的包后,打开Main场景,需要自己手动调用动画函数,具体见代码

完整包下载地址

地址:https://pan.baidu.com/s/14le2NLYYcmr8cet-zCff8w
密码:zn0i

推荐阅读
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • ihaveusedthedelphidatabindingwizardwithmyxmlfile,andeverythingcompilesandrunsfine. ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • 1.修改CommonSettings.props文件下compute_xx,sm_xx,其中 ... [详细]
author-avatar
lashley谢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有