유니티 에디터는 하이어랄키 구조를 갖고 있고,
게임 테스트를 해 보면 이 하이어랄키에 게임 노드가 리얼타임으로 추가, 삭제되는게 보이죠.

이게 시각적으로 반영되니까 너무 좋더군요.
생각해보니까, 지금 씬에 어떤 노드들이 붙어있고 어떤 차일드를 갖고 있나,
이걸 확인하면 되는거거든요.
cocos2d-x에서도 못할게 없겠다 싶었습니다.
해서 간단히 만들어 본 노드 하이어랄키 구하기.
- string GetHierarchy(Node* root)
- {
- string ret;
- for (const auto node : root->getChildren())
- {
- string name = node->getName();
- if (name == "")
- name = "(no name)";
- ret += name;
- if (node->getChildrenCount() > 0)
- ret += "\n" + GetTreeHierarchy(node, 1);
- else
- ret += "\n";
- }
- return ret;
- }
- string GetTreeHierarchy(Node* tree, int depth)
- {
- string ret;
- string tabs;
- for (int i = 0; i < depth; i++)
- tabs += " ";
- for (const auto node : tree->getChildren())
- {
- string name = node->getName();
- if (name == "")
- name = "(no name)";
- ret += tabs + name;
- if (node->getChildrenCount() > 0)
- ret += "\n" + GetTreeHierarchy(node, depth + 1);
- else
- ret += "\n";
- }
- return ret;
- }
GetHierarchy를 호출하면서 루트 노드를 매개변수로 주면 해당 노드와 자식 노드에 연결된 노드 목록을 문자열로 돌려줍니다.
매개변수를 Director::getInstance()->getRunningScene()로 주면, 현재 씬에 표시중인 모든 노드의 하이어랄키를 얻을 수 있습니다.
(노드에 이름을 지정하지 않으면 (no name) 으로 표시됩니다)
이 함수는 단순히 문자열(string)을 구할 뿐이니까,
시각적으로 나타내려면 Label 등을 사용해서 화면에 뿌려줄 필요가 있습니다.
예를 들면 아래와 같은 식이 되겠지요,
- auto hier = Label::createWithTTF("", "fonts/arial.ttf", 20);
- hier->setAnchorPoint(Vec2(0, 1));
- hier->setPosition(10, visibleSize.height - 10);
- hier->setName("HIERARCHY");
- addChild(hier, 100);
- schedule([=](float dt)
- {
- string hierarchy = GetHierarchy(Director::getInstance()->getRunningScene());
- hier->setString(hierarchy);
- }, "HIERARCHY");
만들고 있는 게임의 타이틀 화면을 통해서 테스트 해 봤습니다.
이미 표시되어 있는 것들의 하이어랄키 구조는 물론,
운석 스프라이트를 임의로 출력해서 생성, 소멸되는 것을 볼 수 있습니다.

새벽에 갑자기 생각나서 만들어 본거니 뭔가 더 개선의 여지가 있을지도요..?
비활성화 상태의 노드를 구별해 준다거나..
at 2022/04/18 03:56
덧글