예를들면
워리어 컨트롤러 같은 클래스가 조작에 관한 상태머신과 각 상태를 new로 생성한다고 할때,
'워리어 컨트롤러'
'워리어 상태머신'
'워리어 상태 A'
'워리어 상태 B'
...
이런 구조로 만들어지는데, 상태머신도 그렇고, 각 스테이트들이 아무래도 워리어 컨트롤러의 멤버변수 (private)를 많이 사용하는게 당연하잖아요?
각 스테이트 A,B에서 워리어컨트롤러 클래스의 멤버변수를 가져와서 변경해야 할 경우가 생기는데 private라서 사용하기가 어렵습니다.
해결법을 찾아보니
1. 워리어 컨트롤러 변수를 모두 public 선언 or 프로퍼티로 선언 후 각 스테이트에서 받아서 처리
2. 워리어 컨트롤러 변수를 '박스'로 묶어서 넘겨줌
3. 워리어 컨트롤러 내부에 메소드를 정의하고 각 스테이트에서 해당 메소드를 불러서 사용함
상태머신 및 상태A,B에서 자기 클래스의 변수인 것 처럼 '워리어 컨트롤러'의 멤버변수를 사용할 수 있으면 좋을텐데, 보통 위의 3개의 해결법 중 하나로 처리하시나요?
조금 고급 스킬인데 interface에 필드를 public으로 선언하고서 class에서 구현할때 private로 인터페이스를 구현후 상태 A, B에선 워리어컨트롤러를 선언한 인터페이스로 cast 해서 쓸때도 있음 이러면 private를 유지하면서 public하게도 쓸 수 있음
혹은 A,B를 워리어 클래스 안에서 구현하면 다 가져다 쓸 수 있긴한데 보통 님이 말한것처럼 1,2,3을 상황에 맞춰서 쓰지
말씀해주신대로 인터페이스로 외부에서 퍼블릭처럼 쓰는것도 찾아봤는데 제가 아직 대가리 깡통이라 나중에 수정할때 '이게 뭐였더라' 할거같네요 그냥 정석대로 써야겠네요 답변 감사합니다
참조 타입 변수면, 위에서 아래로 주입해주는것도 할만함
예를들어 어떤 엔진인지는 모르겠지만, Unity기준 상태가 Monobehaviour은 안쓰는데 자신이 붙어있는 게임 오브젝트를 가져오고 싶다? 상태 인터페이스에 GameObject변수 하나 넣어주고 머신에서 myGameObject = this.gameObject 이런식으로
깔끔하게 통째로 되려나? 싶었는데 아쉽네요. 딕셔너리같은건 집어넣어주면 되는데 변수가 골고루 다있어서...
하위로 보내고 싶은 변수들만 클래스로 묶어서 아래로 주입해버려
유니티 맞아요! 상태머신에서 DI같이 변수 넘겨주는 방식으로 필요한 클래스 넣어서 초기화때 저장하도록 처리하고 있긴 한데 게임오브젝트나 클래스 내부 변수접근하는게 은근 어려워서...
Contoller에서 MyClass myClass = new MyClass(); stateMachine.myClass = this.myClass; 상태머신에서 각 상태로 state.myClass = this.myClass; 이런식 으로 전달 ㄱㄱ
class 내부의 int는 참조로 작동해서, 보낼거 묶어서 보내면 되긴함
저런식으로 작성하면 각 state에서 myClass.myVar 식으로 컨트롤러 변수도 제어 가능하기는 한데, "myClass." 이걸 없애버리고 싶은거면 좀 힘들듯 ㅋㅋㅋ
감사합니다! 말씀해주신 부분도 확인해서 각 상태들 초기화 깔끔하게 짜볼게요
굳이 myClass. 이거까지 없애고 싶으면 아예 상태에서 프로퍼티로 MyVar {get => myClass.myVar; set => myClass.myVar = value;} 이거 넣어주면 되긴함
저렇게 하면 MyVar = 3 이런식으로 하면 컨트롤러 myVar까지 싹 바뀜
오 스테이트에서도 프로퍼티로 연결해주면 계속 myClass. 안써도 되고 깔끔하겠네요 감사합니다!!
https://unity.com/kr/how-to
-> "- 상태 프로그래밍 패턴으로 모듈식의 유연한 코드베이스를 개발하세요."
https://assetstore.unity.com/packages/essentials/tutorial-projects/level-up-your-code-with-design-patterns-and-solid-289616
이거
참고하셈
감사합니다 읽어보겠습니다!!!