unity 2d sprite animation
전체 파일 :
위와 같이 16개의 이미지를 어떻게 하나씩 그리는가?
1. uv scale 사용.
void Update ()
{
1을 기준으로 1/4(0.25)만큼 오프셋을 주면 네번째 것을 출력한다.
(1/16 ) * 4 = 0.25
renderer.material.mainTextureOffset = new Vector2(0.25f,0.0f);
하나의 이미지 크기는 1/16 = 0.0625.
renderer.material.mainTextureScale = new Vector2(0.0625f, 1.0f);
}
위 내용을 한 열의 갯수를 입력받는 (tileX,tileY) 방식으로 바꾸면 아래와같다.
void Update ()
{
renderer.material.mainTextureOffset = new Vector2(0.25f,0.0f);
Vector2 Size = new Vector2(1.0f/_tileX, 1.0f/_tileY);
renderer.material.mainTextureScale = Size;
print (Size);
}
3. Offset Scale 사용.
offset scale을 이용하여 해당 인덱스의 위치를 계산한다.
void Update ()
{
_index = _index % (_column * _row); // modulate
Vector2 Size = new Vector2(1.0f/_column, 1.0f/_row); // scale
Vector2 Offset = new Vector2(_index * Size.x, _row); // offset
renderer.material.mainTextureOffset = Offset;
renderer.material.mainTextureScale = Size;
}
4. fps를 사용하여 animation 시키기.
void Update ()
{
int _index = (int)(Time.time * _framesPerSecond);
_index = _index % (_column * _row); // modulate
Vector2 Size = new Vector2(1.0f/_column, 1.0f/_row); // scale
Vector2 Offset = new Vector2(_index * Size.x, _row); // offset
renderer.material.mainTextureOffset = Offset;
renderer.material.mainTextureScale = Size;
}
5. 2d animation array.
void Update ()
{
int _index = (int)(Time.time * _framesPerSecond);
_index = _index % (_column * _row); // modulate
// 가로, 세로 한 이미지당 크기.
Vector2 Size = new Vector2(1.0f/_column, 1.0f/_row); // scale
int u = _index % _column;
int v = _index / _column;
Vector2 Offset = new Vector2(u * Size.x, (1.0f-Size.y)-(v*Size.y)); // offset
renderer.material.mainTextureOffset = Offset;
renderer.material.mainTextureScale = Size;
}
6. Choose Frame Length
원하는 프레임 부터 원하는 프레임 까지 출력
void Update ()
{
int _index = (int)(Time.time * _framesPerSecond);
_index = _index%_totalFrames;
Vector2 Size = new Vector2(1.0f/_columnSize, 1.0f/_rowSize); // scale
int u = _index % _columnSize;
int v = _index / _columnSize;
Vector2 Offset = new Vector2( (u + _colFrameStart) * Size.x,
(1.0f-Size.y)-(v + _rowFrameStart) * Size.y ); // offset
renderer.material.mainTextureOffset = Offset;
renderer.material.mainTextureScale = Size;
}
7. normal map
renderer.material.SetTextureOffset("_BumpMap", Offset);
renderer.material.SetTextureScale("_BumpMap", Size);
이 함수의 설명은 아래와 같다.
function SetTextureOffset (propertyName : String, offset : Vector2) : void
Description
Sets the placement offset of texture propertyName.
Common texture names used by Unity's builtin shaders:
"_MainTex" is the main diffuse texture. This can also be accessed via mainTextureOffset property.
"_BumpMap" is the normal map.
"_Cube" is the reflection cubemap.
8. 함수로 빼서 사용.
그냥 함수로 뺀 것 뿐..
void Update ()
{
apiSprite(8, 2, 0, 0, 16, 12);
}
void apiSprite(int ColumnSize, int RowSize, int ColFrameStart,
int RowFrameStart, int TotalFrames, float FramePerSecond)
{
int _index = (int)(Time.time * FramePerSecond);
_index = _index%TotalFrames;
Vector2 Size = new Vector2(1.0f/ColumnSize, 1.0f/RowSize); // scale
int u = _index % ColumnSize;
int v = _index / ColumnSize;
Vector2 Offset = new Vector2( (u + ColFrameStart) * Size.x,
(1.0f-Size.y)-(v + RowFrameStart) * Size.y ); // offset
renderer.material.mainTextureOffset = Offset;
renderer.material.mainTextureScale = Size;
renderer.material.SetTextureOffset("_BumpMap", Offset);
renderer.material.SetTextureScale("_BumpMap", Size);
}
9. 다른 클래스로 빼서 사용.
public void apiSprite(int ColumnSize, int RowSize, int ColFrameStart,
int RowFrameStart, int TotalFrames, float FramePerSecond)
{
...... 어쩌고 저쩌고 ...
}
그리고 UsingAniSprite클래스에서 AniSprite에 접근해서 사용한다.
void Update ()
{
AniSprite otherScript = GetComponent<AniSprite>();
if(Input.GetKey("d"))
{
otherScript.apiSprite(8, 2, 0, 0, 16, 12);
}
}
'Unity > Unity Study' 카테고리의 다른 글
Unity - Character Controller (0) | 2013.11.03 |
---|---|
unity - time 출력 (0) | 2013.10.30 |
unity - time 관련 함수 (0) | 2013.10.30 |
자동 폴더 만들기. (0) | 2013.10.20 |
Unity Script Debug 방법 (0) | 2013.03.27 |