Unity 최종 프로젝트 - 28 (Behavior Tree Editor 제작-6)

이준호·2024년 2월 19일
0
post-thumbnail
post-custom-banner

📌 Unity 최종 프로젝트



📌 Behavior Tree Graph View Editor 제작

➔ Editor SplitView - DataContext

  • 행동 트리의 노드들이 런타임 중에 공통으로 사용하는 변수에 대한 컨테이너

  • BehaviorTreeEditor.uxml UI Builder 수정 (DataContextView 추가)

    • SplitView -> #left-panel 에 VisualElement 추가. => VisualElement Name -> #inspector-container
    • InspectorView, Label은 #inspector-container 자식으로 이동
    • #left-panel 자식으로 SplitView 추가.
    • SplitView -> VisualElement 추가 => #dataContext-container 이름 변경.
    • SplitView Orientation => Vertical 변경, Fixed Pane Initial Dimension => 180 변경
    • #dataContext-container -> Label 추가 -> Label DataContext 이름 변경 -> Label BackGroundColor 변경, IMGUIContainer 추가
  • 런타임 종료시
    “SerializedObject target has been destroyed.
    UnityEngine.StackTraceUtility:ExtractStackTrace ()”
    오류 발생.

    • dataContextView.onGUIHandler 람다식 내부에 유효성 검사로 오류 해결. (_treeObject의 타겟이 유효한지 확인.)
      • if (_treeObejct == null || _treeObejct.targetObject == null)
        • SerializedObject를 사용하기 전에 타겟 오브젝트가 존재하지 않으면 람다함수 내의 코드 실행을 바로 리턴






### AddCode



BehaviorTreeEditor.cs

    private IMGUIContainer _dataContextView;
    
    // 렌더링 하기 위해 직렬화 가능한 객체 속성
    private SerializedObject _treeObject;
    private SerializedProperty _dataContextProperty;
    
        _dataContextView = root.Q<IMGUIContainer>();
        _dataContextView.onGUIHandler = () => // 이 컨테이너 내에서, 'treeObject' 와 'dataContextProperty' 를 사용하여 블랙보드의 프로퍼티를 인스펙터에서 편집할 수 있게 한다.
        {
            if (_treeObject == null || _treeObject.targetObject == null)
                return;
            
            _treeObject.Update();
            EditorGUILayout.PropertyField(_dataContextProperty); // 코드에 변경사항이 있을 수 있으므로, UI를 렌더링하기 전에 이를 반영한한다.
            _treeObject.ApplyModifiedProperties(); // 수정된 속성을 적용하여 UI에서 변경한 내용을 직렬화된 객체에 다시 적용.
        };
        
        // 트리를 선택하여 항목이 변경될 때마다 초기화 하므로 새로운 직렬화 객체 할당.
        if (tree != null)
        {
            _treeObject = new SerializedObject(tree);
            _dataContextProperty = _treeObject.FindProperty("dataContext");
        }



DataContext.cs

[System.Serializable]
public class DataContext
{
    public Vector3 moveToPosition;
    public GameObject moveToObject;
}



BehaviorTreeRunner.cs

    void Start()
    {
        tree = tree.Clone();
        tree.Bind(GetComponent<NavMeshAgent>());
    }



BehaviorTree.cs

public DataContext dataContext = new DataContext();

    // 모든 노드에 정보를 바인딩
    public void Bind(NavMeshAgent agent)
    {
        Traverse(rootNode, node =>
        {
            node.agent = agent;
            node.dataContext = dataContext;
        });
    }











📌 출저

TheKiwiCoder

profile
No Easy Day
post-custom-banner

0개의 댓글