View

๊ฐœ๋…

  • MVP ์˜ V์— ํ•ด๋‹นํ•˜๋Š” View.

  • ํ•œ ํ™”๋ฉด์— ํ•˜๋‚˜๋งŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ์™ธ ์žˆ์Œ)

๊ตฌํ˜„ ์ •์ฑ…

  • ScreenSystem์˜ PageViewBase, ModalViewBase ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„.

  • Lifecycle์—์„œ Model์„ ๋ฐ›์•„ ํ™”๋ฉด์„ ๊ตฌ์ถ•ํ•œ๋‹ค.

  • ๊ฐ ๋ฒ„ํŠผ ๋“ฑ์˜ UI ์š”์†Œ๋Š” SerializeField๋กœ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

  • ๊ฐ ๋ฒ„ํŠผ์˜ ์ด๋ฒคํŠธ๋Š” IObservable๋กœ ๊ณต๊ฐœํ•œ๋‹ค.

  • ๋ชฉ๋ก ๋“ฑ ๋™์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” View์˜ ๋ถ€๋ถ„์€ ์ด View ๋‚ด์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

    • ์ฆ‰, View๊ฐ€ View๋ฅผ ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ

    • ์ด๋ฒคํŠธ๋„ ๋ธŒ๋ฆฟ์ง€์ฒ˜๋Ÿผ ๋˜์–ด๋ฒ„๋ฆฌ์ง€๋งŒ, ์ด๋ฒคํŠธ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ—ˆ์šฉ.

    • ๋‹ค๋งŒ, View์˜ ์—ญํ• ์„ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์—ญํ• ๋กœ ํ•œ์ •ํ•จ์œผ๋กœ์„œ ๊ฐ ์ฒ˜๋ฆฌ ๊ฐ„์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

      • Model์„ ๋ฐ›์•„์„œ ํ™”๋ฉด UI๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ

      • ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ๋™์‹œํ‚ค๋Š” ๊ฒƒ

  • UI์• ๋‹ˆ๋ฉ”์ด์…˜์€ Animator๋‚˜ Timeline ๋“ฑ์˜ ๋น„์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ์— ์˜์ง€ํ•จ์œผ๋กœ์„œ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ๋Ÿ‰์„ ์ค„์ธ๋‹ค.

  • ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚  ๋•Œ๊นŒ์ง€ UniTask๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

  • 1ํ™”๋ฉด 1View๊ฐ€ ์›์น™

    • ์œ„์˜ ์ด์œ ๋“ค๋กœ View๋Š” ๋น„๋Œ€ํ•ด์ ธ๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.

  • ํ”„๋กœ์ ํŠธ์— ๋”ฐ๋ผ์„œ๋Š” Model์„ ์ง์ ‘ View์— ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค. (์•„๋ž˜์˜ ๊ฒฝ์šฐ์— ์ธํ„ฐํŽ˜์ด์Šคํ™” ํ•จ์„ ์ถ”์ฒœ)

    • View๋‚˜ Model์ด ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ

์˜ˆ์‹œ ์ฝ”๋“œ

public class TestPageView : PageViewBase
{
    [SerializeField] private TextMeshProUGUI _messageText;
    [SerializeField] private Button _nextPageButton;
    [SerializeField] private Button _nextModalButton;
    
    // ๋ฒ„ํŠผ์€ ํด๋ฆญ ์ด๋ฒคํŠธ๋งŒ ๊ณต๊ฐœํ•œ๋‹ค
    public IObservable<Unit> OnClickPage => _nextPageButton.OnClickAsObservable();
    public IObservable<Unit> OnClickModal => _nextModalButton.OnClickAsObservable();

    // Model์„ ๋ฐ›์•„ ํ™”๋ฉด ๊ตฌ์„ฑํ•˜๊ธฐ
    public void SetView(TestPageModel model)
    {
        _messageText.SetText(model.TestMessage);
    }
}
  • ๋ฒ„ํŠผ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋Š” UniRx๊ฐ€ ์•„๋‹Œ UniTask์˜ IUniTaskAyncEnumerable๊ณผ ForEachAwaitAsync๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Œ.

    • UniTask๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ํ†ต์‹  ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๋‹ค์Œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๋“ฑ ๋ธ”๋กœํ‚น์— ์ค€ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ.

    • UniTask๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ UniTask Tracker๋กœ ๋””๋ฒ„๊น…์ด ๋” ์‰ฌ์›Œ์ง€๊ธฐ๋„ ํ•จ.

    • UniRx/UniTask ์ค‘ ์–ด๋А ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž์˜ ๊ธฐ์ˆ ์ด๋‚˜ ์ง€์‹์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง. (ํŽธํ•œ ์ชฝ์„ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.)

์ฐธ๊ณ : UniTask๋ฅผ ์ด์šฉํ•œ ๋ฒ„ํŠผ ์ฒ˜๋ฆฌ ์ƒ˜ํ”Œ

// View
public IUniTaskAsyncEnumerable<AsyncUnit> OnClickAsync => _button.OnClickAsAsyncEnumerable();

// Presenter
_view.OnClickAsync.ForEachAwaitAsync(async _ =>
{
    // ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ, ํŠนํžˆ ํ†ต์‹  ์ฒ˜๋ฆฌ ๋ฐ ํ™”๋ฉด ์ „ํ™˜ ์ฒ˜๋ฆฌ
    // await ~~
    // ํ•จ์ˆ˜ ๋‚ด ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
});

Last updated