VioletaBabel

67. Model View Controller 1 - SendMessage 본문

BCA/4. Unity
67. Model View Controller 1 - SendMessage
Beabletoet 2018. 11. 20. 11:00

Model-View-Controller 구조 1. SendMessage



[Player]     [U I]   [Sound]    [Key]

│       ↑             │

└────→FrameWork←─────────┘


이렇게 따로 떨어져있으면 독립성 유지. 디버깅 편리, 각자 알아서 동작하게 함.


모델 뷰 컨트롤러라는 디자인 모델을 변경한 것.


FrameWork는 SendMsg(바로 지금 처리), PostMsg(지금 하는 일이 다 끝나면 처리), DelayMsg(몇 초 후에 처리) 등을 가지고 있다.

Manager라는 클래스를 두고 ReceiveMsg라는 함수를 둔 후, Player, UI, Sound, Key 등에게 상속시켜준다.


===


프로젝트를 하나 만들고

GameObject, Player, KeyManager라는 오브젝트를 만들어준다.

Player에는 자식으로 스프라이트를 넣어준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//GM.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class GM
{
    static private GM _gm = null;
    static public GM gm
    {
        get
        {
            if (_gm == null)
            {
                _gm = new GM();
                _gm.init();
            }
            return _gm;
        }
    }
    private GameModel _gameModel = null;
    private void init()
    {
        GameObject gmModel = GameObject.FindGameObjectWithTag("GameModel");
        if (gmModel)
            _gameModel = gmModel.GetComponent<GameModel>();
    }
 
    public void SendMessage(int senderID, int receiveID, PacketList packet, int iPacket, object objPacket1, object objPacket2)
    {
        _gameModel.SendMessage(senderID, receiveID, packet, iPacket, objPacket1, objPacket2);
    }
 
    public void SendMessage(Packet packet)
    {
        _gameModel.SendMessage(packet);
    }
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//PlayerManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerManager : Manager
{
    public override void ReceiveMessage(Packet pk)
    {
        switch (pk.packetID)
        {
            case PacketList.PACKET_KEYDOWN:
                {
                    KeyDown(pk.iMessage);
                    break;
                }
            case PacketList.PACKET_KEYUP:
                {
                    KeyUp(pk.iMessage);
                    break;
                }
        }
    }
 
    private bool bSpace = false;
 
    private void KeyDown(int keyCode)
    {
        if (keyCode == (int)KeyCode.Space)
            bSpace = true;
    }
 
    private void KeyUp(int keyCode)
    {
        if (keyCode == (int)KeyCode.Space)
            bSpace = false;
    }
    private void Start()
    {
        _ManagerID = GameModel._PlayerMan;
    }
 
    void Update()
    {
        if (bSpace)
        {
            transform.position += new Vector3(1f, 0* Time.deltaTime * 2f;
        }
    }
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//KeyManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class KeyManager : Manager
{
    public override void ReceiveMessage(Packet pk)
    {
 
    }
 
    private void Start()
    {
        _ManagerID = GameModel._KeyMan;
    }
 
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GM.gm.SendMessage(GameModel._KeyMan, GameModel._PlayerMan, PacketList.PACKET_KEYDOWN, (int)KeyCode.Space, nullnull);
        }
        if (Input.GetKeyUp(KeyCode.Space))
        {
            GM.gm.SendMessage(GameModel._KeyMan, GameModel._PlayerMan, PacketList.PACKET_KEYUP, (int)KeyCode.Space, nullnull);
        }
    }
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Manager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public abstract class Manager : MonoBehaviour
{
    protected int _ManagerID = 0;
    public int managerID
    {
        get
        {
            return _ManagerID;
        }
    }
    public abstract void ReceiveMessage(Packet pk);
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Packet.cs
using System.Collections;
using System.Collections.Generic;
 
public enum PacketList
{
    PACKET_KEYDOWN = 0// iMessage : KeyCode
    PACKET_KEYUP = 1    // iMessage : KeyCode
}
 
public class Packet
{
    public int senderID = 0;
    public int recieveID = 0;
    public PacketList packetID = 0;
    public int iMessage = 0// 키 눌렀을 때
    public object objMessage1 = null// sound용
    public object objMessage2 = null// sound용
    public float dispatchTime = 0// 얼마나 Delay되느냐 하는 시간
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//GameModel.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class GameModel : MonoBehaviour
{
    public const int _PlayerMan     = 0x00000001;
    public const int _KeyMan        = 0x00000010;
    [Header("Managers")]
    public GameObject playerMan = null;
    public GameObject keyMan = null;
 
    private List<Manager> managerList = new List<Manager>();
 
    void Start()
    {
        managerList.Add(playerMan.GetComponent<PlayerManager>());
        managerList.Add(keyMan.GetComponent<KeyManager>());
    }
 
    void Update()
    {
 
    }
 
    public void SendMessage(int senderID, int receiveID, PacketList packet, int iPacket, object objPacket1, object objPacket2)
    {
        Packet pk = new Packet();
        pk.senderID = senderID;
        pk.recieveID = receiveID;
        pk.packetID = packet;
        pk.iMessage = iPacket;
        pk.objMessage1 = objPacket1;
        pk.objMessage2 = objPacket2;
        SendMessage(pk);
    }
 
    public void SendMessage(Packet packet)
    {
        DispatchMessage(packet);
    }
 
    private void DispatchMessage(Packet pk)
    {
        foreach(Manager mn in managerList)
        {
            int bReceive = mn.managerID & pk.recieveID; // 여러 곳에 동시에 보내는데, 다 도는 중에 받기로 된 곳만 트루에 뜨게 하기 위해.
            if (bReceive != 0)
            {
                mn.ReceiveMessage(pk);
            }
        }
    }
}
 
cs


GameObject에는 GameModel.cs를 붙여준 후, PlayerMan에는 Player를, KeyMan에는 KeyManager를 붙여준다.

Player에는 PlayerManager.cs를 붙여준다.

KeyManager에는 KeyManager.cs를 붙여준다.


GM.cs는 싱글톤으로 기능한다.

Manager.cs의 자식으로 KeyManager.cs, PlayerManager.cs를 둔다.

Packet.cs는 단순 클래스로 기능한다.

'BCA > 4. Unity' 카테고리의 다른 글

70. Unity 팁 2  (0) 2018.11.21
69. Unity 팁 1  (0) 2018.11.21
66. A*를 응용한 이동  (0) 2018.08.14
65. A* (유니티)  (0) 2018.08.13
54. Shader  (0) 2018.07.16
Comments