[UNITY3D 게임 개발 의 4]2D 프레임 시퀀스 프레임 재생 실현 관련-Animating Tiledtexture
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]
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);
} }}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity3D용 Android의 MP3 파일Unity3D로 MP3 플레이어를 제작하여 멋진 비주얼라이저로 또는 게임을 하는 동안 자신의 노래를 들을 수 있다고 가정해 보겠습니다. 모든 MP3 파일을 통합 프로젝트로 드래그하고 오디오 소스의 클립 소스를 변경하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.