VioletaBabel
67. Model View Controller 1 - SendMessage 본문
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, null, null); } if (Input.GetKeyUp(KeyCode.Space)) { GM.gm.SendMessage(GameModel._KeyMan, GameModel._PlayerMan, PacketList.PACKET_KEYUP, (int)KeyCode.Space, null, null); } } } | 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