Skip to content

Joseph-Cha/ArchitectureStudyForUnity

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

12 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

MVP ํŒจํ„ด์— ๋Œ€ํ•ด์„œ

์™œ MVP ํŒจํ„ด์„ ์Šคํ„ฐ๋”” ํ•˜๊ฒŒ ๋˜์—ˆ์„๊นŒ?

์ฒซ ์ถœ๋ฐœ์ ์€ โ€œ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ž˜ ๊ด€๋ฆฌ(๋˜๋Š” ๊ตฌ๋ถ„) ํ•  ์ˆ˜ ์žˆ์„๊นŒ?โ€๋ž€ ์งˆ๋ฌธ์—์„œ ์‹œ์ž‘ ๋˜์—ˆ๋‹ค.

์ตœ๊ทผ ๋“ค์–ด ๊ธฐํš์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์•ฑ(๋˜๋Š” ์•ฑ ๋‚ด๋ถ€ ํŠน์ • ๊ธฐ๋Šฅ)์„ ์ปค์Šคํ…€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์•ฑ์„ ๊พธ๋ฏธ๊ฑฐ๋‚˜ ๋˜๋Š” ์บ๋ฆญํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๊พธ๋ฏธ๋Š” ๋“ฑ ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž ์ž…๋ง›์— ๋ง›๋„๋ก ์›ํ•˜๋Š” ์„ค์ •์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ œ๊ณต์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ฃ๊ณ  ์žˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ๋ฅผ ๊ณ„์† ๊ณ ๋ฏผ์„ ํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ๋“  ์ƒ๊ฐ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

์ฆ‰, ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ„๋„์˜ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ด์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ์™€ ๋กœ์ง์„ ๊ตฌ๋ถ„ ์ง“๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ๋˜ ์ค‘ MVP ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์–ด ์Šคํ„ฐ๋””๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์šฐ์„  ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค„๊นŒ?

Unity์—์„œ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ Asset ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ Scriptable Object์ด๋‹ค.

(Scriptable Object์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ ๋งํฌ๋ฅผ ์ฐธ์กฐ)

๊ทธ๋ž˜์„œ MVP ํŒจํ„ด์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

MVP ํŒจํ„ด ์ž์ฒด์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ ๋ธ”๋กœ๊ทธ์— ์ž์„ธํžˆ ๋‚˜์™€ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์—ฌ๊ธฐ์„œ ์ง์ ‘ ํ•ด๋ณผ ๊ฒƒ์€ Slider๋ฅผ ํ†ตํ•ด ์บ๋ฆญํ„ฐ์˜ ๋จธ๋ฆฌ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•ด๋ณด๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ MVP ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„์„ ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

<์‹œ๋‚˜๋ฆฌ์˜ค>

View

โ‡“ Slider๋ฅผ ์ด๋™

Presenter

โ‡“ ๋ณ€๊ฒฝ๋œ UI ๊ฐ’์„ Scriptable Object์— ์ €์žฅ

Scriptable Obejct

์ผ๋‹จ ์—ฌ๊ธฐ๊นŒ์ง€ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ณ  Scriptable Obejct์˜ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์บ๋ฆญํ„ฐ์—๊ฒŒ ์ „๋‹ฌ์„ ํ•ด์ค„์ง€ ์ด์–ด์„œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด์ž.

๊ตฌํ˜„๋ถ€

  1. ์”ฌ ๊ตฌ์„ฑ

image

  1. ์†Œ์Šค

HairColorPresenter.cs

using UnityEngine;
using UnityEngine.UI;

public class HairColorPresenter : MonoBehaviour
{
    // View
    [SerializeField]
    private Slider RedColor_Slider;
    [SerializeField]
    private Slider GreenColor_Slider;
    [SerializeField]
    private Slider BlueColor_Slider;

    // Model
    [SerializeField]
    private HairColorModel HairColorModel;

    private void Awake()
    {
        RedColor_Slider.onValueChanged.AddListener(v => HairColorModel.RedValue = v);
        GreenColor_Slider.onValueChanged.AddListener(v => HairColorModel.GreenValue = v);
        BlueColor_Slider.onValueChanged.AddListener(v => HairColorModel.BlueValue = v);
    }
}

HairColorModel.cs

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

[CreateAssetMenu(fileName = "HairColorModel", menuName = "Hair")]
public class HairColorModel : ScriptableObject
{
    public float RedValue;
    public float GreenValue;
    public float BlueValue;
}

Slider๋ฅผ ๋ณ€๊ฒฝ ์‹œ์ผฐ์„ ๋•Œ

  1. Slider์˜ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ฐ”๋กœ Sciptable Object์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

image

  1. (์ค‘์š”)Play๋ฅผ ์ข…๋ฃŒํ•ด๋„ Sciptable Object ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

image

์ด์ œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด Model ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ GameObject์— ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์„๊นŒ?

์ผ๋‹จ UI๋ฅผ ์ˆ˜์ • ํ–ˆ์„ ๋•Œ Model ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ๊ตฌํ˜„์ด ๋˜์—ˆ๋‹ค.

์ด์ œ ๋‚จ์€ ๊ฒƒ์€ ๋ณ€๊ฒฝ๋œ Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ GameObject์—๋„ ๋ฐ˜์˜์„ ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ์žˆ๊ฒ ์ง€๋งŒ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„์„ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

  1. Addressable System
  2. ์ด๋ฒคํŠธ ๊ตฌ๋…

