인프런 커뮤니티 질문&답변

고우진님의 프로필 이미지
고우진

작성한 질문수

[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템

Skill (4) - Skill

커스텀 에디터에 관하여 질문이 있습니다.

작성

·

22

0

Quest의 커스텀 에디터를 작성하였는데

Quest가 가진 TaskGroups의 TaskGroup의 변수를 수정하였는데 수정이 안되는데 커스텀 에디터의 하위 요소에도 부가적인 작업을 해야 수정이 되는건가요?

image.png


protected SerializedProperty taskGroupsProperty;

protected SerializedProperty rewardsProperty;

protected SerializedProperty useAutoCompleteProperty;

protected SerializedProperty isCancelableProperty;

protected SerializedProperty isSaveavleProperty;

protected SerializedProperty acceptConditonsProperty;

protected SerializedProperty cancelConditionProperty;

protected override void OnEnable()

{

base.OnEnable();

taskGroupsProperty = serializedObject.FindProperty("taskGroups");

rewardsProperty = serializedObject.FindProperty("rewards");

useAutoCompleteProperty = serializedObject.FindProperty("useAutoComplete");

isCancelableProperty = serializedObject.FindProperty("isCancelable");

isSaveavleProperty = serializedObject.FindProperty("isSaveable");

acceptConditonsProperty = serializedObject.FindProperty("acceptionConditions");

cancelConditionProperty = serializedObject.FindProperty("cancelConditions");

}

public override void OnInspectorGUI()

{

base.OnInspectorGUI();

serializedObject.Update();

if (DrawFoldoutTitle("Task"))

EditorGUILayout.PropertyField(taskGroupsProperty);

if (DrawFoldoutTitle("Rewards"))

EditorGUILayout.PropertyField(rewardsProperty);

if (DrawFoldoutTitle("Option"))

EditorGUILayout.PropertyField(useAutoCompleteProperty);

EditorGUILayout.PropertyField(isCancelableProperty);

EditorGUILayout.PropertyField (isSaveavleProperty);

if (DrawFoldoutTitle("Condition"))

EditorGUILayout.PropertyField(acceptConditonsProperty);

EditorGUILayout.PropertyField(cancelConditionProperty);

serializedObject.ApplyModifiedProperties();

}

이런식으로 작성을 하였는데

image.png

다른 enum으로 수정을 하여도 기본값인 Null이 출력됩니다.

답변 2

0

Developer G님의 프로필 이미지
Developer G
지식공유자

수강해주셔서 감사합니다.

따로 작업해주실건 없구요, 게임 플레이시에 enum 값이 안바뀐다는 얘기시면 Quest의 Clone 함수에서 new TaskGroup을 만들 때 enum 값도 복사하시는지 확인해보셔야할 것 같습니다.

public Quest Clone()

{

var clone = Instantiate(this);

clone.taskGroups = taskGroups.Select(x => new TaskGroup(x)).ToArray();

return clone;

}

감사합니다.

고우진님의 프로필 이미지
고우진
질문자

답변해주셔서 감사합니다 클로닝을 하는것을 깜빡하고 있었네요

고우진님의 프로필 이미지
고우진
질문자

public TaskGroup(TaskGroup copyTarget)

{

tasks = copyTarget.Tasks.Select(x => Object.Instantiate(x)).ToArray();

completion = copyTarget.completion;

}
Quest에서 Taskgroup을 복사할때 Taskgruop에서의 함수를 수정해야했네요
도와주셔서감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

커스텀 에디터에서 특정 데이터가 제대로 수정되지 않는 문제가 발생할 때, 이는 대개 SerializedProperty의 사용 방법과 관련이 있습니다. SerializedProperty는 Unity 에디터에서 객체의 필드를 시리얼라이즈하고 반영하는데 사용됩니다. 문제 해결에 도움이 될 수 있는 몇 가지 팁을 드리겠습니다.

  1. SerializedObject와 SerializedProperty 관계 확인: OnEnable()에서 SerializedPropertyserializedObject.FindProperty로 초기화할 때 대상 객체의 경로가 올바른지 확인해야 합니다. 예를 들어, taskGroups라는 변수가 실제로 Quest 클래스 내에 존재하는지, 그리고 그 이름이 정확히 일치하는지 확인하세요.

  2. PropertyField 적용 방법: PropertyField는 배열이나 리스트의 경우 별도로 하위 항목을 개별적으로 그려주어야 할 수 있습니다. EditorGUILayout.PropertyField(property, true)와 같이 두 번째 파라미터를 true로 설정하면 하위 항목도 자동으로 드로잉할 수 있습니다.

  3. SerializedObject 업데이트 및 적용: serializedObject.Update()는 현재의 변경 내용을 SerializedObject에 반영하기 전에 호출하고, serializedObject.ApplyModifiedProperties()는 모든 변경을 저장한 후 호출해야 합니다. 이 순서가 맞아야 반영됩니다.

  4. Enum 문제 해결:

    • Enum 변경 사항이 저장되지 않는 문제는 SerializedProperty가 제대로 값을 저장하지 못하는 경우 발생할 수 있습니다. 이럴 때는 EditorGUILayout.EnumPopup을 활용하여 직접 Enum 값을 선택할 수 있도록 구현해보세요.
    • 예를 들어:
      
      EditorGUILayout.PropertyField(enumProperty, new GUIContent("Enum Property"));
      

조금 더 상세한 확인이 필요하다면, 이 링크에서 유사한 문제를 다룬 게시물이 있으니 참고해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

고우진님의 프로필 이미지
고우진

작성한 질문수

질문하기