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...
GraphEdit
繼承: Control < CanvasItem < Node < Object
圖結構編輯器,使用 GraphNode。
說明
GraphEdit 提供了用於對各種圖進行建立、操作、顯示的工具。它在引擎中的主要目的是驅動視覺化編程系統,例如視覺化著色器,但也可以在使用者專案中使用。
GraphEdit 本身只是一個空容器,表示一個可以放置 GraphNode 的無限柵格。每個 GraphNode 代表圖中的一個節點,是連接方案中的單個資料單元。而 GraphEdit 則有助於控制節點和節點之間的各種互動。當使用者嘗試連接、斷開或刪除一個 GraphNode 時,GraphEdit 中會發出對應的訊號,但預設情況下不執行任何動作。使用此控制項的程式設計師負責實作必要的邏輯,來確定應如何處理每個請求。
效能:強烈建議在使用 GraphEdit 時啟用低處理器使用模式(見 OS.low_processor_usage_mode)。
注意:請注意,由於技術限制,Node.get_children() 還將回傳名為 _connection_layer 的連接層節點。該行為可能會在未來版本中發生變化。
屬性
clip_contents |
|
|
|
||
|
||
|
||
|
||
focus_mode |
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
方法
_get_connection_line(from_position: Vector2, to_position: Vector2) virtual const |
|
_is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual |
|
_is_in_output_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual |
|
_is_node_hover_valid(from_node: StringName, from_port: int, to_node: StringName, to_port: int) virtual |
|
void |
add_valid_connection_type(from_type: int, to_type: int) |
void |
|
void |
|
void |
|
void |
attach_graph_element_to_frame(element: StringName, frame: StringName) |
void |
|
connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false) |
|
void |
detach_graph_element_from_frame(element: StringName) |
void |
disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int) |
void |
|
get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const |
|
get_connection_count(from_node: StringName, from_port: int) |
|
get_connection_line(from_node: Vector2, to_node: Vector2) const |
|
get_connection_list_from_node(node: StringName) const |
|
get_connections_intersecting_with_rect(rect: Rect2) const |
|
get_element_frame(element: StringName) |
|
is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) |
|
is_valid_connection_type(from_type: int, to_type: int) const |
|
void |
remove_valid_connection_type(from_type: int, to_type: int) |
void |
|
void |
|
void |
set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float) |
void |
set_selected(node: Node) |
主題屬性
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
訊號
begin_node_move() 🔗
在 GraphElement 移動開始時發出。
connection_drag_ended() 🔗
在連接拖動結束時發出。
connection_drag_started(from_node: StringName, from_port: int, is_output: bool) 🔗
在連接拖動開始時發出。
connection_from_empty(to_node: StringName, to_port: int, release_position: Vector2) 🔗
當使用者將連接從輸入埠拖動到圖形的空白區域時發出。
connection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
當嘗試建立 from_node GraphNode 的 from_port 和 to_node GraphNode 的 to_port 之間的連接時發出。
connection_to_empty(from_node: StringName, from_port: int, release_position: Vector2) 🔗
當使用者將連接從輸出埠拖動到圖形的空白區域時發出。
copy_nodes_request() 🔗
當該 GraphEdit 捕獲 ui_copy 動作(預設情況下為 Ctrl + C)時發出。一般來說,該訊號指示所選的 GraphElement 應被複製。
cut_nodes_request() 🔗
當該 GraphEdit 捕獲 ui_cut 動作(預設情況下為 Ctrl + X)時發出。一般來說,該訊號指示所選的 GraphElement 應被剪切。
delete_nodes_request(nodes: Array[StringName]) 🔗
當該 GraphEdit 捕獲 ui_graph_delete 動作(預設為 Delete)時觸發。
nodes 是應被移除的節點的名稱的陣列。這些通常包括所有選定的節點。
disconnection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
當試圖移除 from_node GraphNode 的 from_port 和 to_node GraphNode 的 to_port 之間的連接時發出。
duplicate_nodes_request() 🔗
當該 GraphEdit 捕獲 ui_graph_duplicate 動作(預設為 Ctrl + D)時觸發。一般來說,該訊號指示應被複製的所選的 GraphElement。
end_node_move() 🔗
在 GraphElement 移動結束時發出。
frame_rect_changed(frame: GraphFrame, new_rect: Rect2) 🔗
當 GraphFrame frame 大小調整為 new_rect 時發出。
graph_elements_linked_to_frame_request(elements: Array, frame: StringName) 🔗
當一個或多個 GraphElement 被放到名為 frame 的 GraphFrame 上,且它們之前未被附加到任何其他框中時發出。
elements 是要附加的 GraphElement 陣列。
當給定的 GraphElement 節點被取消選擇時發出。
當給定的 GraphElement 節點被選中時發出。
paste_nodes_request() 🔗
當該 GraphEdit 捕獲 ui_paste 動作(預設為 Ctrl + V)時觸發。一般來說,該訊號指示應被貼上的先前複製的 GraphElement。
popup_request(at_position: Vector2) 🔗
當請求彈出視窗時發出。在 GraphEdit 中右鍵點選時發生。at_position為該訊號被發出時滑鼠指針的位置。
scroll_offset_changed(offset: Vector2) 🔗
當使用者改變捲動偏移量時發出。在程式碼中改變捲動偏移量時,它不會被觸發。
列舉
enum PanningScheme: 🔗
PanningScheme SCROLL_ZOOMS = 0
滑鼠滾輪進行縮放,Ctrl + 滑鼠滾輪進行視圖的移動。
PanningScheme SCROLL_PANS = 1
滑鼠滾輪進行視圖的移動,Ctrl + 滑鼠滾輪進行縮放。
enum GridPattern: 🔗
GridPattern GRID_PATTERN_LINES = 0
使用實線繪製網格。
GridPattern GRID_PATTERN_DOTS = 1
使用點線繪製網格。
屬性說明
bool connection_lines_antialiased = true 🔗
如果為 true,節點之間的線將使用反鋸齒。
float connection_lines_curvature = 0.5 🔗
節點之間連線的曲率。0 得到的是直線。
float connection_lines_thickness = 4.0 🔗
節點之間連線的粗細。
Array[Dictionary] connections = [] 🔗
void set_connections(value: Array[Dictionary])
Array[Dictionary] get_connection_list()
GraphNode 之間的連接。
連接由 Dictionary 代表,形式為:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
重繪時,如果 keep_alive 為 false 的連接無效,則可能會被自動刪除。
GridPattern grid_pattern = 0 🔗
void set_grid_pattern(value: GridPattern)
GridPattern get_grid_pattern()
繪製網格時使用的圖案。
如果為 true,小圖是可見的。
float minimap_opacity = 0.65 🔗
小圖矩形的不透明度。
Vector2 minimap_size = Vector2(240, 160) 🔗
小圖矩形的大小。地圖自身基於網格區域的大小,並被縮放以適應這個矩形。
PanningScheme panning_scheme = 0 🔗
void set_panning_scheme(value: PanningScheme)
PanningScheme get_panning_scheme()
定義使用滑鼠滾輪平移的控制方案。
bool right_disconnects = false 🔗
如果為 true,通過拖動右端,可以斷開 GraphEdit 中現有的連接。
Vector2 scroll_offset = Vector2(0, 0) 🔗
捲動偏移量。
bool show_arrange_button = true 🔗
如果為 true,控制項將自動調整高度以適合其內容。
如果為 true,則該視窗可見。
bool show_grid_buttons = true 🔗
如果為 true,則停用形狀所有者及其形狀。
如果為 true,小圖是可見的。
bool show_minimap_button = true 🔗
如果為 true,小圖是可見的。
bool show_zoom_buttons = true 🔗
如果為 true,則色板和近期顏色預設可見。
bool show_zoom_label = false 🔗
如果為 true,則使目前縮放級別的標籤可見。縮放值以百分比顯示。
吸附距離,單位為圖元。
bool snapping_enabled = true 🔗
如果為 true,啟用自動吸附。
Dictionary type_names = {} 🔗
void set_type_names(value: Dictionary)
Dictionary get_type_names()
包含人類可讀連接埠型別名稱的 Dictionary。
目前縮放值。
縮放上限。
縮放下限。
每個縮放級別的步長。
方法說明
PackedVector2Array _get_connection_line(from_position: Vector2, to_position: Vector2) virtual const 🔗
可以重寫的虛方法,以自訂如何繪製連接。
bool _is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual 🔗
回傳 mouse_position 是否在輸入熱區。
預設情況下,熱區是一個 Rect2,其中心位於 in_node.GraphNode.get_input_port_position()(in_port)(對於輸出的情況,請改為呼叫 GraphNode.get_output_port_position())。熱區的寬度是主題屬性 port_grab_distance_horizontal 的兩倍,高度是 port_grab_distance_vertical 的兩倍。
下面是一個範例程式碼,以協助入門:
func _is_in_input_hotzone(in_node, in_port, mouse_position):
var port_size = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical"))
var port_pos = in_node.get_position() + in_node.get_input_port_position(in_port) - port_size / 2
var rect = Rect2(port_pos, port_size)
return rect.has_point(mouse_position)
bool _is_in_output_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual 🔗
回傳 mouse_position 是否在輸出熱區。有關熱區的更多資訊,請參閱 _is_in_input_hotzone()。
下面是一個範例程式碼,以協助入門:
func _is_in_output_hotzone(in_node, in_port, mouse_position):
var port_size = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical"))
var port_pos = in_node.get_position() + in_node.get_output_port_position(in_port) - port_size / 2
var rect = Rect2(port_pos, port_size)
return rect.has_point(mouse_position)
bool _is_node_hover_valid(from_node: StringName, from_port: int, to_node: StringName, to_port: int) virtual 🔗
當使用者在有效埠上拖動連接時,該虛擬方法可用於插入額外的錯誤偵測。
如果連接確實有效,則返回 true;如果連接不可能,則返回 false。如果連接是不可能的,則不會捕捉到該埠,因此不會發起對該埠的連接請求。
在該範例中,抑制了與同一節點的連接:
func _is_node_hover_valid(from, from_port, to, to_port):
return from != to
public override bool _IsNodeHoverValid(StringName fromNode, int fromPort, StringName toNode, int toPort)
{
return fromNode != toNode;
}
void add_valid_connection_type(from_type: int, to_type: int) 🔗
允許兩種不同埠型別之間的連接。埠型別是使用 GraphNode.set_slot() 方法為每個插槽的左右埠單獨定義的。
另請參閱 is_valid_connection_type() 和 remove_valid_connection_type()。
void add_valid_left_disconnect_type(type: int) 🔗
如果 GraphNode 插槽的左側埠具有指定的型別,則允許在從該埠拖動時斷開節點。另請參閱 remove_valid_left_disconnect_type()。
void add_valid_right_disconnect_type(type: int) 🔗
如果 GraphNode 插槽的右側埠具有指定的型別,則允許在從該埠拖動時斷開節點。另請參閱 remove_valid_right_disconnect_type()。
void arrange_nodes() 🔗
重新排列佈局中的選定節點,使連接之間的交叉最少,節點之間的水平和垂直間隙保持一致。
void attach_graph_element_to_frame(element: StringName, frame: StringName) 🔗
將 element GraphElement 附加到 frame GraphFrame。
void clear_connections() 🔗
移除節點之間的所有連接。
Error connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false) 🔗
在來源 GraphNode 節點 from_node 的 from_port 連接埠和目標 GraphNode 節點 to_node 的 to_port 連接埠之間建立連接。如果已存在連接,則不會建立連接。
keep_alive 為 false 的連接如果在重繪期間失效,則可能會被自動刪除。
void detach_graph_element_from_frame(element: StringName) 🔗
將 element GraphElement 從其目前附加的 GraphFrame 中分離出來。
void disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
移除 from_node GraphNode 的 from_port 和 to_node GraphNode 的 to_port 之間的連接。如果該連接不存在,則不移除任何連接。
void force_connection_drag_end() 🔗
結束目前連接的建立。換句話說,如果正在拖動一個連接,可以使用該方法中止該過程,並移除滑鼠游標後面的線。
這最好與 connection_drag_started 和 connection_drag_ended 一起使用,以新增自訂的行為,如通過快捷方式新增節點。
注意:該方法會抑制除 connection_drag_ended 之外的任何其他連接請求訊號。
Array[StringName] get_attached_nodes_of_frame(frame: StringName) 🔗
回傳附加到給定名稱的 GraphFrame 的節點名稱陣列。
Dictionary get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const 🔗
回傳到螢幕空間中給定點的最近連接。如果在 max_distance 像素內未找到連接,則回傳空的 Dictionary。
連接由以下形式的結構組成:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
例如,可以像這樣實現取得在給定滑鼠位置處的連接:
var connection = get_closest_connection_at_point(mouse_event.get_position())
int get_connection_count(from_node: StringName, from_port: int) 🔗
回傳 from_node 節點的 from_port 連接埠的連接數量。
PackedVector2Array get_connection_line(from_node: Vector2, to_node: Vector2) const 🔗
返回構成 from_node 和 to_node 之間的連接的點。
Array[Dictionary] get_connection_list_from_node(node: StringName) const 🔗
回傳包含 node 節點所有連接的 Array。
連接使用 Dictionary 表示,形式為:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
範例:取得指定連接埠的所有連接:
func get_connection_list_from_port(node, port):
var connections = get_connection_list_from_node(node)
var result = []
for connection in connections:
var dict = {}
if connection["from_node"] == node and connection["from_port"] == port:
dict["node"] = connection["to_node"]
dict["port"] = connection["to_port"]
dict["type"] = "left"
result.push_back(dict)
elif connection["to_node"] == node and connection["to_port"] == port:
dict["node"] = connection["from_node"]
dict["port"] = connection["from_port"]
dict["type"] = "right"
result.push_back(dict)
return result
Array[Dictionary] get_connections_intersecting_with_rect(rect: Rect2) const 🔗
回傳一個 Array,其中包含與給定 Rect2 相交的連接清單。
連接由 Dictionary 表示,結構如下:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
GraphFrame get_element_frame(element: StringName) 🔗
回傳包含給定名稱的 GraphElement 的 GraphFrame。
取得包含圖形左上角的縮放和網格捕捉控制項的 HBoxContainer。你可以使用此方法重新定位工具列或向其新增自訂控制項。
警告:這是一個必需的內部節點,刪除和釋放它可能會導致當機。如果你希望隱藏它或其任何子項,請使用它們的 CanvasItem.visible 屬性。
bool is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
如果 from_node GraphNode 的 from_port 連接到 to_node GraphNode 的 to_port,則返回 true。
bool is_valid_connection_type(from_type: int, to_type: int) const 🔗
返回是否可以在兩種不同的埠型別之間建立連接。埠型別是使用 GraphNode.set_slot() 方法為每個插槽的左右埠單獨定義的。
另請參閱 add_valid_connection_type() 和 remove_valid_connection_type()。
void remove_valid_connection_type(from_type: int, to_type: int) 🔗
不允許先前由 add_valid_connection_type() 允許的兩種不同埠型別之間的連接。埠型別是通過 GraphNode.set_slot() 方法為每個插槽的左右埠單獨定義的。
另請參閱 is_valid_connection_type()。
void remove_valid_left_disconnect_type(type: int) 🔗
如果 GraphNode 插槽的左側連接埠具有指定型別,當從該連接埠拖動時,則不允許斷開節點的連接。使用該方法來停用以前使用 add_valid_left_disconnect_type() 允許的斷開連接。
void remove_valid_right_disconnect_type(type: int) 🔗
如果 GraphNode 插槽的右側連接埠具有指定型別,當從該連接埠拖動時,則不允許斷開節點的連接。使用該方法來停用以前使用 add_valid_right_disconnect_type() 允許的斷開連接。
void set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float) 🔗
使用 activity 主題屬性中提供的顏色,設定 from_node 的 from_port 和 to_node 的 to_port 之間的連接的顏色。使用 amount 作為權重,在連接顏色和活動顏色之間線性插值顏色。
void set_selected(node: Node) 🔗
將指定的 node 節點設定為選中的節點。
主題屬性說明
Color activity = Color(1, 1, 1, 1) 🔗
根據連接的活動值插入連接線的顏色(請參閱 set_connection_activity())。
Color connection_hover_tint_color = Color(0, 0, 0, 0.3) 🔗
當滑鼠懸停在連接線上時與該連接線混合的顏色。
Color connection_rim_color = Color(0.1, 0.1, 0.1, 0.6) 🔗
每條連接線周圍的邊緣顏色,用於使相交線更容易區分。
Color connection_valid_target_tint_color = Color(1, 1, 1, 0.4) 🔗
目前拖動的連接懸停在有效目標連接埠上時與該連接線混合的顏色。
Color grid_major = Color(1, 1, 1, 0.2) 🔗
主要柵格線/點的顏色。
Color grid_minor = Color(1, 1, 1, 0.05) 🔗
次要柵格線/點的顏色。
Color selection_fill = Color(1, 1, 1, 0.3) 🔗
選定的矩形的填充顏色。
Color selection_stroke = Color(1, 1, 1, 0.8) 🔗
選擇的矩形的輪廓顏色。
int connection_hover_thickness = 0 🔗
滑鼠懸停在連接上時,按百分比係數加寬連接的線條。取值為 0 會停用醒目標示。取值為 100 會將線寬加倍。
int port_hotzone_inner_extent = 22 🔗
能夠抓取埠的(內側)橫向範圍。
int port_hotzone_outer_extent = 26 🔗
能夠抓取埠的(外側)橫向範圍。
吸附動按鈕的圖示。
關閉按鈕被按下時的圖示。
吸附動按鈕的圖示。
吸附動按鈕的圖示。
放大按鈕的圖示。
縮小按鈕的圖示。
縮放重新開機按鈕的圖示。
There is currently no description for this theme property. Please help us by contributing one!
繪製在柵格下方的背景。
當 GraphEdit 處於聚焦狀態時使用的 StyleBox(使用輔助應用時)。