-
유니티 쉽게 배우는 디자인 패턴 - 빌더 패턴 / Unity Design Pattern - Builder Pattern유니티 2023. 10. 31. 11:54
빌더 패턴이란?
객체를 생성할 때 조립하듯 쌓아올리는 패턴입니다.
객체를 생성할 때 매개변수가 너무 많고 다양한 변화가 필요할 때
로직을 분리해 부분부분 계산할 수 있는 장점이 있습니다.
System.Linq 에서 생성시 조립하는 형태
Dotween 에서 생성시 조립하는 형태
에서 이미 사용이 되고 있습니다.
Dotween은 애니메이션을 모션감있게 간편하게 만드는 기능입니다.
해당 무료 에셋을 다운 후 사용하시면 됩니다.
https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676System.Linq 에서 사용되는 예시
using System.Collections.Generic; using UnityEngine; using System.Linq; public class Test : MonoBehaviour { void Start() { List<int> nums = new List<int> { 1, 2, 3, 4 }; int pickNum = nums.Where(x => x > 1).OrderByDescending(x => x).First(); print(pickNum); // 4 } }
Where : 1보다 큰 것을 찾고
OrderByDescending : 내림차순으로 정렬한 뒤
First : 첫번째 값을
가져옵니다.
Dotween 에서 사용되는 예시
using UnityEngine; using DG.Tweening; public class Test : MonoBehaviour { void Start() { transform.DOMoveX(1, 2).SetEase(Ease.OutSine).SetDelay(3).SetId($"{GetInstanceID()}MoveX"); } }
DoMoveX : X가 1로 2초 동안
SetEase : OutSine 모양의 부드럽게
SetDelay : 3초 이후에
SetId : 인스턴스ID에 MoveX를 붙힌 아이디를 부여하여
이동합니다.
빌더 패턴 반영 전
Builder.cs
using UnityEngine; public class Builder { string name; int age; string phone; public Builder(string name = "", int age = 0, string phone = "") { this.name = name; this.age = age; this.phone = phone; } public void Log() { Debug.Log($"name: {name}, age: {age}, phone: {phone}"); } }
Test.cs
using UnityEngine; public class Test : MonoBehaviour { void Start() { Builder builder = new Builder(name: "aa", phone: "01012345678"); builder.Log(); // name: aa, age: 0, phone: 01012345678 } }
Builder 클래스를 보면 생성자에 선택적 매개변수가 가득 차 있습니다.
값을 넣지 않으면 기본값이 들어가게 되어있습니다.
마치 어떤 사이트에 회원가입을 할 때 필수사항이 아닌 선택사항처럼 말이죠.
이렇게 선택적 매개변수가 한번에 생성하는 곳에서 많아지게 된다면
사용자는 오히려 뭘 넣어야 할지 헷갈릴 수 있습니다.
빌더 패턴 반영 후
Builder.cs
using UnityEngine; public class Builder { string name; int age; string phone; public Builder SetName(string name) { this.name = name; return this; } public Builder SetAge(int age) { this.age = age; return this; } public Builder SetPhone(string phone) { this.phone = phone; return this; } public void Log() { Debug.Log($"name: {name}, age: {age}, phone: {phone}"); } }
Test.cs
using UnityEngine; public class Test : MonoBehaviour { void Start() { Builder builder = new Builder().SetName("aa").SetPhone("01012345678"); builder.Log(); // name: aa, age: 0, phone: 01012345678 } }
Builder 클래스를 보면 각각의 매개변수를 넣는 곳을 모두 함수로 빼 두었습니다.
그리고 자기자신의 클래스 인스턴스인 this를 반환하여 뒤에 이어 붙힐 수 있도록 해 줍니다.
여기서는 단순히 변수에 대입만 하는 예시를 들었지만, 이 함수 내에서 해당 부분의 계산 로직이 들어가면 됩니다.
Test 클래스를 보면 이번에는 SetName과 SetPhone이 .으로 뒤에 연달아 붙게 되었습니다.
마무리
클래스의 생성 시 로직을 분리해 조립하듯 쌓아올리는 빌더 패턴이 참 매력적인것 같습니다.
적재적소한 상황에 사용하면 편리할 것으로 보입니다.
'유니티' 카테고리의 다른 글