[Unity3D] 스프라이트 이미지 스크립트로 바꾸기



요즘 공부를 통 못해서... 정말 오랜만에 글을 쓴다.
유니티에서 스프라이트 이미지는 2가지 방법으로 바꿀 수 있다. 첫번째는 당연히 마우스로 직접 끌어다놓거나, 선택해서 바꾸는 방법이다.



오른쪽 inspector -> Sprite Renderer의 sprite에 project 폴더 안에 있는 본인이 원하는 이미지를 직접 끌어다놔도 되고, 또는 이미지의 이름이 적힌 박스 옆에 조그만 동그라미가 있는데, 그것을 눌러보면


위와 같은 창이 나오는데, 여기서 직접 선택해도 된다.

매우 기초적인 방법이라 유니티를 조금 써본 사람이라면 누구나 알고 있을 것이다.
하지만 게임에서 어떤 행위에 의해 이미지가 바뀌게끔 만들 때도 있다. 위의 게임에서도 빈 공간에 네모난 블럭을 넣으면 빈 공간이 반짝이는 이미지로 바뀌게 만들고 싶었다. 요컨데 아래 그림과 같다.



이렇게 빈 공간에 블럭을 넣으면 주변이 희미하게 빛나게 된다. 이는 충돌 판정과 이미지 변경 스크립트로 충분히 만들어줄 수 있다.



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StepCollision : MonoBehaviour
{
    private Stage s;
    Sprite StepOff;

    private void Start()
    {
        StepOff = gameObject.GetComponent<SpriteRenderer>().sprite;
        Debug.Log(StepOff);
    }


    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (this.gameObject.tag.Contains(collision.gameObject.tag))
        {
            s = GameObject.FindWithTag("accepted").GetComponent<Stage>();
            this.gameObject.GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(gameObject.tag);
            s.currStepCnt++;
        }

    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (this.gameObject.tag.Contains(collision.gameObject.tag))
        {
            s = GameObject.FindWithTag("accepted").GetComponent<Stage>();
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOff;

            s.currStepCnt--;
        }
    }
}


기본 아이디어는 위의 코드와 같고, 사용한 코드는 저기에서 좀 더 변형해서 사용했다.
일단 s = GameObject.FindWithTag("accepted").GetComponent<Stage>(); 코드는 무시해도 된다. 필자는 빈공간의 콜라이더와 블럭의 콜라이더가 충돌을 시작했을 때 이미지를 변경하고, 충돌이 끝났을 때 원래 이미지로 돌아가는 방식으로 했다.
일단 원래 이미지는 미리 지정해놨기 때문에, StepOff라는 이름으로 저장해둔다. 그 후 충돌이 일어날 때 OnTrigger - Enter / Exit - 2D로 충돌이 일어나기 시작 / 끝 날때 Resources.Load로 리소스 파일에 저장해놓은 스프라이트를 불러와주면 된다.
여기서 좀 헤맸던 부분은 보통 Resources.Load("파일 이름") as Sprite로써 불러오게 했었는데, 어쩐 일인지 스프라이트 파일은 이 방법대로 불러와지지 않고 Resources.Load<Sprite>("파일 이름") 로 해야 불러와진다. 이유를 아직 찾지는 못했지만 추 후 발견하게 되면 추가하겠다.

댓글