Addressable์€ ์š”์ฆ˜ ์œ ๋‹ˆํ‹ฐ์—์„œ ๋ฐ€๊ณ  ์žˆ๋Š” Asset ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ธ๋ฐ ์—„์ฒญ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๊ธฐ ๋ณด๋‹ค Asset์ด ์žˆ๋Š” ๊ฒฝ๋กœ ๊ฐ’์„ ํ†ตํ•ด ์—์…‹์„ ์‰ฝ๊ฒŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋กœ์ง๋งŒ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ ๊ตฌ๋… ๋ฐฉ์‹์€ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

Addressable์„ ํ™œ์šฉํ•ด์„œ Model ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

Addressable์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๊ธฐ ๋งํฌ๋ฅผ ํ†ตํ•ด ์ฐธ๊ณ ๋ฅผ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

  1. ์”ฌ ์…‹ํŒ…

image

  1. Addressables ์„ค์ •

image

  1. Model ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AddressableAssets;

public class Hair : MonoBehaviour
{
    [SerializeField]
    private Image Image;

    private HairColorModel hairColor { get; set; }

    private void Awake()
    {
        Addressables.LoadAssetAsync<HairColorModel>("HairModel").Completed += ao =>
        {
            if (ao.IsDone)
            {
                hairColor = ao.Result;
            }
        };
    }
}

์ด๋ฒคํŠธ ๊ตฌ๋… ๋ฐฉ์‹ ๊ตฌํ˜„

  1. HairColorModel์—์„œ ์ด๋ฒคํŠธ ์ƒ์„ฑ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(fileName = "HairColorModel", menuName = "Hair")]
public class HairColorModel : ScriptableObject
{
    public float RedValue;
    public float GreenValue;
    public float BlueValue;

    // ๊ฐ Color ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ด๋ฒคํŠธ ์ถ”๊ฐ€
    public UnityAction<float> OnRedValueChanged;
    public UnityAction<float> OnGreenValueChanged;
    public UnityAction<float> OnBlueValueChanged;
}
  1. Presenter์—์„œ Slider์™€ Model์˜ ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐ
using UnityEngine;
using UnityEngine.UI;

public class HairColorPresenter : MonoBehaviour
{
    // View
    [SerializeField]
    private Slider RedColor_Slider;
    [SerializeField]
    private Slider GreenColor_Slider;
    [SerializeField]
    private Slider BlueColor_Slider;

    // Model
    [SerializeField]
    private HairColorModel HairColorModel;

    private void Awake()
    {
        // UI๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ 
        // Model์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰
        RedColor_Slider.onValueChanged.AddListener(v =>
        {
            HairColorModel.RedValue = v;
            HairColorModel.OnRedValueChanged?.Invoke(v);
        });

        GreenColor_Slider.onValueChanged.AddListener(v =>
        {
            HairColorModel.GreenValue = v;
            HairColorModel.OnGreenValueChanged?.Invoke(v);
        });

        BlueColor_Slider.onValueChanged.AddListener(v =>
        {
            HairColorModel.BlueValue = v;
            HairColorModel.OnBlueValueChanged?.Invoke(v);
        });
    }
}
  1. Hair์—์„œ Model์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AddressableAssets;

public class Hair : MonoBehaviour
{
    [SerializeField]
    private Image Image;

    private HairColorModel hairColor { get; set; }

    private Color color = new Color(r: 0, g: 0, b: 0, a: 1);

    private void Awake()
    {
        Addressables.LoadAssetAsync<HairColorModel>("HairModel").Completed += ao =>
        {
            if (ao.IsDone)
            {
                hairColor = ao.Result;

                // ๋ชจ๋ธ์ด ๋“ค๊ณ  ์žˆ๋Š” ์ด๋ฒคํŠธ ๊ตฌ๋…
                hairColor.OnRedValueChanged += ChangeRedColor;
                hairColor.OnGreenValueChanged += ChangeGreenColor;
                hairColor.OnBlueValueChanged += ChangeBlueColor;
            }
        };
    }

    private void ChangeRedColor(float value)
    {
        color.r = value;
        Image.color = color;
    }

    private void ChangeGreenColor(float value)
    {
        color.g = value;
        Image.color = color;
    }

    private void ChangeBlueColor(float value)
    {
        color.b = value;
        Image.color = color;
    }
}

์‹ค์ œ ์ž‘๋™ ํ™•์ธ

image

๊ฒฐ๋ก 

๊ตณ์ด ์ด๋ ‡๊ฒŒ ์–ด๋ ต๊ฒŒ ๊ตฌํ˜„์„ ํ•ด์•ผํ•˜๋‚˜ ์‹ถ์€ ์˜๊ตฌ์‹ฌ์ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ,

์•ž์„œ ์ด์•ผ๊ธฐ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์™€ ๋กœ์ง์„ ๊ตฌ๋ถ„์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์™€์„œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” Hair class์—์„œ๋Š” UI๋ฅผ ์ „ํ˜€ ๋ชฐ๋ผ๋„ ๋˜๊ณ 

๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•œ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์งค ๊ฒƒ์ธ์ง€์—๋งŒ ์ง‘์ค‘์„ ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์•„๋ž˜ ๋ถ€๋ถ„์„ ๋” ๋ณด์•ˆํ•˜๋ฉด ์กฐ๊ธˆ ๋” ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด ์งˆ ๊ฒƒ ๊ฐ™๋‹ค.

  1. HairColorModel์—์„œ ์†์„ฑ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฐ”๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋กœ์ง ์ถ”๊ฐ€
  2. RGB ๊ฐ’ ๋ณ€๊ฒฝ์—์„œ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ ์ œ๊ฑฐ โ†’ RGB ๊ฐ’์„ ๋”ฐ๋กœ ๋”ฐ๋กœ ๊ตฌ๋ถ„ ์ง“๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๋นผ๋†“๋Š” ๋ฐฉ์‹

About

MVP & MVVM Design Patterns for Unity

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages