팩토리 패턴 (Factory Pattern)
객체 생성 로직을 캡슐화하여 코드의 유연성과 재사용성을 높이는 디자인 패턴
(스타크래프트의 테란 배럭, 프로토스의 게이트웨이 등 같은 몬스터를 뽑아낼 때 유용한 패턴)
팩토리 패턴은 객체 생성에 대한 책임을 한 곳에 집중시켜 코드의 유지보수성을 높이고,
객체 생성 시 다양한 의존성을 관리할 수 있도록 도와줌.
(공통적인 특징을 오직 한곳에서만 관리)
유니티와 같은 게임 엔진에서는 캐릭터, 아이템, 이펙트와 같은 게임 오브젝트를 동적으로
생성해야 할 때가 많음. 이때 팩토리 패턴을 활용하면 코드가 더 깔끔하게 확장이 가능해짐.
- 심플 팩토리 패턴(Simple Factory Pattern)
단일 팩토리 클래스에서 특정 조건에 따라 하나의 객체를 생성하여 반환
팩토리 클래스가 생성 로직을 전담하며, 클라이언트는 객체를 직접 생성하지 않고 팩토리를 통해 생성된 객체를 사용
구현이 간단하며, 특정 객체 생성에만 집중. 단일 제품군에 적합
(스타크래프트 배럭에서는 마린만, 해쳐리에서는 드론만 뽑고 싶을 때 심플 팩토리 패턴)
*** TextMeshPro 설정에서 자동 줄바꿈 끄기

스크립트 해석
Unit 스크립트
(유닛 데이터 관리와 행동 정의를 위한 핵심적인 역할)
추상(abstract) 클래스 메서드
추상 클래스는 직접 인스턴스를 생성할 수 없으며, 이를 상속받는 클래스가 구현 내용을 정의해야 함
추상 메서드의 구체적인 구현은 이 클래스를 상속받는 서브 클래스에서 정의해야 함.
SettingDatas2 스크립트
(Soldier와 Flight 두 가지 유형의 유닛에 대한 기본 속성 값을 저장하는 역할을 수행)
Flight, Soldier 스크립트
(각 각, StateUpdate와 InforUnitState 메서드를 구현하여 유닛의 상태 업데이트와 상태 정보를 반환하는 기능을 제공)
어떤 추상 클래스를 상속받는지 제대로 명시해야 하고
추상 메서드를 사용할때는 반드시 override 를 작성해야함.
// Unit 클래스를 상속
// 이 클래스를 사용하면 Unit 클래스에서 정의된 기본 속성(unitName, level, HP, attackPower)을 사용할 수 있음.
// Unit 클래스에 정의된 추상 메서드(StateUpdate와 InforUnitState)를 구체적으로 구현해야 함.
public class Soldier : Unit
// InforUnitState는 Unit 클래스에서 정의된 추상 메서드를 구현
// 이 메서드는 Soldier의 상태 정보를 문자열 배열로 반환
public override string[] InforUnitState()
{
string[] state = new string[4];
// 각 속성은 ToString()을 호출하여 문자열로 변환
state[0] = unitName;
state[1] = level.ToString();
state[2] = HP.ToString();
state[3] = attackPower.ToString();
return state;
}
SimpleFactoryGameManager 스크립트
(유닛 클릭 시 상태를 UI에 표시하고, 상태 창을 닫을 수 있는 기능을 제공)
Raycasting: 마우스 클릭 위치에서 Ray를 발사하여 어떤 오브젝트와 충돌하는지 확인
RaycastHit 구조체는 충돌한 Collider, 충돌 지점, 법선 벡터 등의 정보를 포함
private void InfoUnitState()
{
RaycastHit hit;
// Camera.main: 주 카메라
// Input.mousePosition: 마우스의 스크린 좌표를 가져옵니다. 이는 2D 화면상의 마우스 위치
// ScreenPointToRay: 스크린 좌표를 3D 공간상의 Ray로 변환. 이렇게 생성된 Ray는 마우스 위치에서 발사되며, 이 Ray는 씬 내의 물체와 충돌을 감지
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// Ray가 씬의 오브젝트와 충돌할 때까지 발사
// out hit: Ray가 충돌한 물체에 대한 정보를 hit 변수에 전달.
// 이 메서드는 충돌 여부를 반환하며, 충돌한 물체가 있다면 hit.collider를 통해 해당 물체의 Collider를 참조
Physics.Raycast(ray, out hit);
// hit.collider는 Raycast가 충돌한 물체의 Collider를 참조
if (hit.collider.CompareTag("Soldier"))
{
// hit.collider.gameObject: 충돌한 물체의 GameObject를 참조
// GetComponent<Soldier>(): 이 GameObject에서 Soldier 컴포넌트를 가져옴.
// Soldier 컴포넌트에 정의된 InforUnitState() 메서드를 호출하여 해당 유닛의 상태 정보를 가져옴
// InforUnitState()가 반환한 유닛의 상태 정보를 ShowStateInUI() 메서드로 전달, UI에 나타나게 함
ShowStateInUI(hit.collider.gameObject.GetComponent<Soldier>().InforUnitState());
}
else if (hit.collider.CompareTag("Flight"))
{
// hit.collider.gameObject: 충돌한 물체의 GameObject를 참조
// GetComponent<Soldier>(): 이 GameObject에서 Soldier 컴포넌트를 가져옴.
// Soldier 컴포넌트에 정의된 InforUnitState() 메서드를 호출하여 해당 유닛의 상태 정보를 가져옴
// InforUnitState()가 반환한 유닛의 상태 정보를 ShowStateInUI() 메서드로 전달, UI에 나타나게 함
ShowStateInUI(hit.collider.gameObject.GetComponent<Flight>().InforUnitState());
}
}
'게임 개발(유니티) > 멋쟁이 사자처럼 3기_회고록' 카테고리의 다른 글
| 유니티 디자인패턴_Factory Pattern패턴(2) (0) | 2025.01.12 |
|---|---|
| 매개변수 (0) | 2025.01.10 |
| 유니티 디자인패턴_Observer 패턴 (0) | 2025.01.09 |
| 유니티 디자인패턴_Command 패턴 (0) | 2025.01.08 |
| Uni Task는 무엇인가? (0) | 2025.01.05 |