2021. 5. 8. 0:24
https://blog.naver.com/nagne2011/222342132441
ZenJect - 의존성 주입 - Factory
#zenject #factory Zenject 내부 함수 중 제일 많이 쓰는 Factory에 대해 알아보자 특징은 두가지다 1. ...
blog.naver.com
#zenject #factory
Zenject 내부 함수 중 제일 많이 쓰는 Factory에 대해 알아보자
특징은 두가지다
1. 기존 게임오브젝트 복제(Instantiate)함수 보다 훨신 빠르다
2. 복제된 오브젝트가 'inject'을 받기위해선 factory로 생성해야한다
준비할건 복제할 오브젝트와 해당 오브젝트에 연결된 스크립트다
각각 접미사 '...factory', '..contoroller'로 명명한다

사진 설명을 입력하세요.

사진 설명을 입력하세요.
그리고 오브젝트는 프리펩으로 만들어둔다
스크립트 내부에 Factory를 상속받는 클래스를 만들어줘야한다
public class CopyObjectController : MonoBehaviour
{
[Inject]
public User m_user;
private void OnEnable()
{
this.name = m_user.Age;
}
public class Factory : PlaceholderFactory<User, CopyObjectController>
{
}
}
테스트를 위해서 제대로 'User'가 의존성주입으로 구성되었는지 확인하기위해
대충 OnEnable()함수에 m_user의 데이터가 대충 출력되도록 구성한다
*21.05.07
Factory함수는 PlaceholderFactory로 대체되었다
본문에서도 PlaceholderFactory를 사용한다
'...factory'함수는 아래처럼 구성한다
public class CopyObjectFactory : IFactory<User, CopyObjectController>
{
private const string PREFAB_NAME = "Prefabs/CopyObject";
DiContainer m_container;
public CopyObjectFactory(DiContainer container)
{
m_container = container;
}
public CopyObjectController Create(User param)
{
return m_container.InstantiatePrefabResourceForComponent<CopyObjectController>(PREFAB_NAME, new object[] { param });
}
}
쪼금 복잡한데..
일단 IFactory를 상속받자
의존성 주입을 진행할 '클래스'와 '...controller'클래스를 할당한다
그래고 프리펩 오브젝트의 위치를 string으로 만들어주고
생성자를 통해 DiContainer를 받아온다
(위치는 Resources폴더를 기준으로 한다. 위 예시를 따르면 Resources/Prefabs/ 경로에 프리펩을 둬야한다)
이제 인터페이스로 구현해야할 Create함수를 추가하는데,
DiContainer변수의 'InstantiatePrefabResourceForComponent"를 추가하고
파라미터로 각각 프리펩오브젝트 위치와 파라미터로 받는 '의존성 주입을 진행할 클래스'를 넣는다
준비가 다됬으니 Bind로 넘어간다
public class ServiceInstaller : MonoInstaller
{
public override void InstallBindings()
{
Container.BindFactory<User, CopyObjectController, CopyObjectController.Factory>().FromFactory<CopyObjectFactory>();
}
}
BindFactory의 인자값으로 주입할 클래스, 프리펩의 컨트롤러스크립트, 그것의 Factory클래스>를 잡아주고
CopyObjectFactory으로부터 연결시켜준다
이걸 사용해서 해당 프리펩을 복제해서 사용하는 스크립트를 만들어준다
using Zenject;
public class CopyObjects : MonoBehaviour
{
}

우선 Inject로 생성한 Factory를 먼저 추가한다음
간단한 for문을 이용해서 'Create'해보자
public class CopyObjects : MonoBehaviour
{
[Inject]
CopyObjectController.Factory CopyObjectControllerFactoy;
void Start()
{
for (int i = 0; i < 10; i++)
{
User user = new User();
user.Age = i.ToString();
user.Name = "테스터";
user.Name = "Kor";
GameObject obj = CopyObjectControllerFactoy.Create(user).gameObject;
obj.transform.SetParent(this.transform);
}
}
}
대충 복제할 오브젝트의 클래스인 User클래스를 만들어서 테스트용 데이터를 체워두고 (age에 0~9 입력)
Inject한 Controller의 Factory의 함수인 Create를 진행한다
(오브젝트 정리를 위해 현재 오브젝트 하위에 생성되도록 SetParent도 진행)
*여담이지만 처음 개발을 배울때 for문이 너무 햇갈렸다.. 하루 열번씩 다양한 for문을 써보는 공부를 했던 기억이..

정상적으로 for문이 돌아가면서, 만들어놨던 프리펩이 '생성'되면서,
inject로 객체를 주입한 User클래스가 적용되면서
초기에 테스트를 위해 OnEnable()함수에서 User의 age를 오브젝트 이름으로 나오면서
성공!
'유니티' 카테고리의 다른 글
유니티 서버연결 - 1- nodejs, express, sublime text3 (0) | 2022.02.15 |
---|---|
Instantiate, Delegate, Event - 버튼 이벤트 (0) | 2022.02.15 |
ZenJect - 의존성 주입 (0) | 2022.02.15 |
유니티 무한스크롤 (infinite scrollview) (0) | 2022.02.15 |
JsonUtility 사용법 (0) | 2022.02.15 |