Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
간단한 플러그인 만들기
소개
3D 기즈모 플러그인은 편집기와 사용자 정의 플러그인에서 모든 종류의 Node3D 노드에 연결된 기즈모를 정의하는 데 사용됩니다.
이 튜토리얼에서는 사용자 정의 기즈모를 정의하는 두 가지 주요 접근 방식을 보여줍니다. 첫 번째 옵션은 단순한 기즈모에 적합하고 플러그인 구조를 덜 복잡하게 만들고, 두 번째 옵션을 사용하면 기즈모별 데이터를 저장할 수 있습니다.
참고
이 튜토리얼에서는 여러분이 일반 플러그인을 만드는 방법을 이미 알고 있다고 가정합니다. 의심스러운 경우 플러그인 만들기 페이지를 참조하세요.
EditorNode3DGizmo플러그인
선택한 접근 방식에 관계없이 새로운 :ref:`EditorNode3DGizmoPlugin <class_EditorNode3DGizmoPlugin>`을 생성해야 합니다. 이를 통해 새 기즈모 유형의 이름을 설정하고 기즈모를 숨길 수 있는지 여부와 같은 다른 동작을 정의할 수 있습니다.
이것은 기본 설정입니다.
# my_custom_gizmo_plugin.gd
extends EditorNode3DGizmoPlugin
func _get_gizmo_name():
return "CustomNode"
# MyCustomEditorPlugin.gd
@tool
extends EditorPlugin
const MyCustomGizmoPlugin = preload("res://addons/my-addon/my_custom_gizmo_plugin.gd")
var gizmo_plugin = MyCustomGizmoPlugin.new()
func _enter_tree():
add_node_3d_gizmo_plugin(gizmo_plugin)
func _exit_tree():
remove_node_3d_gizmo_plugin(gizmo_plugin)
간단한 기즈모의 경우 :ref:`EditorNode3DGizmoPlugin <class_EditorNode3DGizmoPlugin>`을 상속하는 것으로 충분합니다. 기즈모별 데이터를 저장하려면 두 번째 접근 방식을 사용해야 합니다.
간단한 접근 방식
첫 번째 단계는 사용자 정의 기즈모 플러그인에서 _has_gizmo() 메서드를 재정의하여 노드 매개변수가 대상 유형일 때 ``true``를 반환하는 것입니다.
# ...
func _has_gizmo(node):
return node is MyCustomNode3D
# ...
그런 다음 :ref:`_redraw()<class_EditorNode3DGizmoPlugin_private_method__redraw>`와 같은 메서드나 모든 핸들 관련 메서드를 재정의할 수 있습니다.
# ...
func _init():
create_material("main", Color(1, 0, 0))
create_handle_material("handles")
func _redraw(gizmo):
gizmo.clear()
var node3d = gizmo.get_node_3d()
var lines = PackedVector3Array()
lines.push_back(Vector3(0, 1, 0))
lines.push_back(Vector3(0, node3d.my_custom_value, 0))
var handles = PackedVector3Array()
handles.push_back(Vector3(0, 1, 0))
handles.push_back(Vector3(0, node3d.my_custom_value, 0))
gizmo.add_lines(lines, get_material("main", gizmo), false)
gizmo.add_handles(handles, get_material("handles", gizmo), [])
# ...
_init 방법으로 재료를 생성하고 get_material()<class_EditorNode3DGizmoPlugin_method_get_material>`를 사용하여 `_redraw 방법으로 검색했습니다. 이 방법은 기즈모의 상태(선택 및/또는 편집 가능)에 따라 재질의 변형 중 하나를 검색합니다.
당신의 최종 씬은 이렇게 보여야 할 것입니다.
extends EditorNode3DGizmoPlugin
const MyCustomNode3D = preload("res://addons/my-addon/my_custom_node_3d.gd")
func _init():
create_material("main", Color(1,0,0))
create_handle_material("handles")
func _has_gizmo(node):
return node is MyCustomNode3D
func _redraw(gizmo):
gizmo.clear()
var node3d = gizmo.get_node_3d()
var lines = PackedVector3Array()
lines.push_back(Vector3(0, 1, 0))
lines.push_back(Vector3(0, node3d.my_custom_value, 0))
var handles = PackedVector3Array()
handles.push_back(Vector3(0, 1, 0))
handles.push_back(Vector3(0, node3d.my_custom_value, 0))
gizmo.add_lines(lines, get_material("main", gizmo), false)
gizmo.add_handles(handles, get_material("handles", gizmo), [])
# You should implement the rest of handle-related callbacks
# (_get_handle_name(), _get_handle_value(), _commit_handle(), ...).
방금 _redraw 메서드에 일부 핸들을 추가했지만 올바르게 작동하는 핸들을 얻으려면 :ref:`EditorNode3DGizmoPlugin <class_EditorNode3DGizmoPlugin>`에서 나머지 핸들 관련 콜백을 구현해야 합니다.
대체 접근법
경우에 따라 우리는 :ref:`EditorNode3DGizmo<class_EditorNode3DGizmo>`의 자체 구현을 제공하려고 합니다. 아마도 각 기즈모에 일부 상태를 저장하고 싶거나 오래된 기즈모 플러그인을 이식하고 재작성 프로세스를 거치고 싶지 않기 때문일 수 있습니다.
이러한 경우 우리가 해야 할 일은 새로운 기즈모 플러그인에서 :ref:`_create_gizmo()<class_EditorNode3DGizmoPlugin_private_method__create_gizmo>`를 재정의하여 우리가 대상으로 삼고 싶은 Node3D 노드에 대한 사용자 정의 기즈모 구현을 반환하는 것입니다.
# my_custom_gizmo_plugin.gd
extends EditorNode3DGizmoPlugin
const MyCustomNode3D = preload("res://addons/my-addon/my_custom_node_3d.gd")
const MyCustomGizmo = preload("res://addons/my-addon/my_custom_gizmo.gd")
func _init():
create_material("main", Color(1, 0, 0))
create_handle_material("handles")
func _create_gizmo(node):
if node is MyCustomNode3D:
return MyCustomGizmo.new()
else:
return null
이 방법으로 모든 기즈모 로직과 드로잉 메서드를 다음과 같이 :ref:`EditorNode3DGizmo<class_EditorNode3DGizmo>`를 확장하는 새 클래스에서 구현할 수 있습니다.
# my_custom_gizmo.gd
extends EditorNode3DGizmo
# You can store data in the gizmo itself (more useful when working with handles).
var gizmo_size = 3.0
func _redraw():
clear()
var node3d = get_node_3d()
var lines = PackedVector3Array()
lines.push_back(Vector3(0, 1, 0))
lines.push_back(Vector3(gizmo_size, node3d.my_custom_value, 0))
var handles = PackedVector3Array()
handles.push_back(Vector3(0, 1, 0))
handles.push_back(Vector3(gizmo_size, node3d.my_custom_value, 0))
var material = get_plugin().get_material("main", self)
add_lines(lines, material, false)
var handles_material = get_plugin().get_material("handles", self)
add_handles(handles, handles_material, [])
# You should implement the rest of handle-related callbacks
# (_get_handle_name(), _get_handle_value(), _commit_handle(), ...).
방금 _redraw 메서드에 일부 핸들을 추가했지만 제대로 작동하는 핸들을 얻으려면 여전히 :ref:`EditorNode3DGizmo<class_EditorNode3DGizmo>`에 핸들 관련 콜백의 나머지 부분을 구현해야 합니다.