안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

레이블이 메소드에서 수행한 ui 변경이 반영되지 않는 경우인 게시물을 표시합니다. 모든 게시물 표시
레이블이 메소드에서 수행한 ui 변경이 반영되지 않는 경우인 게시물을 표시합니다. 모든 게시물 표시

2024년 12월 25일 수요일

[유니티][Unity][Copilot] UI 조작하는 클래스에서 조작한 데이터가 UI에 변경되지 않은 이유

 중복으로 작성해야 되는 UI 변경 코드를 한번만 쓰기 위해서 별도 class에 작성하였는데,

이 class에서 UI를 변경해도 결과가 반영이 되지 않았다.

 왜 이런가 고민하다 살펴보니 이 class에는 monobehaviour를 상속받지 않아서 발생하는 것이었다. 

 이를 해결하기 위해서는 아래와 같이 monobehaviour가 없는 class에 그릴려고 하는 UI가 있는 class를 상속받아서 그려주는 식으로 처리를 하면 된다고 한다.


 아래와 같이 작성하면 된다.

// 비 MonoBehaviour 클래스

public class DataProcessor

{

    private UIManager uiManager;


    public DataProcessor(UIManager manager)

    {

        uiManager = manager;

    }


    public void ProcessData()

    {

        // 데이터 처리 후 UI 변경

        uiManager.UpdateUI("Processing Complete", someSprite);

    }

}


// MonoBehaviour 클래스

public class UIManager : MonoBehaviour

{

    public Text myText;

    public Image myImage;


    void Start()

    {

        if (myText == null || myImage == null)

        {

            Debug.LogError("UI components are not assigned!");

        }

    }


    public void UpdateUI(string newText, Sprite newSprite)

    {

        if (myText != null)

        {

            myText.text = newText;

        }


        if (myImage != null)

        {

            myImage.sprite = newSprite;

        }

    }

}


// 게임 관리 클래스

public class GameManager : MonoBehaviour

{

    public UIManager uiManager;

    private DataProcessor dataProcessor;

    public Sprite someSprite;


    void Start()

    {

        dataProcessor = new DataProcessor(uiManager);

    }


    void Update()

    {

        if (Input.GetKeyDown(KeyCode.Space))

        {

            dataProcessor.ProcessData();

        }

    }

}

**본 문은 Microsoft Copilot의 도움을 받아 제작되었습니다.
 새로 만든 Image가 조작한 Image를 가리고 있어서 Image 변경이 안 된 걸로 보였더군요. 본문에 있는 방법이 아니라 다른 방법을 통해 Monobehaviour가 없는 클래스에서도 UI 컨트롤이 가능합니다. 하는 방법은 아래 링크 참조바랍니다.