2023년 6월 24일 토요일

버튼 스프라이트 바꾸기

일단 버튼을 만들고 버튼의 Image -> Source Image에 스프라이트를 넣음으로써 버튼의 모습을 바꿀 수 있습니다.


그런데 상황에 따라 버튼의 모양을 실시간으로 바꿔야 할 때가 있죠.


일단 이 버튼을 조작할 수 있는 스크립트를 만듧니다.

public class CanvasFieldController : CanvasBase
{
    [SerializeField] private Sprite normalSpeed;
    [SerializeField] private Sprite doubleSpeed;
    [SerializeField] private Sprite haltSpeed;

Sprite로 선언된 변수에는, public이나 [SerializeField]가 붙어있는 경우 드래그&드롭을 통해 Inspactor에서 그림데이터를 넣을 수 있습니다.


public class CanvasFieldController : CanvasBase
{
    [SerializeField] private Sprite normalSpeed;
    [SerializeField] private Sprite doubleSpeed;
    [SerializeField] private Sprite haltSpeed;

    private Button btnGameSpeed;
    void Awake()
    {
        var gameSpeed = GameObject.Find("GameSpeed");
        btnGameSpeed = gameSpeed.GetComponent<Button>();
        btnGameSpeed.onClick.AddListener(GameSpeed);
    }
    private void GameSpeed()
    {
        Sprite spr = normalSpeed;
        switch(DT.NextScale())
        {
        case DT.TimeScale.Halt: spr = haltSpeed; break;
        case DT.TimeScale.Normal: spr = normalSpeed; break;
        case DT.TimeScale.Double: spr = doubleSpeed; break;
        default:
            false.Assert("Invalid enum");
            break;
        }
        var img = btnGameSpeed.GetComponent<Image>();
        img.AssertNotNull("Image null");
        img.sprite = spr;
    }
}

와 같이 버튼에서 Image 컴포넌트를 꺼내서 sprite변수에 넣는 식으로 버튼의 모양을 바꿀 수 있습니다.