[UNITY3D 게임 개발 의 4]2D 프레임 시퀀스 프레임 재생 실현 관련-Animating Tiledtexture

이 사이트 이화 명 히 미 오리지널,전 재 는 반드시 뚜렷 한 곳 에 표시 해 야 한다.(작가 시 나 웨 이 보: @이화 명 히 미 ) 에서 옮 겨 싣 기[흑 미 GameDev 거리] 원본 링크: http://www.himigame.com/unity3d-game/1592.html 클릭 하여 구독 본 블 로그 의 최신 동향!제때에 최신 박문 을 당신 에 게 통지 합 니 다!
                 
 
Himi 는 이 작가 의 코드 세그먼트 를 사용 하려 고 시도 하 였 는데,그 중 하 나 는 작가 가 부주의 로 잘못 쓴 것 으로 추정 되 는 알고리즘 이 있 음 을 발견 하 였 다.이렇게 고치 면 사각형 도 다 지지 합 니 다.
// 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
 [hide] 
  • 1 Description
  • 2 Usage
  • 3 JavaScript – AnimatedTextureUV.js
  • 4 CSharp – SpritSheet.cs
  • 5 CSharp – SpritSheetNG.cs
  • 6 CSharp – AnimateTiledTexture

  • 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 p_w_picpath 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 p_w_picpath 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 p_w_picpath 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);
            }     }}

    좋은 웹페이지 즐겨찾기