本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi )
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/unity3d-game/1592.html
☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!
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]
|
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.
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:
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); }
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; } } }
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; } } }
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); } } }