유니티 SpriteChangeCallback 사용해보기

2023. 3. 21. 16:50유니티정보

반응형

RegisterSpriteChangeCallback 함수를 이용하면 Sprite가 변경될 때 SpriteRenderer 컴포넌트에 등록된 콜백 함수를 호출할 수 있는 기능을 제공하며 SpriteRenderer에 등록된 콜백 함수를 해제하려면 UnregisterSpriteChangeCallback 메서드를 사용합니다.

결과화면

마우스 버튼을 입력받았을 때 attackSprites [] 배열에 저장되어 있는 sprite를 애니메이션 속도에 맞게 변경하는 간단한 예제 결과 화면으로 sprite가 변경될 때마다 SpriteChangeCallback 함수가 호출되는 것을 확인할 수 있습니다.

 

 

스크립트 예제

public Sprite[] attackSprites; 
    public float animationSpeed; 

    private SpriteRenderer spriteRenderer;
    private int currentSpriteIndex = 0;
    private float timeSinceLastFrame = 0f;
    private bool isAttacking = false;

    void Start() {
        spriteRenderer = GetComponent<SpriteRenderer>();
        spriteRenderer.RegisterSpriteChangeCallback(OnSpriteChange);
    }

    void OnSpriteChange(SpriteRenderer sr) {
        // Sprite가 변경 될 때 호출
        Debug.Log("Sprite Name : " + sr.sprite.name);
        timeSinceLastFrame = 0f;
    }

    void Update() {
        // 마우스 입력을 받으면 공격 애니메이션 실행
        if (Input.GetMouseButtonDown(0) && !isAttacking) {
            isAttacking = true;
            currentSpriteIndex = 0;
            spriteRenderer.sprite = attackSprites[currentSpriteIndex];
        }

        // 애니메이션 속도에 맞게 스프라이트 변경
        if (isAttacking) {
            timeSinceLastFrame += Time.deltaTime;
            if (timeSinceLastFrame >= animationSpeed) {
                currentSpriteIndex = (currentSpriteIndex + 1) % attackSprites.Length;
                spriteRenderer.sprite = attackSprites[currentSpriteIndex];
            }
            // 애니메이션이 끝나면 애니메이션 종료
            if (currentSpriteIndex == attackSprites.Length - 1) {
                isAttacking = false;
                spriteRenderer.sprite = attackSprites[0];
            }
        }
    }

 

SpriteChangeCallback 메서드를 사용하여 애니메이션을 구현한 간단한 예제입니다.

※ 현재 예제에는 콜백함수를 해제하는 구간은 없습니다.

하이어라키 

인스펙터

 

Sprite의 변경사항을 감지하기 위한 코드를 일일이 작성해야 하지만 RegisterSpriteChangeCallback를 사용하게 되면 변경사항이 없는 경우에는 sprite를 확인을 하지 않아도 되므로 시스템 리소스를 절약할 수 있으며 그로 인해 개발시간 절약도 가능합니다.

그리고 스프라이트의 변경사항을 감지하는 코드를 콜백 함수로 분리하면, 코드 구조가 간결해지고 유지보수가 용이해지며 여러 스프라이트에서 동일한 변경사항을 감지해야 하는 경우에는, 하나의 콜백 함수를 등록하여 코드 중복을 방지할 수 있습니다

 

 

반응형