博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【UNITY3D 游戏开发之四】有关实现2D帧序列帧播放相关—Animating Tiledtexture
阅读量:7026 次
发布时间:2019-06-28

本文共 5562 字,大约阅读时间需要 18 分钟。

Himi 尝试使用了此作者《CSharp – SpritSheet.cs》代码段,发现其中有一个算法估计是作者大意写错了。这样改了就矩形也都支持了。

// split into horizontal and vertical indexint uIndex = index % _uvTieX;int vIndex = index / _uvTieY;应改为:
// split into horizontal and vertical indexint uIndex = index % _uvTieX;int vIndex = index / _uvTieX;
 

 Author: Joachim Ante

Contents

 [] 

Description

This script animates a texture containing tiles of an animation. You can give it a framerate to determine the speed of the animation and set how many tiles on x, y there are.

Usage

Attach this script to the object that has a material with the tiled texture. To avoid distortion, the proportions of the object must be the same as the proportions of each tile (eg 1:2 for the sheet below).

Here is an example of how to lay out a texture for it (Thanks to BigBrainz for providing it):

(Leo Nogueira) Adding a simple image with multiple rows for testing purposes and a modified version of the C# Script:

JavaScript – AnimatedTextureUV.js

var uvAnimationTileX = 24; //Here you can place the number of columns of your sheet.                            //The above sheet has 24 var uvAnimationTileY = 1; //Here you can place the number of rows of your sheet.                           //The above sheet has 1var framesPerSecond = 10.0; function Update () { 	// Calculate index	var index : int = Time.time * framesPerSecond;	// repeat when exhausting all frames	index = index % (uvAnimationTileX * uvAnimationTileY); 	// Size of every tile	var size = Vector2 (1.0 / uvAnimationTileX, 1.0 / uvAnimationTileY); 	// split into horizontal and vertical index	var uIndex = index % uvAnimationTileX;	var vIndex = index / uvAnimationTileX; 	// build offset	// v coordinate is the bottom of the image in opengl so we need to invert.	var offset = Vector2 (uIndex * size.x, 1.0 - size.y - vIndex * size.y); 	renderer.material.SetTextureOffset ("_MainTex", offset);	renderer.material.SetTextureScale ("_MainTex", size);}

CSharp – SpritSheet.cs

This is just a CSharp version of the AnimatedTextureUV.js above.

public class SpriteSheet : MonoBehaviour {	public int _uvTieX = 1;	public int _uvTieY = 1;	public int _fps = 10; 	private Vector2 _size;	private Renderer _myRenderer;	private int _lastIndex = -1; 	void Start () 	{		_size = new Vector2 (1.0f / _uvTieX , 1.0f / _uvTieY);		_myRenderer = renderer;		if(_myRenderer == null)			enabled = false;	}	// Update is called once per frame	void Update()	{		// Calculate index		int index = (int)(Time.timeSinceLevelLoad * _fps) % (_uvTieX * _uvTieY);    	if(index != _lastIndex)		{			// split into horizontal and vertical index			int uIndex = index % _uvTieX;			int vIndex = index / _uvTieY; 			// build offset			// v coordinate is the bottom of the image in opengl so we need to invert.			Vector2 offset = new Vector2 (uIndex * _size.x, 1.0f - _size.y - vIndex * _size.y); 			_myRenderer.material.SetTextureOffset ("_MainTex", offset);			_myRenderer.material.SetTextureScale ("_MainTex", _size); 			_lastIndex = index;		}	}}

CSharp – SpritSheetNG.cs

The CSharp version of the script was not working with multiple rows so i made some changes.

public class SpriteSheetNG : MonoBehaviour{	    private float iX=0;    private float iY=1;    public int _uvTieX = 1;    public int _uvTieY = 1;    public int _fps = 10;    private Vector2 _size;    private Renderer _myRenderer;    private int _lastIndex = -1;     void Start ()    {        _size = new Vector2 (1.0f / _uvTieX ,                             1.0f / _uvTieY);         _myRenderer = renderer;         if(_myRenderer == null) enabled = false;         _myRenderer.material.SetTextureScale ("_MainTex", _size);    }       void Update()    {        int index = (int)(Time.timeSinceLevelLoad * _fps) % (_uvTieX * _uvTieY);         if(index != _lastIndex)        {            Vector2 offset = new Vector2(iX*_size.x,                                         1-(_size.y*iY));            iX++;            if(iX / _uvTieX == 1)            {                if(_uvTieY!=1)    iY++;                iX=0;                if(iY / _uvTieY == 1)                {                    iY=1;                }            }             _myRenderer.material.SetTextureOffset ("_MainTex", offset);              _lastIndex = index;        }    }}

CSharp – AnimateTiledTexture

A version using coroutines. Slightly faster since it doesn’t update every frame and only sets the texture scale once.

using UnityEngine;using System.Collections; class AnimateTiledTexture : MonoBehaviour{    public int columns = 2;    public int rows = 2;    public float framesPerSecond = 10f;     //the current frame to display    private int index = 0;     void Start()    {        StartCoroutine(updateTiling());         //set the tile size of the texture (in UV units), based on the rows and columns        Vector2 size = new Vector2(1f / columns, 1f / rows);        renderer.sharedMaterial.SetTextureScale("_MainTex", size);    }     private IEnumerator updateTiling()    {        while (true)        {            //move to the next index            index++;            if (index >= rows * columns)                index = 0;             //split into x and y indexes            Vector2 offset = new Vector2((float)index / columns - (index / columns), //x index                                          (index / columns) / (float)rows);          //y index             renderer.sharedMaterial.SetTextureOffset("_MainTex", offset);             yield return new WaitForSeconds(1f / framesPerSecond);        }     }}

本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/1638103,如需转载请自行联系原作者
你可能感兴趣的文章
.Echo 命令中经常提到回显,是什么意思?
查看>>
MySQL在大数据Limit使用
查看>>
iOS中如何创建一个滑出式导航面板(1)
查看>>
Solr5.3.1整合IKAnalyzer
查看>>
Swift - 06 - 数值类型转换和类型别名
查看>>
华为3G模块EM770W在LINUX下的驱动安装
查看>>
omnet++4.0安装使用
查看>>
Jquery JSOPN在WebApi中的问题
查看>>
[React Testing] Conditional className with Shallow Rendering
查看>>
a or an
查看>>
Coursera课程《大家的python》(Python for everyone)课件
查看>>
PHP程序猿必须学习的第二课——站点安全问题预防
查看>>
2016第5周三
查看>>
Spring学习10-SpringMV核心组件2及SpringMVC项目示例
查看>>
hdu 5620 KK's Steel(推理)
查看>>
(笔记)电路设计(十五)之基本电路单元的认识
查看>>
nginx 日志获取不到远程访问ip问题解决
查看>>
有若干个字符串,比較找出当中最大者
查看>>
开源 免费 java CMS - FreeCMS2.0 会员我的评论
查看>>
Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签 《转载》
查看>>