작년 유니티에 적용시킬 디자인 패턴을 공부하다가 찾은 글을 공부하며 정리했던 내용인데
이번 소마에서 custom rule로 사용할 일이 생겨 정리 하는김에 같이 올려봅니다.
Application
- Model, View, Controller에 맞추어 Component를 가지고 있는 큰 단위의 스크립트
public class BounceApplication : MonoBehaviour
{
// MVC의 루트 인스턴스에 대한 Reference
public BounceModel model;
public BounceView view;
public BounceController controller;
// Init things here
void Start() { }
}
Model
- 게임의 데이터가 되는 요소
- 로직이 아닌 순수 데이터가 들어가야 함
- application의 핵심 데이터 및 상태 (ex: 플레이어 상태 또는 탄약)을 보관한다.
- Serialize, deserialize(직렬화, 역직렬화), and/or 유형 간 변환
- 데이터를 load 또는 save(로컬 또는 웹에서)
- 컨트롤러에게 작업 진행 상황을 알린다.
- 게임의 유한 상태 기계에 대한 게임 상태를 저장한다.
- View에 엑세스 하지 않는다.
// Model.cs
class Model
{
public float playerHealth;
public int playerLives;
public GameObject playerGunPrefabA; //Component A
public int playerGunAmmoA;
public GameObject playerGunPrefabB;
public int playerGunAmmoB;
// Ops Gun[C D E ...] will appear...
/* ... */
public float gameSpeed;
public int gameLevel;
}
// BounceModel.cs
// app과 관련된 모든 data를 포함한다.
public class BounceModel : BounceElement
{
// Data
public int bounces;
public int winCondition;
}
View
- 게임 내 외적으로 보이는 모든 요소들이다.
- Controller에서 받은 데이터들을 화면에 출력하는 역할을 한다.
- 사용자에게 최신 게임 상태를 표시하기 위해 Model로 부터 데이터를 가져 올 수 있다. 예를 들어, View 메소드 player.Run()은 내부적으로 model.speed를 사용하여 플레이어 능력을 나타낼 수 있다.
- 모델을 변형해서는 안된다.
- 클래스의 기능을 엄격하게 구현한다.
- PlayerView는 입력 탐지를 구현하거나 게임 상태를 수정해서는 안된다.
- View는 인터페이스가 있고 중요한 event를 알리는 블랙박스 역할을 해야 한다.
- 핵심 데이터(ex: 속도, 상태, 수명)를 저장하지 않는다.
// BallView.cs
// Ball view와 그 특징을 설명
public class BallView : BounceElement
{
// 이것만 있으면 된다. physics는 나머지 일을 하고 있다.
// 충돌 시 콜백 호출
void OnCollisionEnter() { app.Notify(BounceNotification.BallHitGround,this); }
}
Controller
- 게임의 핵심 로직들을 담당한다
- Model들을 조작하고 업데이트 된 Model들을 View에 통지해준다.
- core data를 저장하지 않는다.
- 때때로 원하지 않는 View로부터 noti를 필터링 할 수 있다.
- Model의 데이터를 업데이트하고 사용한다.
- Unity scene의 workflow를 관리한다.
// BounceController.cs
//app workflow를 controls한다.
public class BounceController : BounceElement
{
// ball hit 이벤트를 처리한다.
public void OnBallGroundHit()
{
app.model.bounces++;
Debug.Log(“Bounce ”+app.model.bounce);
if(app.model.bounces >= app.model.winCondition)
{
app.view.ball.enabled = false;
app.view.ball.GetComponent<RigidBody>().isKinematic=true; // stops the ball
OnGameComplete();
}
}
// win 조건을 처리한다.
public void OnGameComplete() { Debug.Log(“Victory!!”); }
}
Component
- 재사용할 수 있는 작고 잘 표현된 스크립트이다.
#유니티 #디자인패턴 #MVC패턴 #Unity
728x90
반응형
'개발 > Unity' 카테고리의 다른 글
[Unity 개발] C# 코드 주석 달기 (0) | 2022.07.19 |
---|---|
[Unity 개발] 2022 1학기 정리 (0) | 2022.06.24 |
[Unity 개발] 최근 개발 내역 정리 (0) | 2022.04.17 |