묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
사소한 질문이 있습니다
큰 문제는 아니고 영어로 하면 되긴하는데코드를 그대로 사용하니 게임씬에 뜨는 플레이어 스탯이 한글이면 깨지는 문제가 있습니다.따로 저장되있는 폰트가 있나요?
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
Multi Layered State Machine 강의에 대한 질문입니다.
public void Setup(EntityType owner) { stateMachine.Setup(owner); AddStates(); MakeTransitions(); stateMachine.SetupLayers(); stateMachine.onStateChanged += (_, newState, prevState, layer) => onStateChanged?.Invoke(stateMachine, newState, prevState, layer); } MonoStateMachine 스크립트의 해당 부분에서 MonoStateMachine의 onStateChanged 이벤트에 아무것도 등록이 되어있지 않은데 혹시 추후 강의에서 해당 부분 추가 되는 건가요?코드 파악 중 제가 잘못 이해한건지에 대해 궁금하여 질문합니다.
-
미해결제미니의 개발실무 - 지속 성장 가능한 소프트웨어를 만들어가는 방법
Business Layer 인자 처리
강의 정말 잘 들었습니다! 비즈니스 로직에 대한 관점이 보다 명확해진 것 같아요. 한 가지 궁금한 점이 있습니다. "리팩터링 후의 메서드를 보면 입력받는 인자 targetStore 도 달라진 걸 볼 수 있죠" 와 같은 말씀을 해주셨는데여기서 새롭게 나오게된 개념인 targetStore, usePoint 인자들에 대한 처리가 리팩토링 전과 후 layer들 사이에서 어떻게 바뀌게 되는지 조금 더 자세한 내용이 궁금합니다! 리팩토링 전리팩토링 후 businessPay()메서드에서 pay 라는 비즈니스 로직을 처리하기 위해 요청에 대한 정보를 리팩터링 하기 전의 코드에서는 payRequest 로 presentation layer 에서 전달받고 있는 것 같아요. (저도 이렇게 하고 있었습니다)리팩터링 후의 코드에서는 targetStore, usePoint를 인자로 입력받고 있는걸 볼 수 있었어요. 여기서, 새롭게 나오게된 targetStore, usePoint 객체들을클라이언트로부터 전달되는 presentation layer 에서 바로 전달받는 것을 기대하셨는지아니면 리팩토링 전과 같이 payRequest 로 controller에서 전달 받은 뒤 다른 layer (business 혹은 presentation) 에서 dto 로 변경한 뒤 businessPay() 메서드를 호출하여 인자를 입력해주는 것을 기대하셨는지아니면 다른 방법으로 진행이 되는지 가 궁금합니다!
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
instantiate에 대해서 질문입니다.
제가 알기로는 유니티에서 제공하는 instantiate() 함수는 필드 값도 함께 복사되는 걸로 알고 있었습니다. 그런데 Effect의 Clone() 함수도 Instantiate()를 사용하지만 이 경우에는 필드 값이 같이 복사가 되지 않아서 이유가 궁금해서 질문 드립니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
SkillSystemWindow 스크립트 drawDatabase함수에서 null참조발생
강의자료에 있는 스크립트를 그대로 올려도 오류가 발생합니다.GUI Error: Invalid GUILayout state in SkillSystemWindow view. Verify that all layout Begin/End calls matchUnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)-> DrawDatabase(databaseTypes[toolbarIndex]);부분NullReferenceException: Object reference not set to an instance of an object ->drawdatabase함수의 dataType.BaseType.GetField ~~~ 부분)
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
2강 Database에 리플렉션에 대해 질문입니다.
2강에서 SetID 메소드에서 id필드의 값을 설정하는 부분을 리플렉션을 통해서 구현한 것은 private의 필드의 은닉성을 지키기 위해서의 이유 하나 뿐인가요?
-
해결됨제미니의 개발실무 - 지속 성장 가능한 소프트웨어를 만들어가는 방법
모듈에 대한 단방향 의존
안녕하세요. 제미니님 이번에도 좋은 강의를 제공해주셔서 감사합니다.모듈 분리에서 궁금한 내용이 있는데요. 제미니님이 제공해주신 PaymentAPI 와 DB 모듈을 별도로 했다고 했을 때 API 규격에 맞게 DB 모듈이 구현이 되어야 한다고 생각하고 있습니다. 즉, 해당 PaymentAPI 에서 제공하는 DB 접근에 대한 인터페이스를 DB 모듈이 구현하는 의존성 역전 원칙을 적용한 상황입니다.하지만, 이 상황에서 단방향 모듈 참조를 하게 된다면 DB 모듈은 PaymentAPI 가 제공하는 인터페이스의 유무를 알 수가 없게 되는데요. 저는 위 문제에 대한 해결방법으로 두 가지가 떠오릅니다.모듈 분리 시 API 모듈에 인터페이스를 만들고 DB 모듈 교체에 따른 새로운 구현체를 구현한다.(모듈 교체에 따라 이전 모듈에 대한 클래스 참조가 사라져 컴파일에러가 발생하게 되고 주석처리가 필요하다) 모듈 교체 시 이전 모듈에서 사용했던 인터페이스를 하위 모듈에서 똑같이 생성해주고 동일한 인터페이스를 참조하도록 하여 상위 모듈에는 변화를 주지 않는다. (변화가 최소화되지만 인터페이스가 많을 수록 구현도가 올라간다. 인터페이스를 동일하게 만들거라는 보장이 되어야 한다.)1번 코드paymentAPI { // implementation 'project:paymentDB' // implementation 'project:paymentDB2' interface CommandPort { fun save(command: PaymentCommand) } class PaymentDBImplV1 : CommandPort { override fun save(command: PaymentCommand) { paymentDB.saveV1(command); // paymentDB2 모듈 사용 시 주석 처리 } } class PaymentDBImplV2 : CommandPort { override fun save(command: PaymentCommand) { paymentDB2.saveV2(command); // paymentDB1 모듈 사용 시 주석 처리 } } } paymentDB { implementation 'A.DB' } paymentDB2 { implementation 'B.DB' }2번 코드paymentAPI { // implementation 'project:paymentDB' // implementation 'project:paymentDB2' class PaymentAPILogic(val paymentDB: CommandPort){ fun save(command: PaymentCommand) { paymentDB.save(command); // paymentDB2 모듈 사용 시 주석 처리 } } } paymentDB { implementation 'A.DB' interface CommandPort { fun save(command: PaymentCommand) } class PaymentCommandImpl : CommandPort { override fun save(command: PaymentCommand) { DB.save(command); } } } paymentDB2 { implementation 'B.DB' interface CommandPort { fun save(command: PaymentCommand) } class PaymentCommandImpl : CommandPort { override fun save(command: PaymentCommand) { DB.save(command); } } }간단하게 코드를 작성하면 위와 같은 형태가 될 것 같습니다.제미니님은 어떠한 방향으로 설계를 하시는지 혹은 제 질문에서 제가 잘 못 이해한 부분이 있어 이러한 방법으로 사고가 흘러가는지 말씀을 들어보고 싶습니다.마지막으로 유튜브 및 인프런에서 귀한 지식과 귀한 시간을 제공해주셔서 항상 감사합니다!
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스탯 관련 질문입니다.
강의를 보면 스킬 시스템 에디터에서 추가할 스탯을 직접 하나씩 추가해서 해당 스탯을 원하는 엔티티에 부여하는 방식인 것 같은데요.강의에서는 모두 같은 스탯을 사용해 Hp를 하나로 공유했지만, 보통 게임들에서는 적들마다 스탯이 다 다르잖아요??어떤 적은 MaxHp가 높고 이동속도가 느린 대신, 어떤 적은 MaxHp가 낮고 이동속도가 빠르다던가 하는 식으로요.그러면 이 스킬시스템의 스탯을 사용하려면 Hp, 이동속도 등등 여러 스탯들을 적들마다 다 만들어야 하는건데 그러면 데이터끼리 비교하려면 스탯을 하나하나 클릭해보며 확인해야하니까 비교하기가 힘들어 레벨 디자인하기가 쉽지 않겠다는 생각이 들어서요.그러면 굳이 스탯까지 스크립터블오브젝트로 만들어서 모듈식으로 만들 필요성이 있는지 잘 모르겠어서 질문드려요.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
1번 강의 IdentifiedObjectEditor 스크립트에서 에러가 납니다.
NullReferenceException: SerializedObject of SerializedProperty has been Disposed.UnityEditor.SerializedProperty.get_propertyType () (at <04e0fdd0fac34142a67859e48fe87770>:0)UnityEditor.EditorGUILayout.IsChildrenIncluded (UnityEditor.SerializedProperty prop) (at <04e0fdd0fac34142a67859e48fe87770>:0)UnityEditor.EditorGUILayout.PropertyField (UnityEditor.SerializedProperty property, UnityEngine.GUILayoutOption[] options) (at <04e0fdd0fac34142a67859e48fe87770>:0)IdentifiedObjectEditor.OnInspectorGUI () (at Assets/Scripts/Editor/IdentifiedObjectEditor.cs:99)UnityEditor.UIElements.InspectorElement+<>c__DisplayClass74_0.<CreateInspectorElementUsingIMGUI>b__0 () (at <04e0fdd0fac34142a67859e48fe87770>:0) 이런 에러인데 에러가 나는 시점이 인스펙터에서 코드네임을 변경한 후 엔터키를 눌렀을 때 발생합니다.EditorGUILayout.PropertyField(displayNameProperty);이름 변경 후 displayName을 그려줄 때 에러가 나는데 아무래도 OnEable 함수에서 FindProperty함수로 값을 제대로 가져오지 못하고 있는 것 같은데 어떻게 해야할까요? [SerializeField] private Category[] categories; [SerializeField] private Sprite icon; [SerializeField] private int id = -1; [SerializeField] private string codeName; [SerializeField] private string displayName; [SerializeField] private string description; categoriesProperty = serializedObject.FindProperty("categories"); iconProperty = serializedObject.FindProperty("icon"); idProperty = serializedObject.FindProperty("id"); codeNameProperty = serializedObject.FindProperty("codeName"); displayNameProperty = serializedObject.FindProperty("displayName"); descriptionProperty = serializedObject.FindProperty("description");혹시 제가 직접 타이핑한게 문제일까 싶어서 코드를 다운로드 받고 복붙해봤는데도 에러가 발생합니다.이 현상을 그대로 두고 진행해도 될까요?이름 변경은 제대로 됩니다.
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
section1 7-stat 강좌에서 delegate를 사용하신 이유가 궁금합니다.
public delegate void ValueChangedHandler(Stat stat, float currentValue, float prevValue); public event ValueChangedHandler onValueChanged;public event Action<Stat, float, float> onValueChanged; 위와 같이 delegate를 사용하셨는데, 아래 action 대신 사용하면 어떤 차이가 있는지, 또는 특별한 이유가 있는지 궁금합니다.