转UNITY3D 游戏开发之四有关实现2D帧序列帧播放相关—Animating Tiledtexture
Posted 李华明Himi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转UNITY3D 游戏开发之四有关实现2D帧序列帧播放相关—Animating Tiledtexture相关的知识,希望对你有一定的参考价值。
本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi )
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/unity3d-game/1592.html
☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!
width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=1916000601&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Funity3d-game%2F1592.html&dpc=1" style="border-width: 0px; margin: 0px; padding: 0px;">
Himi 尝试使用了此作者《CSharp – SpritSheet.cs》代码段,发现其中有一个算法估计是作者大意写错了。这样改了就矩形也都支持了。
// split into horizontal and vertical index int uIndex = index % _uvTieX; int vIndex = index / _uvTieY; 应改为:
// split into horizontal and vertical index int uIndex = index % _uvTieX; int vIndex = index / _uvTieX;
Author: Joachim Ante
Contents[hide] |
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 1 var 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以上是关于转UNITY3D 游戏开发之四有关实现2D帧序列帧播放相关—Animating Tiledtexture的主要内容,如果未能解决你的问题,请参考以下文章