유니티 시간 경과에 따른 이미지 변경해보기

2023. 3. 25. 22:18유니티실습

반응형

이번 시간에는 특정 키를 입력받아 이미지를 변경시키고 지정된 시간에 경과함에 따라

이미지가 처음상태에 이르기까지 지속적으로 변경되는 예제입니다.

 

해당 내용은 다음과 같은 상황에 응용이 가능합니다.

ex) 버튼스위치를 가동하고 일정 시간이 지나면 되돌아오는 기능 (시간 함정에 이용)

ex) 특정 오브젝트가 시간이 지남에 따라 자라나는 기능(농작물 키우기)

 

결과화면

하이어라키 & 인스펙터

스크립트

public class Tree : MonoBehaviour {
    
    public Sprite[] objectSprites;
    public float changetimer;

    private SpriteRenderer sp;
    private float currentTimer = 0.0f;

    private bool changeAt = false;
    private int spriteIndex = 0;

    private void Start() {
        sp = GetComponent<SpriteRenderer>();
        sp.RegisterSpriteChangeCallback(OnSpriteChanged);
    }

    private void OnSpriteChanged(SpriteRenderer sp) {

        currentTimer = 0f;
                
        if (sp.sprite.name != objectSprites[objectSprites.Length - 1].name) {
            changeAt = true;
            spriteIndex++;
        } else {
            changeAt = false;
        }      
    }

    private void Update() {

        if(Input.GetKeyDown(KeyCode.Space)) {
            spriteIndex = 0;
            sp.sprite = objectSprites[0];
            currentTimer = 0f;
        }

        if (changeAt) {
            currentTimer += Time.deltaTime;
            if (currentTimer > changetimer) {
                sp.sprite = objectSprites[spriteIndex];                
            }
        }
    }
}

 

1. Tree Class에는 RegisterSpriteChangeCallback 이벤트가 등록되어 있어서 sprite가 변경될 때마다 OnSpriteChanged를 호출하게 됩니다.

sp.RegisterSpriteChangeCallback(OnSpriteChanged);

 

2. Space 키를 입력받으면 오브젝트의 Sprite를  objectSprites [0]으로 교체하게 됩니다.

※ 위의 예제에서는 간단하게 Space를 입력받아 오브젝트에 Sprite를 변경하게 짜여있지만 실제 응용 시에는 특정 오브젝트와 상호작용하여 해당 기능을 수행하게 수정하는 것이 좋습니다.

if(Input.GetKeyDown(KeyCode.Space)) {
            spriteIndex = 0;
            sp.sprite = objectSprites [0];
            currentTimer = 0f;
 }

 

3. Sprite가 변경되었다면 OnSpriteChanged가 호출되어 현재 Sprite name과 objectSprites [] 배열에 등록된 마지막 Sprite name이 같지 않은지 비교합니다. 

※ sprite name을 비교하여 objectSprites 등록된 마지막 sprite의 name이 아니라면 반복하는 코드

 

private void OnSpriteChanged(SpriteRenderer sp) {

        currentTimer = 0f;
                
        if (sp.sprite.name!= objectSprites [objectSprites.Length - 1]. name) {
            changeAt = true;
            spriteIndex++;
        } else {
            changeAt = false;
        }        
    }

 

4. changetimer에 지정된 시간이 지나면 현재 다음 index의 sprite로 변경합니다.

※ 해당 코드는 objectSprites []의 마지막 index sprite로 변경될 때까지 반복합니다.

if (changeAt) {
            currentTimer += Time.deltaTime;
            if (currentTimer > changetimer) {
                sp.sprite = objectSprites [spriteIndex];                
            }
}

 

이번 예제에도 단순한 함수를 활용한 간단한 예제로 응용하신다면 다음과 같은 부분을 고려하셔야 합니다.

 

1. 키 입력을 통한 스프라이트 변경이 아닌, 특정 사물 또는 플레이어와의 상호작용으로 인한 이벤트 처리

 

2. 이미지가 변경할 때 추가적으로 바꿔줘야 하는 부분 

ex) 충돌 콜라이더의 사이즈, 활성 비활성 등등의 상황

(이미지의 크기도 변경이 되거나, 충돌이 되지 않았다가 가능해져야 하는 경우)

 

3. 다수의 오브젝트에서 사용하는 경우 다양한 조건이나 분기 추가

반응형