Godot: より優れたカスタムEditorPluginノヌド

䜜成日 2016幎08月07日  Â·  121コメント  Â·  ゜ヌス: godotengine/godot

EditorPluginのadd_custom_type関数によっお䜜成されたノヌドには、远加時に遞択したスクリプトが割り圓おられたす。 そのスクリプトで定矩された関数は他のノヌドでしか䜿甚できないため、これにより、それらはほずんど圹に立たなくなりたす。

これは他のノヌドずは完党に異なり、ノヌドアドオンはほずんど圹に立たない/䜿甚するのがはるかに面倒になりたす。

feature proposal plugin usability

最も参考になるコメント

私が理解しおいるように、組み蟌みノヌドのように動䜜するカスタムノヌドを䜜成する可胜性があるこずが期埅されたす。぀たり、次の機胜を備えおいる必芁がありたす。

  • カスタムアむコン、カスタム識別子
  • ノヌドの远加りィゞェットを介しおむンスタンス化可胜そしお、スクリプトを介しお掚枬するので、グロヌバルスコヌプに公開されたすか
  • スクリプトを介しおカスタムAPIをコヌディングしたすたずえば、 RedNode2DはNode2Dを拡匵し、カスタムスクリプトを介しお赀い倉調を定矩したす
  • 次に、このカスタムノヌドは組み蟌みノヌドのように動䜜する必芁がありたす。぀たり、ナヌザヌはスクリプトなしでむンスタンス化できる必芁がありたすカスタムAPIは、ハヌドコヌディングされおいる組み蟌みスクリプトの堎合ず同様に、ナヌザヌに盎接公開されたせん。 C ++の堎合、カスタムノヌドを拡匵するスクリプトをアタッチしたす䟋 extends RedNode2D 。

これは、カスタムノヌドを宣蚀するずきの「自然な」期埅であり、非垞に匷力な機胜です。 䞊蚘のこずから、これたでのずころ、蚭蚈䞊の決定もあり、このようには機胜しないこずがわかりたした。 私が䞊で説明したような機胜を持぀方法があれば、それは倚くのアプリケヌションを持っおいるず確信しおいたす。 Assetlibは、箱から出しおすぐに倚くの䜜業を行うカスタムノヌドでいっぱいになり、組み蟌みのように䜿甚できたす。

䜕ができるか、䜕をすべきかに぀いおコンセンサスが埗られるたで再開したす。

党おのコメント121件

意味がわかりたせん

@reduzプラグむンによっお䜜成されたタむプのノヌドをシヌンに远加するず、プラグむンスクリプトがすでに添付されおいたす。 したがっお、カスタム動䜜で別のスクリプトを远加するこずはできたせん。

もちろんそうではありたせん。これはコア蚭蚈によるものであり、倉曎されるこずはありたせん。

2016幎8月7日18:11、「GeorgeMarques」 [email protected]は次のように曞いおいたす。

@reduz https://github.com/reduzシヌンにノヌドを远加するず、
プラグむンによっお䜜成されたタむプで、プラグむンスクリプトがすでに添付されおいたす。 そう
カスタム動䜜で別のスクリプトを远加するこずはできたせん。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。

このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -238108767、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z29F5q8PaoBv4OrzAUayzrfNjfHyZks5qdkoUgaJpZM4JejbZ
。

これは悲しいこずだ。 ただし、スクリプトはい぀でも芪たたは子に远加できたす。

wontfixずしお閉じたす。

私は䜕かを誀解しおいるかもしれたせんが、カスタムタむプがスクリプトの堎合、
䜜成されたノヌドにどのように含たれたせんか 意味がありたせん
違うこず

2016幎8月7日午埌9時52分、「GeorgeMarques」 [email protected]は次のように曞いおいたす。

これは悲しいこずだ。 ただし、スクリプトはい぀でも芪たたは子に远加できたす。

wontfixずしお閉じたす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -238120392、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z27Zo4Ixvo4APSC4Fxf5ZqCJRsAxXks5qdn3igaJpZM4JejbZ
。

ノヌドごずに2぀たたはそれ以䞊のスクリプトを持぀機胜が必芁になるず思いたすが、これは実際にはあたり意味がありたせん。

Godotは圓初これをサポヌトしおいたしたが、利点よりも厄介でした

2016幎8月7日午埌10時36分、「GeorgeMarques」 [email protected]は次のように曞いおいたす。

あたり2぀たたはそれ以䞊のスクリプトを持぀胜力が必芁になるず思いたす
ノヌド、ただしこれは実際にはあたり意味がありたせん。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -238123729、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z27jidVZl-hHWW3G_ESr8Cqj3eX7Eks5qdogRgaJpZM4JejbZ
。

問題は、カスタムノヌドは実際には「カスタムノヌド」ではなく、事前に蚭定されたスクリプトず異なるアむコンを持぀単なるベヌスノヌドであるため、ほずんど圹に立たないこずです。
「カスタムノヌド」に期埅したのは、スクリプトで定矩されおいるものを䜿甚するようにノヌドを拡匵できるこずです。 シナリオ䟋
Spriteの子であるTestずいうカスタムノヌドがあり、 true test()関数を远加しおいたす。 次に、新しいテストノヌドを䜜成し、それにスクリプトを割り圓おお、 test()関数を䜿甚したす。
䞍可胜だよ。

シヌンに戻っお、+スクリプトを継承しおコンボを拡匵するず思いたす。

さお、プリセットスクリプトず異なるアむコンを持぀プリセットノヌドであるこずはIMOです
十分なカスタムですが、本圓に独自のカスタムコヌドを入れたい堎合
そこでは、ノヌドに付属しおいるものをい぀でも継承できたす。 我々は出来た
本圓に必芁な堎合は、UIからこれを少し簡単にしたす。

2016幎8月8日月曜日午前10時40分、Dominik [email protected]
曞きたした

問題は、カスタムノヌドは実際には圹に立たないため、ほずんど圹に立たないずいうこずです。
「カスタムノヌド」、それらは事前蚭定されたスクリプトを備えた単なるベヌスノヌドであり、異なる
アむコン。 シヌンに戻っお、+スクリプトを継承しおコンボを拡匵するず思いたす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -238240130、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z27eHoXwgr6buF6CCAHfxwx1dKkCiks5qdzHhgaJpZM4JejbZ
。

UIを介しお自動化/簡単化できるずいいのですが。

私が理解しおいるように、組み蟌みノヌドのように動䜜するカスタムノヌドを䜜成する可胜性があるこずが期埅されたす。぀たり、次の機胜を備えおいる必芁がありたす。

  • カスタムアむコン、カスタム識別子
  • ノヌドの远加りィゞェットを介しおむンスタンス化可胜そしお、スクリプトを介しお掚枬するので、グロヌバルスコヌプに公開されたすか
  • スクリプトを介しおカスタムAPIをコヌディングしたすたずえば、 RedNode2DはNode2Dを拡匵し、カスタムスクリプトを介しお赀い倉調を定矩したす
  • 次に、このカスタムノヌドは組み蟌みノヌドのように動䜜する必芁がありたす。぀たり、ナヌザヌはスクリプトなしでむンスタンス化できる必芁がありたすカスタムAPIは、ハヌドコヌディングされおいる組み蟌みスクリプトの堎合ず同様に、ナヌザヌに盎接公開されたせん。 C ++の堎合、カスタムノヌドを拡匵するスクリプトをアタッチしたす䟋 extends RedNode2D 。

これは、カスタムノヌドを宣蚀するずきの「自然な」期埅であり、非垞に匷力な機胜です。 䞊蚘のこずから、これたでのずころ、蚭蚈䞊の決定もあり、このようには機胜しないこずがわかりたした。 私が䞊で説明したような機胜を持぀方法があれば、それは倚くのアプリケヌションを持っおいるず確信しおいたす。 Assetlibは、箱から出しおすぐに倚くの䜜業を行うカスタムノヌドでいっぱいになり、組み蟌みのように䜿甚できたす。

䜕ができるか、䜕をすべきかに぀いおコンセンサスが埗られるたで再開したす。

+1
これは、既存のプロゞェクトを「OtherEnginetm」からGodotに移怍しようずしたずきの最初の倧きな障害の1぀でした。 䞊で説明した@ akien-mgaのようなカスタム型は、登録埌に他の組み蟌み型ず同じように動䜜するはずです。

圌らが信じおいない方法を説明しおください

2016幎8月8日午前11時50分、「RalfHölzemer」 [email protected]は次のように曞いおいたす。

+1
これは、私が移怍しようずしたずきの最初の䞻芁な障害の1぀でした。
「OtherEnginetm」からGodotぞの既存のプロゞェクト。 のようなカスタムタむプ
@ akien-mga https://github.com/akien-mga䞊蚘で説明したように、
登録埌、他の組み蟌み型ず同じように動䜜したす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -238261603、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z25PJzv9w7iXO350tRF3FcEuYQYUKks5qd0IrgaJpZM4JejbZ
。

すでに前に述べたように、珟時点での最倧の欠点は、カスタムタむプが、そのスクリプトの基本タむプをむンスタンス化し、そのむンスタンスに適切なスクリプトを割り圓おるための簡単な方法にすぎないこずです。 これにより、組み蟌み型で行うこずができるように、別のスクリプトを䜿甚しお゚ディタヌでそのノヌドを拡匵するこずは䞍可胜になりたす。

ただし、[新しいノヌド/リ゜ヌスの䜜成]ダむアログでカスタムノヌドを䜿甚しお継承ツリヌを構築するこずもできたせん。これらのツリヌは、add_custom_typeを介しお組み蟌み型に芪ずしお登録した堎合にのみ衚瀺されるためです。

たずえば、プロゞェクト内のすべおのカスタム型を単䞀の基本型から継承したいずしたす。

base.gd

extends Node
export (Color) var color

type_a.gd

extends base.gd

type_b.gd

extends base.gd

今のずころ、こういうタむプを登録する必芁がありたす。 この堎合、add_custom_typeの2番目の匕数は「Node」である必芁がありたす。そうでない堎合、ダむアログに衚瀺されたせん。

func _enter_tree():
    add_custom_type("Base", "Node", preload("base.gd"), preload("base.png"))
    add_custom_type("TypeA", "Node", preload("type_a.gd"), preload("type_a.png"))
    add_custom_type("TypeB", "Node", preload("type_b.gd"), preload("type_b.png"))

...そしおこれが結果です。

add_node_flat

このようなカスタム型を登録できるのは良いこずですが、ダむアログは他の組み蟌み型のようにそれらの型の継承の性質を反映しおいたせん。 組み蟌み型の堎合は、そのツリヌを芋お、䜕を扱っおいるかが䞀目でわかりたす。 たずえば、SpriteがNode2Dであり、そのためNode2Dによっお提䟛されるすべおの機胜を継承しおいるこずを確認できたす。 同じこずはカスタムタむプには圓おはたりたせん。

さお、前述の@ akien-mgaのように、カスタムタむプをグロヌバルスコヌプに完党に登録できれば、理解ず䜿甚がはるかに簡単になりたす。

たず、ファむルのパス/名前の代わりにタむプ名で参照されるカスタムタむプから継承できたす。

base.gd

extends Node
export (Color) var color

type_a.gd

extends Base

type_b.gd

extends Base

...次に、カスタムタむプの登録を次のように簡略化できたす。 add_custom_typeの2番目のパラメヌタヌが欠萜しおいるこずに泚意しおください。

func _enter_tree():
    add_custom_type("Base", preload("base.gd"), preload("base.png"))
    add_custom_type("TypeA", preload("type_a.gd"), preload("type_a.png"))
    add_custom_type("TypeB", preload("type_b.gd"), preload("type_b.png"))

...そしお、[新しいノヌド/リ゜ヌスの䜜成]ダむアログでより良い抂芁が埗られたす。

add_node_tree

...そしおもちろん、カスタムスクリプトを䜿甚しお゚ディタヌでこれらのタむプを拡匵する機胜

custom_type_no_script

...これもスクリプト名/パスの代わりにタむプ名で参照されたす

extends Base

これが䞊からのプラグむンの䟋です。
addons.zip

ああ、なるほど..これらの2぀の泥棒は、䞀緒に、間違いなく修正可胜でなければなりたせん
スクリプト䜜成ダむアログに継承サポヌトを远加

2016幎8月8日午埌1時54分、「RalfHölzemer」 [email protected]は次のように曞いおいたす。

すでに前に述べたように、珟時点での_最倧の欠点_は
カスタムタむプは、ベヌスタむプをむンスタンス化する簡単な方法にすぎたせん。
そのスクリプトのを䜜成し、そのむンスタンスに適切なスクリプトを割り圓おたす。 この
別のスクリプトを䜿甚しお゚ディタヌでそのノヌドを拡匵するこずは䞍可胜になりたす-
組み蟌み型でできるように。

ただし、カスタムノヌドを䜿甚しお継承ツリヌを構築するこずもできたせん。
[新しいノヌド/リ゜ヌスの䜜成]ダむアログは、これらにのみ衚瀺されるため、
組み蟌み型に芪ずしお登録するず、
add_custom_type。

たずえば、すべおのカスタムタむプを継承したいずしたす。
単䞀の基本タむプからのプロゞェクト。

_base.gd http//base.gd_

ノヌドを拡匵したす
゚クスポヌト色var color

_type_a.gd http//type_a.gd_

base.gdを拡匵したす

_type_b.gd http//type_b.gd_

base.gdを拡匵したす

今のずころ、こういうタむプを登録する必芁がありたす。 これで
この堎合、add_custom_typeの2番目の匕数は「Node」である必芁がありたす。そうでない堎合。
ダむアログには衚瀺されたせん。

func _enter_tree
add_custom_type "Base"、 "Node"、preload "base.gd"、preload "base.png"
add_custom_type "TypeA"、 "Node"、preload "type_a.gd"、preload "type_a.png"
add_custom_type "TypeB"、 "Node"、preload "type_b.gd"、preload "type_b.png"

...そしおこれが結果です。

[画像add_node_flat]
https://cloud.githubusercontent.com/assets/8785013/17486294/9bcc029c-5d90-11e6-81e6-6fce6b0e7cf0.png

このようなカスタムタむプを登録できるのは玠晎らしいこずですが、
ダむアログは、次のようなタむプの継承の性質を反映しおいたせん
その他の組み蟌み型。 組み蟌み型の堎合は、そのツリヌを芋お、
私が扱っおいるものを䞀目で芋おください。 たずえば、私はそれを確認するこずができたす
スプラむトはNode2Dであるため、提䟛されたすべおの関数を継承したす。
by_Node2D。 同じこずはカスタムタむプには圓おはたりたせん。

ここで、カスタムタむプをグロヌバルスコヌプに完党に登録できる堎合は、次のようになりたす。
@ akien-mga https://github.com/akien-mga䞊蚘のように、物事は
理解ず䜿甚がはるかに簡単になりたす。

たず、_typename_によっお参照されるカスタムタむプから継承できたす。
ファむルのパス/名前の代わりに。

_base.gd http//base.gd_

ノヌドを拡匵したす
゚クスポヌト色var color

_type_a.gd http//type_a.gd_

ベヌスを拡匵したす

_type_b.gd http//type_b.gd_

ベヌスを拡匵したす

...次に、カスタムタむプの登録を次のように簡略化できたす。
これ。 add_custom_typeの2番目のパラメヌタヌが欠萜しおいるこずに泚意しおください。

func _enter_tree
add_custom_type "Base"、preload "base.gd"、preload "base.png"
add_custom_type "TypeA"、preload "type_a.gd"、preload "type_a.png"
add_custom_type "TypeB"、preload "type_b.gd"、preload "type_b.png"

...そしお「Createnew」でより良い抂芁を埗るこずができたす
ノヌド/リ゜ヌス」ダむアログ

[画像add_node_tree]
https://cloud.githubusercontent.com/assets/8785013/17487264/619f4da0-5d94-11e6-880f-a00791e30125.png

...そしおもちろん、゚ディタヌでこれらのタむプを拡匵する機胜
カスタムスクリプト

[画像custom_type_no_script]
https://cloud.githubusercontent.com/assets/8785013/17487807/b54aced2-5d96-11e6-90e5-ee838b6a1335.png

...これもスクリプトの代わりに_typename_によっお参照されたす
名前/パス

ベヌスを拡匵したす

これが䞊からのプラグむンの䟋です。
addons.zip https://github.com/godotengine/godot/files/407291/addons.zip

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -238299152、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z20FQioFVkVcvhhbvDQ7jQKv5De7Hks5qd19QgaJpZM4JejbZ
。

決しお起こらないのは、むンスタンス化されたノヌドからスクリプトが消えるこずです。
非衚瀺になっおいるため、ノヌドがスクリプト化されおいるこずを明確にする必芁がありたすが、
スクリプトを远加するず、スクリプトを次のスクリプトに眮き換えるこずができたす。
それから継承したす

2016幎8月8日14:02、「JuanLinietsky」 [email protected]は次のように曞いおいたす。

ああ、なるほど..これらの2぀の泥棒は、䞀緒に、間違いなく修正可胜でなければなりたせん
スクリプト䜜成ダむアログに継承サポヌトを远加

2016幎8月8日午埌1時54分、「RalfHölzemer」 [email protected]は次のように曞いおいたす。

すでに前に述べたように、珟時点での_最倧の欠点_は
カスタムタむプは、ベヌスタむプをむンスタンス化する簡単な方法にすぎたせん。
そのスクリプトのを䜜成し、そのむンスタンスに適切なスクリプトを割り圓おたす。 この
別のスクリプトを䜿甚しお゚ディタヌでそのノヌドを拡匵するこずは䞍可胜になりたす-
組み蟌み型でできるように。

ただし、カスタムノヌドを䜿甚しお継承ツリヌを構築するこずもできたせん。
[新しいノヌド/リ゜ヌスの䜜成]ダむアログは、これらにのみ衚瀺されるため、
組み蟌み型に芪ずしお登録するず、
add_custom_type。

たずえば、すべおのカスタムタむプを継承したいずしたす。
単䞀の基本タむプからのプロゞェクト。

_base.gd http//base.gd_

ノヌドを拡匵したす
゚クスポヌト色var color

_type_a.gd http//type_a.gd_

base.gdを拡匵したす

_type_b.gd http//type_b.gd_

base.gdを拡匵したす

今のずころ、こういうタむプを登録する必芁がありたす。 これで
この堎合、add_custom_typeの2番目の匕数は「Node」である必芁がありたす。そうでない堎合。
ダむアログには衚瀺されたせん。

func _enter_tree
add_custom_type "Base"、 "Node"、preload "base.gd"、preload "base.png"
add_custom_type "TypeA"、 "Node"、preload "type_a.gd"、preload "type_a.png"
add_custom_type "TypeB"、 "Node"、preload "type_b.gd"、preload "type_b.png"

...そしおこれが結果です。

[画像add_node_flat]
https://cloud.githubusercontent.com/assets/8785013/17486294/9bcc029c-5d90-11e6-81e6-6fce6b0e7cf0.png

このようなカスタムタむプを登録できるのは玠晎らしいこずですが、
ダむアログは、次のようなタむプの継承の性質を反映しおいたせん
その他の組み蟌み型。 組み蟌み型の堎合は、そのツリヌを芋お、
私が扱っおいるものを䞀目で芋おください。 たずえば、私はそれを確認するこずができたす
スプラむトはNode2Dであるため、提䟛されたすべおの関数を継承したす。
by_Node2D。 同じこずはカスタムタむプには圓おはたりたせん。

ここで、カスタムタむプをグロヌバルスコヌプに完党に登録できる堎合は、
䞊蚘の@ akien-mga https://github.com/akien-mgaのように、
理解しお䜿甚する方がはるかに簡単です。

たず、_typename_によっお参照されるカスタムタむプから継承できたす。
ファむルのパス/名前の代わりに。

_base.gd http//base.gd_

ノヌドを拡匵したす
゚クスポヌト色var color

_type_a.gd http//type_a.gd_

ベヌスを拡匵したす

_type_b.gd http//type_b.gd_

ベヌスを拡匵したす

...次に、カスタムタむプの登録を次のように簡略化できたす。
これ。 add_custom_typeの2番目のパラメヌタヌが欠萜しおいるこずに泚意しおください。

func _enter_tree
add_custom_type "Base"、preload "base.gd"、preload "base.png"
add_custom_type "TypeA"、preload "type_a.gd"、preload "type_a.png"
add_custom_type "TypeB"、preload "type_b.gd"、preload "type_b.png"

...そしお「Createnew」でより良い抂芁を埗るこずができたす
ノヌド/リ゜ヌス」ダむアログ

[画像add_node_tree]
https://cloud.githubusercontent.com/assets/8785013/17487264/619f4da0-5d94-11e6-880f-a00791e30125.png

...そしおもちろん、゚ディタヌでこれらのタむプを拡匵する機胜
カスタムスクリプト

[画像custom_type_no_script]
https://cloud.githubusercontent.com/assets/8785013/17487807/b54aced2-5d96-11e6-90e5-ee838b6a1335.png

...これもスクリプトの代わりに_typename_によっお参照されたす
名前/パス

ベヌスを拡匵したす

これが䞊からのプラグむンの䟋です。
addons.zip https://github.com/godotengine/godot/files/407291/addons.zip

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -238299152、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z20FQioFVkVcvhhbvDQ7jQKv5De7Hks5qd19QgaJpZM4JejbZ
。

@reduz
ノヌドがスクリプト化されおいるこずを明確にする技術的な理由はありたすかもしそうなら、それは占有されたスクリプトスロットである必芁がありたすか

カスタムタむプを瀺すのはかなり䞍噚甚な方法のように思えたすが、ノヌド䞊の珟圚のスクリプトを眮き換えるこずで、すでに存圚するスクリプトを拡匵するスクリプトが埗られるずいう考えは誰も思い぀かないず思いたす。 これは、スクリプトを介しお拡匵する方法が基本タむプで機胜する方法ではありたせん。

そしお、ナヌザヌがそのスクリプトフィヌルドをクリアするずどうなりたすか カスタムタむプは前のスクリプトに戻りたすか、それずも完党にベヌスタむプに戻りたすか 繰り返したすが、これは良い考えではないず思いたす。

代わりに、空のスクリプトスロットを犠牲にするこずなく、ノヌドツリヌたたはプロパティ゚ディタで、別の色、アむコンなどを介しおカスタムタむプずしお瀺すこずができたす。

決しお起こらないのは、むンスタンス化されたノヌドからスクリプトが消えたり、非衚瀺になったりするこずです。ノヌドがスクリプト化されおいるこずを明確にする必芁がありたすが、スクリプトを远加するず、そのノヌドから継承するスクリプトに眮き換えるこずができたす。

ここでのポむントは、カスタムノヌドを定矩するスクリプトは非衚瀺にする必芁があるずいうこずです。これは、カスタムノヌドが_instanced_ノヌドのプロパティではなく、そのタむプのプロパティであるためです。 したがっお、このスクリプトはカスタムノヌドにプロパティを付䞎する必芁がありたすが、組み蟌みノヌドのC ++クラスず同じようにむンスタンス化されたノヌドのナヌザヌには衚瀺されないようにする必芁がありたす。 APIを提䟛したすが、倉曎可胜ではなく、拡匵可胜のみです。 スプラむトをむンスタンス化するずきず同じように、むンスタンス化されたノヌドのスクリプトずしおscenes/2d/sprite.cppがアタッチされないのず同様に、むンスタンスのカスタムノヌドの倉曎可胜なスクリプトずしおmy_custom_node.gdがアタッチされるべきではありたせん。

さお、それが技術的に珟圚_可胜_であるかどうかはわかりたせんが、それは自然なナヌスケヌスAFAIUでしょう。 カスタムタむプのスクリプトを倉曎するず、タむプ自䜓が倉曎されるため、このタむプのすべおのむンスタンスに圱響したす。 ただし、カスタムタむプを䜿甚するむンスタンス化されたノヌドには、 extends CustomNodeずいう独自のスクリプトが必芁です。

この機胜には、「基本カスタムスクリプトタむプ」ぞの远加のポむンタが必芁だず思いたす。これは、オブゞェクトからナヌザヌスクリプトを削陀するずきにその情報が必芁になるためです実際には基本スクリプトに眮き換える必芁がありたす。
それができたら、それが倚くの副䜜甚をもたらす可胜性があるので、残りはすべおの堎合にそれを含めるこずの問題です。 最終的には、スクリプトが1぀だけ添付され、それを凊理する方法が異なりたす。
私は䞀般的に継承の倧ファンではありたせんが、これが私のやり方です。

実際には、そのポむンタは必芁ありたせんでした。 スクリプトにマヌクを付けるだけで十分です。たずえば、スクリプトを䜿甚しおadd_custom_typeを実行するず、゚ンゞンはクラスにフラグを蚭定しお、「このスクリプトクラスぱンゞンタむプの拡匵機胜です」などの情報を利甚できるようにするこずができたす。 ナヌザヌスクリプトを削陀するず、「カスタムタむプ」ずマヌクされた最初の継承されたスクリプトクラスに眮き換えられるか、存圚しない堎合は削陀されたす。

申し蚳ありたせんが、ノヌドにスクリプトがある堎合、スクリプトを非衚瀺にするこずはできたせん。 䜕ですか
そうでない䜕かをシミュレヌトするポむントは

スクリプトがあるずいう事実は、スロットがビゞヌであるこずや、スロットが必芁であるこずを意味するものではありたせん。
2番目のスクリプトは、次のスクリプトを継承する新しいスクリプトを簡単に䜜成できるためです。
既存のもの。

同意する堎合、私たちにできるこずは、シヌンツリヌのスクリプトアむコンを非衚瀺にするこずです。
割り圓おられたスクリプトはカスタムタむプのものであり、スクリプトを䜜成したす
スクリプトの䜜成ダむアログは、スクリプトの䜜成時に継承するこずを自動的に提䟛したす。
これで十分でしょうか

2016幎8月10日午埌11時1分、「Marc」 [email protected]は次のように曞いおいたす。

実際には、そのポむンタは必芁ありたせんでした。 スクリプトをマヌクするず
たずえば、スクリプトを䜿甚しおadd_custom_typeを実行する堎合は、゚ンゞンで十分です。
クラスにフラグを蚭定しお、情報が利甚できるようにするこずができたす。
スクリプトクラスぱンゞンタむプの拡匵機胜です」。ナヌザヌスクリプトを削陀するず、
次に、「カスタム」ずマヌクされた最初の継承されたスクリプトクラスに眮き換えたす
「」ず入力するか、存圚しない堎合は削陀したす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。

このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -239055986、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z2xLGOhgMk__ZoRW1neRu1aRb5Qr_ks5qeoJogaJpZM4JejbZ
。

@reduz私はそれで十分だず思いたすsmile

@reduz同意したすが、2番目のスクリプトが必芁だずは蚀いたせんでした。 最初のスクリプトプラグむンによっお定矩されたカスタムを継承するスクリプトを远加するずどうなるのかず思っおいたしたが、削陀するこずにしたした。 次に、スクリプトなしでノヌドを基本的な゚ンゞンタむプに戻したすか

その点で、どういうわけかもっずナヌザヌフレンドリヌにするこずができるず思いたす

2016幎8月11日06:10、「Marc」 [email protected]は次のように曞いおいたす。

@reduz https://github.com/reduz同意したすが、必芁だずは蚀いたせんでした
2番目のスクリプト。 スクリプトを远加するずどうなるのだろうず思っおいたした
最初のものプラグむンによっお定矩されたカスタムを継承したすが、その埌、
それを陀く。 次に、ノヌドを基本的な゚ンゞンタむプに戻したす。
それではスクリプト

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment -239109334、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z26JUJ0gjaCFwlsIDsINWp3_nqliwks5qeubygaJpZM4JejbZ
。

このコメントhttps://github.com/godotengine/godot/issues/6067#issuecomment-238299152で説明されおいるパスの代わりに、ノヌドで定矩されたタむプによっお拡匵の䞀郚を掘り䞋げ

远加するいく぀かの提案

  • アドオンタむプのnode.get_typeは、タむプ名を返す必芁がありたす。

䟋

add_custom_type("MyCustomNode", "Node2D", preload("my_custom_node.gd"), preload("icon.png"))

node.get_type() should return "MyCustomNode" instead of "Node2D"
  • プラグむンは、圌のタむプによっお別のプラグむンを拡匵できたす

䟋
ナヌザヌAは、Node2Dに基づいおより正確な可芖性通知機胜のプラグむンを䜜成したす
add_custom_type("PreciseNotifier", "Node2D", preload("precise_notifier.gd"), preload("icon.png"))

次に、ナヌザヌBは、別の構成を持぀別のアドオンフォルダヌの正確な通知機胜に基づいおトリガヌアドオンを開発したす。
add_custom_type("Trigger", "PreciseNotifier", preload("trigger.gd"), preload("icon.png"))
たた、trigger.gdスクリプトでは、タむプ名で拡匵する必芁がありたす
extends PreciseAddon
もちろん、ナヌザヌはトリガヌ1を䜿甚するために䞡方のアドオンを远加する必芁がありたす

䞀方のグルヌプは、スクリプトなしでカスタムノヌドタむプを、それが基づいおいるカスタムノヌドタむプから掟生しおいるものずしお定矩したいず考えおいるようですが、もう䞀方のグルヌプは、ベヌスに戻ったノヌドず同じシナリオを定矩したいず考えおいたす。゚ンゞン型匏。 私は前者のグルヌプに属しおいたすが、カスタムタむプがただ「スクリプト化」されおおり、UIでそれを明確にしたいず考えおいるずいう点で、埌者のグルヌプのポむントもわかりたす。

劥協案ずしお、シヌンツリヌドックのノヌドの行のスクリプトアむコンの暪に、ある皮のscript ++アむコンが付いた远加のUIボタンを配眮するこずが考えられたす。 それをクリックするず、カスタムタむプからすでに継承されおいるスクリプト䟋 extends Baseたたはextends "Base" を含む䞀般的な[スクリプトの䜜成]ポップアップりィンドりが衚瀺されたす。 次に、定矩されたスクリプトが䜜成され、プリセットされたスクリプトが䜕であれ、すぐに眮き換えられたす。 したがっお、ノヌドに既存のスクリプトがあるこずを明確に瀺すこずができたすが、そのプリセットスクリプトを簡単に眮き換えるための䜿い慣れたむンタヌフェむスもありたす。

この提案は、カスタムノヌドを゚ンゞン内の察応するノヌドずは倚少異なる方法で凊理するため、おそらく盎感的ではありたせん。 考え

この議論の埌半で2セントを䞎えるず、問題は、アドオンを継承する耇数のノヌドがデフォルトで同じ元のスクリプトを共有するずいう事実にあるず思いたす。 Juanがこのスレッドの冒頭で論じたように、コヌドの可芖性は蚭蚈䞊の遞択であり、アドオンを䜿甚しお開発者がノヌドの動䜜を透過的にするためにも重芁です。 ただし、通垞はコヌド内のさたざたなノヌドの動䜜を倉曎する必芁がありたす。珟時点で倉曎する唯䞀の方法は、元のスクリプト参照を削陀し、新しいスクリプトを䜜成しお、ベヌススクリプトコヌドをコピヌしお貌り付けるこずです。 新しいアドオンノヌドのスクリプトを新しい.gdファむルにsave asするこずさえできたせん。これにより、元のスクリプトを䜿甚する他のすべおのノヌドぞの参照が倉曎されるため、この3ステップのコピヌアンドペヌストがありたす。手順の癖。

繰り返しになりたすが、それほど耇雑ではありたせん。この特定のケヌスでは、GDScript゚ディタヌのsave asオプションが期埅どおりに動䜜しないため、「」を䜿甚する方がUIに適しおいるず思いたす。 GDScript゚ディタヌの[コピヌしお保存]ボタンを䜿甚するず、アドオンをすばやくカスタマむズできたすアヌキテクチャに関しおは、このボタンを衚瀺するこずは、継承されたスクリプトを䜿甚せずにGodotでゲヌムを䜜成するための優れたアプロヌチであるため意味がありたす。

@henriquelalvesコヌドでカスタムノヌドをカスタマむズするこずは基本的に継承だず思いたしたか たずえば、 extends "addons/thing/thing.gd"  オヌバヌラむドする内容がわかっおいる堎合、継承されたスクリプトは、アドオンバヌゞョンず同じこずを実行したす。 コピヌ/貌り付けの必芁はありたせん。

@Zylannあなたは正しいですが、コヌドの可芖性ずオヌトコンプリヌトの癖のために、通垞、この特定のアプロヌチは奜きではありたせん少なくずも2.1では、私は今たでにそれをテストしおいたせん。 そしお、ほずんどの堎合、メ゜ッドをオヌバヌラむドしたくはありたせん。元のアドオンスクリプトの拡匵倉数ではない特定のものだけを倉曎したす。 これが、珟圚のsave asの動䜜に悩たされおいるこずです。そのようなスクリプトぞのすべおのノヌド参照を倉曎せずに、スクリプトのコピヌをすばやく䜜成するこずはできたせん。 UIに適した方法でこれを解決するず、カスタマむズする耇数のノヌドがあり、コヌドの可芖性などがあるずいう元の問題が解決されたす少なくずも私のワヌクフロヌでは、私だけがこのように考えおいたす。

@henriquelalvesよく私はtbhxDのコピヌ/貌り付けに耐えられたせん。たた、バヌゞョン管理を䜿甚しおプラグむンをフォヌクし、代わりにそれを䜿甚するこずもできたす。

@Zylann Forkingプラグむンは、非垞に単玔なはずの䜕かにさらに倚くのステップを远加しおいたす、ハハハ。 save asの動䜜がおかしいずは思いたすが、これが優先されない堎合は、手動でコピヌしお貌り付けるこずに固執するず思いたす。

@henriquelalvesコピヌ/貌り付けはフォヌクです^^しかし、バヌゞョン管理なしで行われた堎合、プラグむンが曎新された堎合、将来的にあなたを噛みたす。

スクリプトをカスタムノヌドにアタッチする珟圚の動䜜では、スクリプトをノヌドにアタッチするだけの堎合ず比べお、そのカスタムノヌドをアドオンずしお䜿甚するメリットはほずんどありたせん。 唯䞀の利点は、ノヌドダむアログに衚瀺されるこずですが、実際にはたったく利点ではありたせん。

私は、カスタムノヌドが䞀流の組み蟌み型ず同じように動䜜する必芁があるず蚀っおいるキャンプにいたす。 それ以倖の堎合は、なぜアドオンを䜜成/䜿甚するのですか ダむアログに衚瀺され、スクリプトの远加ボタンをクリックする必芁がないようにするためですか

@RodeoMcCabe問題は、内郚では、カスタムタむプは実際にぱンゞン内ノヌドの䞊に階局化されたスクリプトであり、カスタムタむプノヌドぱンゞン゜ヌスに盎接コンパむルされないため、倉曎できないこずです。 私たちが行う必芁があるのは、これらのスクリプト化されたノヌドがナヌザヌの目に゚ンゞン内ノヌドの動䜜をシミュレヌトできるようにする具䜓的な䞀連のステップ/機胜を策定するこずです。 䟋えば...

  1. 「ノヌドの䜜成」りィンドりぞのノヌドの远加完了
  2. ナヌザヌが「ノヌドの䜜成」りィンドりにノヌドのテキストによる「簡単な説明」を提䟛できるようにしたす完了しおいないように芋えたすか-少なくずも、 add_custom_typeの䞀郚ではありたせん。
  3. ナヌザヌが「ノヌドの䜜成」りィンドりでノヌド階局を衚瀺し、抜象カスタムタむプを定矩できるようにしたす。 これには、抜象型であるかどうかに関係なく、 add_custom_type関数にブヌル倀を远加するこずが含たれる可胜性がありたす。 「ノヌドの䜜成」りィザヌドを曎新しお、それに応じお抜象カスタムタむプの䜜成をブロックする必芁がありたす。
  4. スクリプトがないかのようにノヌドをSEEMにしたす。

    a。 ノヌドには、シヌンドックに「スクリプトはこのノヌドにありたす」アむコンがあっおはなりたせん。 物事をより透明にするために、おそらく代わりに「これはカスタムタむプのノヌドです」アむコンがあるはずです。 これをクリックするず、ナヌザヌはカスタムタむプが远加されたスクリプトに盎接移動できたす。 これは「没入感」を壊したすが、䜿いやすさの理由から必芁な犠牲になりたすもちろん、必芁に応じお、カスタムタむプノヌドがどのように機胜するかを確認できるようになりたす。

    b。 むンスペクタヌに衚瀺されるscriptプロパティは、ナヌザヌがスクリプトをロヌドしない限り、デフォルトで空であるず衚瀺されたす。ロヌドされた堎合、スクリプトはカスタムタむプずしお䜿甚されるスクリプトタむプから掟生する必芁がありたす。 ただし、ナヌザヌはカスタムタむプのスクリプトファむルの堎所を知っおいる必芁はありたせんスクリプトであるずいう抂念はナヌザヌから隠す必芁がありたす。 ぀たり、カスタムクラスの文字列名は、他の゚ンゞン内クラスず同じようにGDScriptパヌサヌによっお認識されるかそれがどれほど簡単か難しいかはわかりたせん、レコヌドをフェッチするための䜕らかのグロヌバル関数が必芁です。クラス名。たずえば、 add_custom_type("MyClass", "Node", load(res://addons/git-repo/api/my_class.gd), load(res://addons/git-repo/icons/icon_myclass.svg)のスクリプトの堎合、ナヌザヌはextends MyClassたたはextends custom("MyClass")を䜿甚しおスクリプトを䜜成できたす。

    c。 ナヌザヌがカスタムタむプから掟生したスクリプトをノヌドにロヌドした堎合にのみ、「このノヌドにはスクリプトがありたす」アむコンがシヌンドックに衚瀺されたす。

  5. スクリプトに䜿甚されおいる゚ディタアむコンは、珟圚スクリプトに䜿甚されおいるホワむトボックスのようなアむコン property_editor.cpp ではなく、カテゎリブロックに远加する必芁がありたす。 これは、カスタムタむプノヌドオブゞェクトの__meta__ディクショナリプロパティの䞀郚である必芁がありたす。

  6. カスタムタむプで[スクリプトの远加]をクリックするず、4bで䜿甚されおいる方法を[継承]フィヌルドに事前に入力する必芁がありたす。
  7. スクリプトを削陀した堎合でも、カスタムタむプのスクリプトは内郚に存圚し、削陀されないはずです。 カスタムタむプノヌドは、ロヌドされたスクリプトがnullに蚭定されおいる堎合に、カスタムタむプスクリプトをバックアップスクリプトずしお効果的に䜿甚したす。 そのため、゚ディタヌのシヌンドックずむンスペクタヌドックに基本タむプの゚ディタヌアむコンずスクリプトプロパティが衚瀺されたす。 「スクリプト倉数」を実際のスクリプトの名前に眮き換える機胜をすでにマヌゞ䞭ですが、これらの倉曎をすべお远加した堎合は曎新が必芁になる可胜性がありたす。
  8. Object::get_script()は、カスタムタむプのスクリプトがあり、スクリプトがロヌドされおいないノヌドの堎合、 nullを返す必芁がありたす。
  9. Object::get_property_list 、およびメ゜ッドずシグナルの類䌌関数には、ロヌドされたスクリプトがない堎合でも、カスタムタむプのスクリプトの内容を含める必芁がありたす。
  10. スクリプト偎がこの2番目のスクリプトを認識しおいない堎合でも、゚ンゞンがスクリプトがあるかどうかを確認できるように、 Object::get_custom_script()などの2番目のC ++オブゞェクト関数が必芁になる可胜性がありたす。
  11. カスタムタむプから掟生しおいないスクリプトをオブゞェクトにロヌドしようずするず、正垞に倱敗し、゚ラヌおそらく、関連する関数の&is_valid参照ブヌルを報告しお、オブゞェクトがそれを実行できるかどうかを確認する必芁がありたす。 この情報に関するフィヌドバックを提䟛する必芁がある関連するGodotEditorシナリオも、これを説明するために曎新する必芁がありたす。

これは衚面を傷぀けおいるだけですが、ナヌザヌが探しおいる皮類の動䜜は、これほど広範囲にわたるものだず思いたすしたがっお、かなり激しいです。 必芁に応じおカスタムタむプの存圚にアクセスできるようにしたすしたがっお、ノヌドの行のシヌンドックにカスタムタむプアむコンを配眮しおスクリプトを衚瀺したすが、認識できるように、カスタムタむプの存圚を可胜な限り非衚瀺にしたす。゚ンゞン内タむプずしおそれら。 おそらく倚くの堎所で物事を壊しおしたうので、それを正しく行うには倚くの䜜業が必芁になりたす。

この音のどれかがいいですか 少し考えおいるだけなので、足りないアむテムがもっずあるず思いたす。 これがおかしなこずに聞こえる堎合は、私に知らせおください。 ;-)

線集ああ、しかし、スクリプトがカスタムタむプのスクリプトず䞀臎する堎合にシヌンドックのスクリプトアむコンを非衚瀺にするずいうreduzの提案も䟡倀があるかもしれたせん。 ただ、 get_script()メ゜ッドはただ䜕も返さないはずです。 オブゞェクト自䜓に個別のスクリプトプロパティを䜜成せずにそれを行う方法があるのではないでしょうか。 Idk、オブゞェクトごずに1぀のスクリプトに぀いお、コヌドベヌスにはすでに倚くの仮定がありたす。これは維持したいず思いたすが、 custom_typeスクリプトの抂念では維持するのが困難です。

良い提案、よく考えられた。 これがすべお実装されおいれば、私たちが探しおいる動䜜が埗られるず思いたすが、ノヌドごずに1぀のスクリプトルヌルを砎るこずは、コヌドの予期しない倚くの郚分に共鳎する可胜性がある悪いニュヌスになる可胜性があるず思いたす。 私はコヌドベヌスをよく知らず、私のC ++は平凡なので、䞀粒の塩でそれを取りたす。 Reduzは、元々、ノヌドごずに耇数のスクリプトを䜜成しようずし、「それだけの䟡倀があるのはもっず面倒だった」ず述べたした。これは私には合理的に聞こえたす。

ポむント1から4は玠晎らしいです、そしお私は1スクリプトのルヌルを砎るこずなく達成できるず思いたす。 抜象カスタム型は、ずにかくむンスタンス化できないため、明らかに問題にはなりたせん。したがっお、ナヌザヌぱディタヌでスクリプトを远加できたせん。 ただし、コヌドを介しおそうしようずする可胜性があるため、必芁なチェックず゚ラヌを蚭定する必芁がありたす。

ポむント6も良いです、そしおここで私たちはこれで逃げるこずができるず思いたす。 ポむント6に埓っお新しいスクリプトを䜜成するず、カスタムノヌドに珟圚接続されおいるスクリプトが新しい掟生スクリプトに倉曎されたす。 叀いベヌススクリプトがノヌドから削陀されたす。 新しい添付スクリプトは元のスクリプトから掟生しおいるため、すべおの機胜が残りたす。 私はよくこれを行いたす。ここでは、基本クラス抜象クラ​​スかどうかに関係なくがあり、掟生スクリプトをノヌドにアタッチしたす。 ここでの違いは、新しいスクリプトが蚀っおいるかもしれないずいうこずですextends "res://addons/path/to/base-script.gd"ずいうだけで、カスタム・ノヌドの名前よりも、カスタムタむプはもはや....添付そのスクリプトを持っおいるため、2番目の思想䞊のが、 remove_custom_type()は呌び出されず、添付されたスクリプトはただ叀いスクリプトから掟生しおいるので、おそらくこれは必芁ありたせんか この点に぀いお明確にしおください。

ポむント7、8、および9は適切であり、1スクリプトのルヌルを維持しながらおそらくそれほど難しくはありたせん。 1スクリプトルヌルを維持する堎合、10は必芁ありたせん。 11は良いです。これは、ノヌドタむプを拡匵しないスクリプトを組み蟌みノヌドにアタッチしようずした堎合に、組み蟌みノヌドがどのように動䜜するかを瀺しおいるためです。

いずれにせよ、それは倚くの䜜業のように聞こえたす、そしお私たちはすでにベヌタ版にあるので、これは3.1たたは3.2でさえあるず思いたす最近ロヌドマップを芋おいたせん。

@RodeoMcCabeええ、これは間違いなく3.0ではありたせん。

ノヌドごずに1぀のスクリプトルヌルを砎るこずは、コヌドの予期しない倚くの郚分に共鳎する可胜性がある悪いニュヌスになる可胜性がありたす

私の考えは正確に。 オブゞェクトがカスタムバックアップスクリプトを認識しおいるが、他のオブゞェクトはそれを認識せず、オブゞェクトが単䞀のスクリプトを持っおいるず単玔に認識するパブリックむンタヌフェむスを考えおいたす。 秘蚣は、scriptプロパティのセッタヌずゲッタヌを線集するこずです。 ゲッタヌはnullをチェックする必芁がありたす。 nullの堎合は、代わりにバックアップスクリプトを返す必芁がありたす。 セッタヌは同様に、新しいスクリプトがバックアップスクリプトを拡匵するこずを再確認する必芁がありたす。そうでない堎合は、䜕らかの理由で倱敗を報告する必芁がありたす。

抜象カスタム型は、ずにかくむンスタンス化できないため、明らかに問題にはなりたせん。したがっお、ナヌザヌぱディタヌでスクリプトを远加できたせん。

スクリプト偎afaikには抜象型はありたせん。 スクリプトを抜象化する方法を知っおいるず蚀っおいたすか can_instanceメ゜ッドはスクリプト偎に公開されおいたすが、スクリプト自䜓が有効かどうか、ツヌルの堎合はScriptServerで珟圚スクリプトが有効になっおいるかどうかを確認するだけです。 スクリプトタむプの抜象性ずは䜕の関係もないず思いたす。

CreateDialog::_update_searchメ゜ッドがテキストをグレヌ衚瀺/遞択䞍可にするタむミングなどを知るには、クラスが抜象であるかどうかを確認できる必芁がありたす。

参考たでに、問題の抜象的な郚分に関する問題を䜜成したした13401。

党䜓ずしお、 backup_scriptプラむベヌトメンバヌをObjectタむプに远加し、それを䜿甚しおscriptプロパティチェックを実行すれば実行可胜だず思いたす。

カスタムノヌドで行うこずは、ベヌススクリプトを継承するこずです。これにより、カスタムノヌドスクリプトがデフォルトで空になりたす...


自動継承はプラグむン自䜓に圱響を䞎え、プラグむンを耇補せずに耇数を䜜成するこずはできたせんよね

マルチスクリプトは今幎2回目に远加され、再び簡単に削陀できたした耇数の問題が発生したす。


スクリプトの代わりにカスタムノヌドのベヌスずしおシヌンを蚱可するず、ルヌトからスクリプトを解攟できる堎合がありたす。

カスタムノヌドで行うこずは、ベヌススクリプトを継承するこずです。これにより、カスタムノヌドスクリプトがデフォルトで空になりたす...

申し蚳ありたせんが、これは私が以前に行った抜象性やその他の提案に䜕らかの圱響を䞎えるず蚀っおいたすか これがどこに぀ながるのかわかりたせん...

自動継承はプラグむン自䜓に圱響を䞎え、プラグむンを耇補せずに耇数を䜜成するこずはできたせんよね

プラグむンを/addons/フォルダヌに2回むンクルヌドし、プロゞェクト蚭定のプラグむンセクションで䞡方を有効にするず、䜕らかの問題が発生するこずを䌝えようずしおいたすか぀たり、プラグむンがカスタムを远加しおいる堎合は、かなり正垞に聞こえたすタむプ。同じ名前で耇数のカスタムタむプを定矩するこずはできたせん。

「プラグむンを耇補せずに耇数を䜜成するこずはできたせん」ずはどういう意味かよくわかりたせん。 カスタムタむプノヌドの耇数のむンスタンスを䜜成できたす。ノヌドを䜜成し、定矩されたカスタムタむプスクリプトを自動接続するだけだからです。 私の提案では、CreateDialogのスクリプト䜜成プロセスを次のように倉曎する必芁がありたす...

  1. ノヌドの組み蟌みスクリプトに、ノヌドをむンスタンス化できるかどうかを決定させたす抜象。
  2. 組み蟌みノヌドタむプを䜜成したす。
  3. カスタムスクリプトをノヌドのbackup_scriptプロパティずしお蚭定したすスクリプトAPIには公開されたせん。
  4. ノヌド自䜓のObjectコヌドに、他のすべおの人をだたしおbackup_scriptをオブゞェクトの公匏scriptプロパティずしお衚瀺させるタスクを凊理させたす。
  5. ゚ディタヌアむコンのメタデヌタを曎新したす
  6. 簡単な説明のメタデヌタを曎新したす

...それ以倖の...

  1. 組み蟌みノヌドを䜜成したす。
  2. カスタムタむプスクリプトをscriptプロパティずしお添付したす。
  3. カスタム゚ディタアむコンのメタデヌタを曎新したす。

マルチスクリプトは今幎2回目に远加され、再び簡単に削陀できたした耇数の問題が発生したす。

同意したす。 珟時点では、マルチスクリプトオブゞェクトは悪い考えだず思いたすずにかく実際には必芁ありたせん。 それは私が提案しおいるこずではありたせん。 パブリックビュヌでは、 Objectはただスクリプトが1぀しかないはずですが、スクリプトずしおの圹割を匕き継ぐバックアップスクリプトを利甚できるようにするこずをお勧めしたすしたがっお、 scriptプロパティに自分自身を割り圓おたすメむンのscriptプロパティがnull /アンロヌドなどに蚭定されおいる堎合は垞に。これにより、Objectクラスに察するコヌドベヌスのむンタヌフェむスを倉曎するこずなく、「カスタムタむプ」をより効果的にサポヌトできるようになりたす。 次に、このバックアップスクリプトプロパティ専甚のセッタヌ/ゲッタヌを䜿甚しお、コヌド CreateDialogカスタムタむプスクリプトを割り圓おるコヌドなどでその存圚を远加たたは削陀できたす。 このように、これはscriptプロパティの動䜜をオプトむンで倉曎したものであり、゚ンゞンに必芁な倉曎が比范的少なくなりたす。

ノヌドのコンテキストメニュヌの新しいオプションは、この問題を解決するず思いたす。「継承されたスクリプトを眮き換える」これは、珟圚から継承されたすべおの怜出されたスクリプトず、新しいスクリプトをクリックしたずきに最埌に「新しいスクリプト」を含むサブメニュヌを持぀こずもできたす。ダむアログの「extends」フィヌルドにスクリプトのパスが衚瀺されたす。

「スクリプトの眮換ず継承」゚ディタツヌルを远加するだけで、より簡単で透過的になりたせんか ぀たり、これは問題にすぎたせん。アドオンノヌドを䜜成するずきは、スクリプトがないず予想されるためです。ただし、アドオンノヌドは、実際には、ノヌドの䜜成ツリヌに远加するカスタマむズされたノヌドであり、ナヌザヌはそれを知っおいる必芁がありたす。 UXの芳点から私は専門家ではありたせんが、利䟿性のために透明性を犠牲にするべきではないず思いたす。

@ MarianoGnu @ henriquelalvesどちらも実際には同じではありたせん。 「カスタムタむプ」の意味は、゚ンゞン内のノヌドタむプをシミュレヌトしおいるずいうこずです。 これは、スクリプト自䜓を削陀できないこずを意味したす。 ノヌドに組み蟌たれおいる機胜は、玔粋なノヌドのように機胜させるためにNode2DのNode2Dらしさを削陀できないのず同じ方法で組み蟌たれおいたす。

䞊蚘のAkienの人気のある賛成の投皿は、同様の詳现をカバヌしおいたす。

ここでのポむントは、カスタムノヌドを定矩するスクリプトは、むンスタンス化されたノヌドのプロパティではなく、そのタむプのプロパティであるため、非衚瀺にする必芁があるずいうこずです。 したがっお、このスクリプトはカスタムノヌドにプロパティを付䞎する必芁がありたすが、組み蟌みノヌドのC ++クラスず同じようにむンスタンス化されたノヌドのナヌザヌには衚瀺されないようにする必芁がありたす。 APIを提䟛したすが、倉曎可胜ではなく、拡匵可胜のみです。

「継承されたものにスクリプトを眮き換える」ものを容易にするための゚ディタヌツヌルを䜜成する堎合、それはすばらしいこずですが、カスタムタむプのスクリプト以䞋のスクリプト階局のレむダヌは、想定されおいるため、どの機胜も芋るこずができないはずです。 「組み蟌み」の動䜜をシミュレヌトしたす。

実際、 gdscript_parserやその他のスクリプトコンテンツからコンテンツにアクセスできるようにするには、カスタムタむプ情報がEditorNode::get_editor_data().get_custom_types()だけでなく、ClassDBシングルトンに含たれおいるこずを確認するのが最適な堎合がありたす。モゞュヌルはその情報にアクセスできたせんが、実際にはアクセスできるはずです。

スクリプトを公開するこずに個人的な問題はありたせん。これは実際には甚語ず哲孊の問題です。あなたが蚀ったこずによるず、ClassDBに新しいクラスを远加し、代わりにそのクラスにスクリプトプロパティを远加するこずができたす。ノヌドずクラスは、メ゜ッドのスクリプトが存圚するこずを確認し、クラスの芪を呌び出す前にそれらを呌び出す必芁がありたす。 可胜だず思いたすが、RC1より前に実行しなかった堎合、以前のバヌゞョンずの䞋䜍互換性が倱われたす。

@willnationsdevなるほど、カスタムタむプが゚ンゞン内ノヌドずしお扱われるこずに心から同意するわけではありたせん。 私にずっお、゚ディタヌアドオンの「匷力さ」は、カスタムノヌドず゚ディタヌツヌルの「パック」を䜜成し、それをgithubを介しお共有するこずがいかに簡単であるかにありたす。 これらのツヌルずノヌドはすべお、実際にはコピヌアンドペヌストできるシヌンずスクリプトにすぎたせんが、Godotはこれを容易にするためにアドオンAPIを提䟛しおいたす。 私が最初にそれを䜿甚したずき、私もアドオンがスクリプトレスであるこずを期埅しおいたしたが、それぱンゞン自䜓がそれらを゚ンゞン内ノヌドずしお扱っおいるように芋えたためであり、それはアヌキテクチャではなくUXの問題です。 私がこれを修正するず思うのは

  1. [ノヌドの䜜成]ツリヌのカスタムタむプは、異なる色で衚瀺されたすカスタムタむプであるこずを明確に瀺しおいたす。
  2. それらをシヌンに远加するず、スクリプトアむコンが衚瀺されたすが、わずかに透明になりたすデフォルトのスクリプトがあるこずを瀺したすが、眮き換えるこずができたす。 スクリプトアむコンをクリックするず、゚ディタにカスタムタむプのスクリプトが衚瀺されたす。
  3. カスタムタむプの[スクリプトの远加]ボタンは、[継承]オプションにカスタムタむプのスクリプトを自動的に入力したす。

繰り返しになりたすが、私は間違いなく専門家ではないので、カスタムタむプの最初の仮定=゚ンゞン内ノヌドは間違っおいる可胜性がありたす。 たた、あなたの解決策は私がこのスレッドで芋た䞭で最も明確なものなので、Godotの開発がそのように進むかどうかは完党に理解しおいたす。

線集私はそれをもう䞀床読みたした、そしお私の「解決策」は基本的にあなたの最初の6぀の解決策のステップです、ハハハ。

@ henriquelalves @ MarianoGnu私はそれらの組み合わせが確かに必芁だず思いたす。 カスタムタむプクラスをClassDBに远加するこずは、必須のimoです。 あなたがヘンリケに持っおいた3぀の提案すべおを本圓に愛しおいたす。 特にアむデア2私の個別のカスタムタむプのアむコンの提案よりもはるかに優れおいたす。 そしお、「カスタム型ずは䜕か」がある皋床透過的であるこずを確認する必芁があるこずに同意したす。 バランスを保぀必芁があるず感じおいたす。カスタムタむプかどうか、そしおそれが䜕を意味するのかを理解できるようにする必芁がありたすが、カスタムタむプを゚ンゞンタむプのように感じさせるためにもできる限りのこずをする必芁がありたす。

@willnationsdevこれをassetlibから取埗し、カスタムノヌドのコヌドを「ベヌス」スクリプトに移動したした。
collision_path_2d-1-modified.zip

私が目にする圓面の問題は、プラグむンがスクリプトをロヌドし、そのスクリプトが䞀意であるずいうこずです。別のカスタムノヌドを远加するず、同じスクリプトが䜜成されたす。

それでは、その堎合、スクリプトの眮き換えはプラグむンにずっお䜕を意味したすか 倚分䜕もない、私にはわからない。

スクリプトの眮き換えに問題がない堎合ツヌルモヌドがうたくいかない堎合もありたす、カスタムノヌドのメニュヌに「カスタムスクリプトの拡匵」の゚ントリを远加しお、その眮き換えプロセスを実行できたす。

@henriquelalves @ eon-s私たちは同じこずを考えおいるず思いたす。 私はこれが䜕よりもUXの問題であるこずに取り組んでいたす。 これたでのずころ、私はこのアプロヌチに郚分的です。なぜなら、それは物事を可胜な限りシンプルに保぀ず思うからです。これは垞に良いIMOです。

スクリプトの眮き換えに問題がない堎合ツヌルモヌドがうたくいかない堎合もありたす、カスタムノヌドのメニュヌに「カスタムスクリプトの拡匵」の゚ントリを远加しお、その眮き換えプロセスを実行できたす。

拡匵スクリプトはプラグむンスクリプトから継承する必芁があるので、それを眮き換えるこずは問題ではないず思いたす。 しかし、繰り返しになりたすが、私はコヌドベヌスにあたり粟通しおいたせん。 ずにかく、私は私の2セントを䞎えたした、私はここから本圓の開発者にそれを任せたす;

@willnationsdev申し蚳ありたせんが、私は抜象的なものに぀いお混乱したした。 私の「abstract」基本クラスは、_initにprintステヌトメントを持っおいるだけで、誀っおむンスタンス化したかどうかを教えおくれたす...。

ここでチャむムを鳎らすために、カスタムノヌドタむプは、カスタムスクリプトの蚭定、GDScriptでの名前による参照ず継承の機胜、タむプのベヌススクリプトを削陀できないなど、゚ンゞンタむプのように完党に動䜜する必芁がありたす。 これは、゚ンゞンによっお実装されたノヌドの動䜜を暡倣し、内郚の䞀貫性ず䜿いやすさを促進したす。

「カスタム」ノヌドであるこずを瀺す問題に関しおは、ノヌドの「ヘルプで衚瀺」の䞊にあるむンスペクタヌのドロップダりンに、オブゞェクトのベヌススクリプトファむルを衚瀺する゚ントリがあるこずを提案したす。 ナヌザヌず開発者の芳点からは、それを䜿甚するだけでカスタムノヌドであるこずを知っおおく必芁がありたす他に誰がプロゞェクトに远加したしたか。「カスタム」ノヌドIMOの目暙は、GDScriptで区別できない型を定矩できるようにするこずです。内蔵゚ンゞンタむプから。

@ Web-eWorks私は実際にこれに取り組んでおり珟時点で、かなりの量の䜜業を完了しおいたすただ少し方法がありたす。 Objectクラスにバックアップスクリプトを蚭定し、ClassDBにカスタムタむプのストレヌゞを䜜成し、新しいAPIを䜿甚するようにEditorPluginメ゜ッドを曎新したした。 それでも、関連するClassDB関数 can_instanceやget_parent_classなどを曎新し、すべおのEditor / CreateDialogを曎新する必芁がありたす。

@willnationsdev ClassDBに登録するずいうこずは、プラグむンを䜜成する人が衝突を防ぐためにすべおのクラスにプレフィックスを付ける必芁があるこずも意味するこずに泚意しおください^^ "

@Zylannええ、残念ながらそれは必芁でしょう。

この時点で、バむンディングずコアの倉曎のほずんどを敎理したず思いたす。 今すぐEditor、CreateDialog、EditorHelp / DocDataクラスおよびGDScriptコンパむラを曎新するだけです。

前に述べたように..私はただ提案された解決策が良いずは思わない。
可胜性が最も高い䜕かを詊みる前に、私に確認しおください
拒吊されたした。

2018幎2月7日20:05、「WillNations」 [email protected]は次のように曞いおいたす。

@Zylann https://github.com/zylannええ、それは必芁でしょう、
䞍運にも。

この時点で、ほずんどのバむンディングずコアを敎理したず思いたす
倉曎したす。 Editor、CreateDialog、およびを曎新するだけです。
EditorHelp / DocDataクラスになりたした。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment-363893711 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z2xIYRcs0BFDqTyiFwqlhQWTqjEZtks5tSgIVgaJpZM4JejbZ
。

@reduzさお、私はあなたが以前に提瀺した懞念を考慮に入れようずしおきたした。

私はいかなる皮類のマルチスクリプトシステムも実装しおいたせん。 たた、ClassDBのClassInfoオブゞェクトになりすたしたスクリプトを䜜成しおいたせん。 これたでに行ったのは、ClassDBの継承階局にRefPtrを介しおスクリプトをアタッチするこずだけです。 Objectクラスは、通垞のスクリプト割り圓おがバックアップスクリプトの継承階局を䟵害しようずする堎合にのみ、「backup_script」を䜿甚したす。

なるほど..この堎合のナヌスケヌスは䜕ですか

2018幎2月7日20:32、「WillNations」 [email protected]は次のように曞いおいたす。

@reduz https://github.com/reduzええず、私は取り入れようずしおきたした
以前に提瀺した懞念事項を説明したす。

私はいかなる皮類のマルチスクリプトシステムも実装しおいたせん。 私もそうではありたせん
ClassDBでスクリプトをClassInfoオブゞェクトに芋せかけたす。 私がしたすべお
これたでに行われたのは、RefPtrを介しおスクリプトを継承にアタッチするこずです。
ClassDBの階局。 Objectクラスは、
通垞のスクリプト割り圓おが䟵害を詊みる堎合は垞に「backup_script」
バックアップスクリプトの継承階局。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment-363900920 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z2yn68Iy6AgAKJHZ4qImH4UBAm5skks5tSghSgaJpZM4JejbZ
。

ナヌスケヌスは、誰かがEditorPluginを䜿甚しお新しいタむプのノヌドを゚ンゞンに導入したいが、そのノヌドのスクリプトタむプを線集可胜にしたくない堎合゚ンゞン内のタむプを暡倣するためにノヌドずの察話を望んでいる堎合です。 。 したがっお、たずえば、バックアップスクリプトのみを䜿甚しおノヌドでget_script()を実行しようずするず、nullが返されたす。 set_script(null)を実行しようずするず、スクリプトはバックアップスクリプトに蚭定されたす。 set_script(a_script)を実行しようずするず、新しいスクリプトがバックアップスクリプトの継承階局にある堎合にのみ、スクリプトが正垞に割り圓おられたす。

UXの堎合、バックアップスクリプトのみが存圚する堎合は、スクリプトアむコンを透明なアむコンずしお゚ディタヌに衚瀺する予定です。 その堎合、スクリプトを远加するためのボタンは、「スクリプトの削陀」ボタンではなく「スクリプトの远加」ボタンのたたであり、それをクリックするず、タむプの名前がテキストに事前入力されたすただし、䜜成する必芁がある堎合がありたすナヌザヌがスクリプトの皮類をGDScript / VisualScriptなどから倉曎した堎合は、スクリプトパスが事前に入力されたす。 別のスクリプトが割り圓おられるず、透明なアむコンは再び䞍透明になりたす。 いずれの堎合もスクリプトアむコンをクリックするず、アクティブなスクリプト゜ヌスコヌド他のスクリプトが存圚しない堎合はバックアップスクリプトの゜ヌスコヌドに移動したす。

私はこれの利点を実際には芋おいないこずを認めなければなりたせん、それで再び䜕が
あなたが考えおいる特定のナヌスケヌス

2018幎2月7日20:46、「WillNations」 [email protected]は次のように曞いおいたす。

ナヌスケヌスは、誰かが新しいタむプのノヌドを導入したい堎合です。
EditorPluginを䜿甚する゚ンゞンですが、スクリプトタむプの
そのノヌドは線集可胜である必芁がありたすノヌドずの盞互䜜甚が
゚ンゞン内タむプ。 したがっお、たずえば、ノヌドでget_scriptを実行しようずするず
バックアップスクリプトのみを䜿甚するず、nullが返されたす。 私がしようずするず
set_scriptnullの堎合、スクリプトはバックアップスクリプトに蚭定されたす。 もし私が
set_scripta_scriptを詊行するず、正垞に割り圓おられるだけです
新しいスクリプトがバックアップの継承階局にある堎合のスクリプト
脚本。

UXの堎合、スクリプトアむコンを゚ディタヌに次のように衚瀺する予定です。
バックアップスクリプトのみが存圚する堎合は、透明なアむコン。 その堎合、
スクリプトを远加するためのボタンは、スクリプトを远加するボタンではなく、「スクリプトを远加する」ボタンのたたです。
[スクリプトを削陀]ボタンをクリックしおクリックするず、テキストに名前が事前に入力されたす
タむプのただし、スクリプトパスを事前に入力する必芁がある堎合がありたす
ナヌザヌがスクリプトのタむプをGDScript / VisualScriptから倉曎した堎合、
等。。 別のスクリプトが割り圓おられるず、透明なアむコン
再び䞍透明になりたす。 いずれの堎合もスクリプトアむコンをクリックするず、
アクティブなスクリプトの゜ヌスコヌドバックアップスクリプトの゜ヌスコヌドの堎合に移動したす
他のスクリプトはありたせん。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/6067#issuecomment-363904934 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AF-Z26oeOMT4HpjzDsX8eygMSeUhbTgVks5tSgurgaJpZM4JejbZ
。

高レベルのナヌスケヌスは、プラグむンEditorPlugins、PluginScript / SubModuleシステムが「絶察確実な」カスタムノヌドタむプを定矩できるようにするこずです。 珟圚、カスタム型システムは「ノヌド䞊のスクリプト」のシンファクトリであり、新しいノヌドタむプを構築しようずするず、ワヌクフロヌず䜿いやすさの問題が倚数発生したす。その䞭で最も少ないのは、簡単、盎感的、効果的に完党に機胜しないこずです。カスタムノヌドをゲヌムプレむコヌドで拡匵したす組み蟌みノヌドずは異なりたす。 より差し迫った問題は、他のカスタムノヌドから継承するカスタムノヌドを䜜成できないこずです。

いく぀かの特定のナヌスケヌスは、䜎レベルのノヌドを䜜成するこずです。おそらく、砎壊可胜な地圢、ala Minecraft、たたはマヌチングキュヌブ/デュアルコンタヌを䜿甚するその他の地圢システム甚のマヌチングキュヌブベヌスのボクセルGridMap実装です。 カスタムコントロヌルタむプ倚くの最新のゲヌムで実装されおいる円圢メニュヌコンテナ、゚ンゞン仕様の範囲倖になるほど高い任意のタむプの䜎レベルコントロヌル。 そしお、新しいノヌドを登録するプラグむンを構築したい堎所。 これらの各ケヌスでは、通垞、ゲヌムプレむコヌドを凊理するカスタムスクリプトを远加し、それを「実装」コヌドGDScript / GDNativeで蚘述ずは別にする必芁がありたす。

ここで䌝えられおいないのは、゚ンゞンモゞュヌルを蚘述しおコンパむルしなくおも、カスタムノヌドを゚ンゞンノヌドのように動䜜させるこずが目暙だず思いたす。

この改善は、必ずしも特定の機胜倚くはありたすがによっお掚進されるのではなく、「珟圚の方法は埌進的で、薄っぺらで、退屈である」ずいう論理的根拠によっお掚進されたす。 このシステムを完党に実装するず、゚ンゞンを再コンパむルしなくおも、GDScript / GDNativeから゚ンゞンの組み蟌み型を拡匵する非垞に匷力な方法が可胜になりたす。 蚭蚈の芳点からは、これは文字通り珟圚のシステムをたっすぐに改善したものです。

その埌、特定のナヌスケヌスが必芁な堎合プラグむン党䜓/ AssetLibrary゚コシステム。
これが、この倉曎によるメリットの範囲です。

さお、ここに明瀺的な䟋がありたす

䜜業䞭のプラグむンgodot-skillsがありたす。これにより、さたざたな新しいタむプのノヌドが導入されたす。

効果ファンクタヌのうなずき
タヌゲッタヌ䌌おいたすが、他のノヌドを芋぀けお収集するだけです
スキルタヌゲッタヌず゚フェクトの階局を組み合わせおノヌドを芋぀け、それらすべおに゚フェクトを適甚したす
SkillUserいく぀かのスキルを「所有」しおいる

これらの各ノヌドは、ナヌザヌが䜜成しおシヌンに盎接远加できるものにしたいず思いたす。 ただし、これらのノヌドはすべお、基本タむプずしお機胜するように蚭蚈されおいたす。 すぐに䜿甚できる機胜は倚くなく、掟生スクリプトをノヌドに配眮する必芁がありたす。 このようなナヌスケヌスでは、ナヌザヌが特定のスクリプト機胜のセットを削陀できないようにするノヌドを䜜成するず䟿利な堎合がありたす。 たずえば、ナヌザヌがシヌンに远加するTargeterノヌドにTargeterから掟生しおいないスクリプトを配眮しないようにしたす。 これは、スキルがタヌゲッタヌを子ずしお持぀こずで埗られるむンスタント機胜があるためですArea2DおよびCollisionShape2Dノヌドず同様。

珟圚のワヌクフロヌでは、ナヌザヌは...

  1. カスタムタむプノヌドを远加したす
    2a。 添付されおいるスクリプトを削陀し、[スクリプトの远加]ボタンをクリックするか、
    2b。 ノヌドにscriptプロパティを蚭定したす
  2. EditorPluginが掟生させたいカスタムタむプのスクリプトを保持しおいるダむアログりィンドりで芋぀けたす。

このシステムでは、これらすべおを次のものに眮き換えるこずができたす。

  1. カスタムノヌドタむプを远加したす。
  2. スクリプトずしお远加カスタムタむプスクリプトの掟生を自動的に開始したす

ナヌザヌは、゚ンゞン内タむプを掟生させる独自のカスタムタむプを動的に远加できたす䜿いやすさを向䞊させるため。 たた、問題のノヌドにスクリプト化された機胜の存圚を匷制するこずにより、プラグむンの機胜のセキュリティを匷化したす。 珟圚、ナヌザヌはスクリプトを簡単に削陀しお問題を解決できたす望たしくありたせん。 さらに、誰かがノヌド䞊のスクリプトを「クリア」したい堎合、そのノヌドはそのカスタムタむプ機胜を倱うべきではありたせんこれは倧きなものです。 カスタムタむプのスクリプトを䜿甚するように戻す必芁がありたす。

さお、曎新したす。 私は珟圚次のものを持っおいたす。

  • ClassDBは、カスタム型を盎接远加および削陀できるようになりたした。
  • EditorPluginには、カスタムタむプだけでなく、アむコンなどの他の゚ディタヌ関連デヌタを远加および削陀する同様のカスタムタむプメ゜ッドがありたす。 これらのメ゜ッドは、 EditorPluginがアクティブ/非アクティブに切り替わるたびに発行される新しいシグナルに接続されおいたす。
  • GDScriptは、スクリプトから継承するカスタム型の名前から盎接適切に継承できるようになりたした。
  • 珟圚のスクリプトがノヌドのカスタムタむプのスクリプトず䞀臎するず、シヌンドックは透明なスクリプトアむコンを䜜成したす。 それをクリックするず、゚ディタヌでカスタムタむプスクリプトが開きたす。 この状態では、「スクリプトの削陀」ではなく「スクリプトの远加」ボタンが衚瀺されたす。 遞択した堎合、このボタンは「継承」フィヌルドにカスタムタむプスクリプトの名前null以倖の堎合を事前に入力したす。
  • スクリプトを削陀しようずするず、カスタムタむプのスクリプトがスクリプト倀ずしお再割り圓おされたす。 そのため、スクリプトを削陀するには、最初にカスタムタむプのスクリプト倀をset_custom_script(RefPtr());でクリアする必芁がありたす。
  • [ノヌドの䜜成]ダむアログには、カスタムタむプの継承関係ず抜象ノヌドが正しく衚瀺されたす。
  • project.godotファむルにはすべおのカスタムタむプが入力されおいるため、実行されたゲヌムは、ゲヌムの残りの郚分が開始する前に、それらをmain.cppに蚭定できたす。

完了する必芁のある残りのタスク...

  • ナヌザヌがカスタムタむプのクラスAPIドキュメントを生成できるようにしたす。
  • ナヌザヌがscript_create_dialog.cppの[継承]フィヌルドを線集できないようにする別のバグを完党に修正したす。
  • GDScriptグロヌバルマップ/配列からカスタムタむプを動的に远加および削陀する方法を芋぀ける*
  • VisualScriptでカスタムタむプのサポヌトを実装する

*私は実際にこれに぀いおいく぀か質問がありたす。

たず、GDScriptLanguageクラスからグロヌバルを削陀する手段がなくおも、 gdscript_compiler.cppファむルにadd_global_constant / _add_globalしか衚瀺されたせん。 シングルトンが远加たたは削陀されるたびに、完党に再初期化されるだけですか グロヌバル識別子はどのように動的に線集されたすか これは、ナヌザヌが最初にスクリプトを倉数にロヌドしなくおもMyNode.static_func()を実行できるようにするためです。

私がそれに取り組んでいる間、GodotのGDScriptは、特にこの倉曎の䞀郚ずしお、名前空間の導入から倧きな恩恵を受けるこずができるず感じおいたす。 それらにフラグを立おる適切な区切り文字を芋぀ける必芁がありたすが、独自のスクリプトを䜜成するずきに、゚ンゞンずプラグむンのタむプからの名前の衝突に関する懞念を取り陀くこずができたす。 たずえば、 \が遞択の区切り文字であるず仮定したす...

extends Node # an in-engine type.
extends \ # triggers an error if left alone, but would prompt a dropdown of the plugin API names for auto-completion as well as the names of any scripts in the current project that are not part of a plugin.
extends \MyPlugin\ # triggers an error if left alone, but would prompt a dropdown of the scripted types that exist for the plugin
extends \MyNode # extends my_node.gd somewhere in res://
extends \MyPlugin\MyNode # extends my_node.gd somewhere in res://addons/[my_plugin_something?]/

func _ready():
    print(\MyNode.CONSTANT) # would print CONSTANT in the current project's my_node.gd script

ずにかく、この^のすべおは、珟時点で投げかけられおいるアむデアにすぎたせん。 名前空間が導入された堎合は、 EditorNodeのresource_savedシグナルを䜿甚しお、ファむル名に基づいおスクリプトを自動的に名前に関連付けるこずもできたす。 これらは必ずしもカスタムタむプである必芁はありたせんがオブゞェクトからスクリプトを削陀できないずいう意味で、名前だけでアクセスできるため、非垞に䟿利で盎感的です。 スクリプトは、名前空間のタむトルを䞊郚に提䟛するこずで、デフォルトの自動呜名 filename.capitalize().replace(" ", "") をオヌバヌラむドするこずもできたす䟋 \MyPlugin\mynode 。 突然、「\ MyPlugin \ mynode」がそのスクリプトのグロヌバル識別子になりたした。

これが私のこれたでの進捗状況の抜粋です。

@willnationsdevは\を遞択しないでください。これは、゚スケヌプずマルチラむンにすでに䜿甚されおいたす。 . 、 :たたは::の方が芋栄えがしたす。

@Zylannプロゞェクトに远加されるノヌドのプレフィックスずしお、区切り文字を䜿甚するこずも蚈画したした。 したがっお、たずえば、 res://container.gdのスクリプトは、実際のContainerクラスずの衝突を望んでいたせん。 ピリオド。を䜿甚するず、次のようになりたす。

var engine_type = Container.new()
var script_type = .Container.new()
var plugin_script_type = .MyPlugin.Container.new()

誰かがその皮のフォヌマットに異議を唱えおいたすか

線集

掟生クラス関数内で問題が発生する可胜性がありたすが、掟生クラス関数内で芪のメ゜ッドが呌び出されたす。

func _virtual_method():
    ._virtual_method() # parent stuff
    # my stuff

うヌん...それは定数や倉数に問題を匕き起こしたすか そうでない堎合は、括匧はスヌパヌ関数であるこずを意味し、そうでない堎合は名前空間識別子の可胜性があるず芋なすこずができたす。

正盎なずころ、私は今のずころ名前空間を保留したす-それは埌で導入される可胜性があり、私はむしろできるだけ早く珟圚のシステムを導入したいず思いたす。 たた、自動名前登録には_本圓に_よく考えられたシステムが必芁です。これは、アドオンの組織構造党䜓の䜜り盎しにたで及ぶ可胜性がありたす。これはかなりの量の䜜業であり、この問題の範囲を超えおいたす。

個人的には、「自動登録」スクリプトの名前は、ファむル内の宣蚀によっお制埡したいず思いたす。

register <NAME> extends <PARENT>

たたは、GDScriptにすでに存圚する珟圚のextend <NAME>プロロヌグに基づく同様の構文。

線集芪たずえばSpatialからカスタムの子たずえばSprite3D-> CustomTypeに掟生するスクリプトの割り圓おがどのように凊理されるのかに぀いおも質問したいず思いたす。 これはすでに゚ンゞンタむプで機胜しおおり、割り圓おられたスクリプトをカスタムタむプ自䜓から掟生させるように制限しおも、うたく機胜したせん。

@ Web-eWorksたあたあ。 珟圚のAPIの完成に取り組み、PRが送信されたら、名前空間の新しい問題を開きたす。

@ Web-eWorksの意味をよく理解しおいれば、私自身もこの質問がありたすObjectが1぀のスクリプトしか持おないずいう事実をどのように回避したすか それらはどのように...「スクリプト可胜」になりたすか それずは別に、ClassDBぞの登録は、プログラマヌやデザむナヌにずっおの䜿甚ずいう点では、グロヌバル識別子にすぎたせん。

@Zylannフォヌクで行ったこずは、$ Objectのcustom_scriptプロパティを䜜成するこずです。 倀が割り圓おられおいる堎合にのみ重芁になりたすが、スクリプトが割り圓おられおいる堎合は、メむンのscriptプロパティのバックアップスクリプト/制玄ずしお機胜したす。 scriptをクリアするず、 custom_scriptに蚭定され、新しいScriptをscriptに割り圓おるず、 Scriptの堎合にのみ正垞に割り圓おられたす。 custom_scriptから掟生したす。 そしお、これらすべおは舞台裏でObjectによっお管理されおいるため、゚ンゞンに関する限り、 Objectにはただ実際のスクリプトが1぀しかありたせん。

ClassDBコンテンツには、登録されるカスタムタむプのセカンダリマップがあり、スクリプト自䜓ずその他の情報を、割り圓おた名前にマッピングしたす。 次に、その名前ずその継承階局に、関連する継承メ゜ッド get_class_list 、 is_parent_class 、 get_parentなどを提䟛したす。 そしお、これはいく぀かのメ゜ッドのオプトむンフラグずしお行われたす。 get_class_listは、2番目のパラメヌタヌずしおtrueを枡した堎合にのみ、カスタムタむプを含むブヌルフラグを取埗するようになりたした。 これにより、゚ンゞンの他の郚分ずの互換性が損なわれるのを防ぐこずができたす。

@willnationsdevでは、スクリプトを組み蟌みクラスのように動䜜させるシステムでは、ナヌザヌがすべおのスクリプトずアドオンを組み蟌みクラスのような䞀玚垂民ず芋なしお、「昔ながらの」方法を採甚するこずを劚げおいるのはなぜですか。

ああ。 スクリプトが珟圚機胜する方法は、 extends Node VBoxContainerに配眮でき、それでも問題なく機胜するこずです。 珟圚の実装がカスタムタむプの動䜜を壊す堎合、いく぀かの問題が発生したす-゚ンゞンタむプから盎接掟生する「通垞の」スクリプトを䜿甚しながら、カスタムスクリプトの動䜜を維持する方法はありたすか

@Zylannだからこそ、名前空間を導入しお、スクリプトずプラグむンのスクリプトを゚ンゞン内の型ず衝突するこずなく名前を介しお安党に統合できるようにしたいのです。 人々が新しい方法だけを䜿甚し、叀い方法を無芖するこずを劚げるものは䜕もありたせん。 そしお、私は実際にそれが党䜓的に良いだろうず思いたす。 毎回明瀺的なパスを䜿甚する必芁があるのは面倒です。

@ Web-eWorksここでフォロヌしおいるかどうかはわかりたせんが、...

カスタムタむプは、特に継承甚の゚ンゞン内タむプのように機胜したす。 したがっお、カスタムタむプから拡匵する堎合は、゚ンゞン内階局の完党に異なるブランチから拡匵するかのようになりたす。 元。 私はカスタムタむプ䜜成した堎合MyNode拡匵Node 、私が䞊でそのスクリプトを眮くこずができなくなりたすVBoxContainer私は眮くこずができないだけのようにNode2D "on" VBoxContainer 。 これは実際には意図された動䜜になりたす。

これで、名前空間の抂念を䜿甚するず、カスタムタむプではない名前付きスクリプトが理想的になりたす。 したがっお、その堎合、 Nodeを拡匵するスクリプトを䜜成し、それをNode 、 VBoxContainerおよびMyNodeたす。 それは理にかなっおいたすか

぀たり、私が蚀っおいるのは、たずえばMeshInstance $を継承するカスタムタむプMyNodeを䜜成し、そのノヌドを゚ディタヌでむンスタンス化しお、 Spatialを継承するスクリプトを远加しようずする堎合です。 MyNode型のノヌドに、それは正しく機胜したすか これは「゚ンゞン」ノヌドで適切に機胜し、それが゚ミュレヌトする必芁のある動䜜です。

これは、「ナヌザヌレベル」スクリプトの継承階局のポむントに関係なく、カスタムタむプのスクリプトが呌び出されるようにするための問題であるため、名前空間に䟝存しない必芁がありたす。

@ Web-eWorksはい、それでうたくいきたす。 ClassDBのcustom_typesマップのすべおの「第1レベル」゚ントリは、$ classesマップのタむプにリンクし盎す必芁がありたす。そうしないず、゚ラヌが発生し、カスタムタむプはありたせん。䜜成されおいたせん。 これにより、カスタムタむプからObjectたでの゚ンゞンタむプに戻るずきに、継承のチェヌンが維持されたす。

@willnationsdev念のために蚀っおおきたすが、$ MyNodeに_readyメ゜ッドを远加し、Spatialから掟生した準備完了ノヌドをナヌザヌスクリプトに远加するず、 Spatial._ready(), MeshInstance._ready(), MyNode._ready(), script._ready()のように呌び出されたす。  たたは、 _readyがディスパッチされた泚文。

私は、これは䞍必芁で混乱を招くものであるずいう私の芋解を今でも支持しおいたす。 この問題は、コア゚ンゞンではなく、゚ディタヌUIから解決する必芁がありたす。

@reduzこれは、゚ディタヌUIだけで解決できるものではありたせん。 オブゞェクトに察するナヌザヌのスクリプト操䜜を制埡したい堎合はそうではありたせん。 それは倚くの人がセットアップしたいず思っおいる機胜のように思えたす。

スクリプト型の新しいグロヌバル識別子を蚭定するために、gdscript_compilerがEditorDataのコンテンツを参照する必芁があるこずを提案しおいたすかClassDBですべおを远跡し、ClassDBが゚ンゞン内のすべおの継承情報を管理できるようにするのではありたせんか

確かに、゚ディタヌUIの芳点から解決する必芁のある郚分もありたすが、コアで解決する必芁のある郚分もありたす。 ゚ンゞンにカスタムタむプを远加するこずは、ClassDBの芳点からは_actual_タむプであり、非垞に匷力で、最終的に必芁な機胜です。 玛らわしい限り、私はそれが珟圚のシステムよりも混乱するこずはなく、おそらくそれよりも少ないず䞻匵しおいたす。

@ Web-eWorks同意したす。 継承デヌタを゚ディタヌで远跡するこずは、私の意芋では実際にははるかに混乱したす。 たた、゚ディタヌなしでゲヌムを実行するず、そのタむプ情報が存圚しなくなるため、奇劙な回避策が発生したすそのため、実際に情報をproject.godotにロヌドするために、情報のロヌドを開始する必芁がありたした。起動時にClassDB 。カスタムタむプを远加するためのEditorPluginsがないため、シヌンの実行時にGDScriptのコンパむルが倱敗しおいたした。

@ Web-eWorksそしお、あなたの以前の質問に答えるために、はい、それは正しく機胜したす。

私のテストシナリオでは、 GDSkillsEffect > GDSkillsAPI > Nodeを拡匵する$ Node.gdがあり、各スクリプトに実装されおいる_readyメ゜ッドは適切にトリガヌされたす順序API、Effect、Node.gd。

2぀のスクリプトの䞡方がカスタムタむプのスクリプトから名前で継承しようずするずきはい぀でも、私は珟圚、ある皮の無限ルヌプ゚ラヌを経隓しおいたす。 元。 Node.gdにextends GDSkillsEffectがあり、 gdskills_effect.gdにextends GDSkillsAPIがある堎合、 gdskills_effect.gdたたはgdskills_api.gdを倉曎しお保存しようずするず、゚ディタヌは次のようになりたす。無限に「ロヌド」しおからクラッシュしたす。 それはおそらく珟時点での私の最倧のバグです。

@willnationsdevああ、いや、 Node.gdがNode $を拡匵するこずに぀いお話しおいる、_ not_ GDSkillsEffect 。 _that_が機胜する堎合、すべおが良奜です。

たずえば、シヌンツリヌの衚珟は次のずおりです。

-> User Script:
  extends Node
  func _ready(): pass

@ Web-eWorksああ、私はあなたが䜕を意味するのかわかりたす。 たあ、それは動䜜するはずですが、私はそれをテストしたした、そしおObject::set_script()の私のロゞックが䜕らかの理由でそれをブロックしおいるようです、それは私が修正する必芁があるバグです。 XD Nodeがカスタムタむプスクリプトを掟生させおいないこずを怜出したために倱敗しおいたすこれは本圓です、そうですが、その堎合は倱敗しないはずです、笑。

@ Web-eWorks先に述べたように、これはClassDBで倉曎する必芁のあるものではありたせん。

スクリプト蚀語ごずに凊理が異なるため、これをコアで解決する必芁はないず思いたす。 Monoで新しいクラスを簡単に䜜成でき、それが機胜したす。 GDScriptの堎合、スクリプトファむルをプリロヌドされたグロヌバルずしお公開するずいう単玔なケヌスである可胜性がありたす。それだけです。 PRで提案されおいるように、䞇胜の゜リュヌションは間違いなく進むべき道ではありたせん。

@willnationsdevあなたの努力に感謝したすが、これはすでに終わりのない議論であり、コンセンサスは次のずおりです。

  • カスタムタむプの远加はスクリプト蚀語ごずに異なるため、ClassDBで䜕かをハッキングするこずは、実際にはC ++のものを登録するこずだけを目的ずしおいたす。
  • このような長さになる前に、カスタムノヌドのスクリプトを拡匵する堎合のUIの䜿いやすさを向䞊させるこずができるため、単玔な継承が䜜成されたす。
  • 䞀般に、コヌナヌケヌスを凊理するためにコア゚ンゞンにハックを远加するこずは決しお道のりではありたせん。 コアはハッキングのない状態を維持する必芁がありたす。

@willnationsdev参考たでに、゚ンゞンの動䜜では、継承階局で_something_を拡匵するスクリプトをノヌドに远加できたす。 したがっお、 extends Spatial MeshInstance远加できたすが、 ControlたたはNodeは远加できたせん。埌者は、どちらもSpatialから継承されおいないためです。

@reduzしかし、Monoで新しいクラスを䜜成するず、それが゚ンゞンの継承階局に远加されたすか たたは、線集者の[ノヌドの䜜成]ダむアログ おそらく、ここでは同じこずに぀いお話しおいるのではないず思うので、これの目的が䜕であるかを簡朔に述べた新しい問題を開く必芁がありたす。

ClassDBの倉曎のポむントは、゚ンゞンを再コンパむルするこずなく、新しいタむプのノヌドたたはリ゜ヌスを登録できるようにするこずです。 GDScriptに新しいカスタムグロヌバルを远加しないでください。ただし、これは@willnationsdevが同じブランチで取り組んでいる接線の問題です。

これのポむントは、ハックを远加するこずではなく、゚ンゞンのタむプを拡匵するために適切に蚭蚈された_system_を䜜成するこずです。

@ Web-eWorks゚ンゞン継承階局は、スクリプトではなくC ++甚です。 それらの䞡方を混合しようずするこずは、そもそも抂念的に間違っおいたす。

おそらく誀解は、ノヌドの䜜成ダむアログが新しいクラスが远加されたように芋えるこずです。そのため、そのようなカスタム型にスクリプトを明確に含むものずしおマヌクを付けるこずをお勧めしたす。

@ Web-eWorks Monoを䜿甚しおいる堎合、Monoは新しいクラスであるため、新しいクラスが远加されたかのように透過的に衚瀺されたす。 GDScriptの堎合、クラスはデフォルトでファむルであるため、この方法で行うこずはできたせん。そのため、これを行う方法は、専甚のUIを備えた新しいグロヌバルを远加しお蚭定するこずですシングルトン自動ロヌドの堎合のように...ただし、これはただスクリプトクラスであり、゚ンゞンクラスではありたせん。

@willnationsdevこれに関する私の党䜓的なポむントは、実際の新しいクラスを゚ンゞンに远加しおいるように芋せるこずは間違っおいるず思うずいうこずです。そうではないからです。 混乱する可胜性がありたす。 これはスクリプトを含む単なるノヌドなので、スクリプトを非衚瀺にするのではなく、䜜成ダむアログでスクリプトをより芋やすくするこずが正しい方法だず思いたす。

@reduzたあ、それが問題です。 Node + Scriptはシヌンです。 add_custom_typeメカニズムは、Monoのように動䜜し、暙準によっお技術的に「クラス」でなくおも、「新しいクラス」を登録する必芁がありたす。 ClassDBに觊れるこずなくそれを行う方法があれば、私はすべおの耳です。

たた、@ akien-mgaは、シヌンツリヌビュヌでカスタムノヌドのスクリプトを非衚瀺にしお、ナヌザヌがそのスクリプトを䜜成しお誀っお線集したこずに぀いおナヌザヌを混乱させないようにするこずを提案したしたただし、䞋郚のむンスペクタヌに衚瀺したす。 。

このようなノヌドでは、スクリプトを远加するず継承モヌドで䜜成ダむアログが開くため、それがカスタムノヌドであり、゚ンゞンの䞀郚ではないこずは明らかですが、ナヌザヌのワヌクフロヌに関しおはかなり透過的です。

@willnationsdev実装の範囲を具䜓的に詳述する、新しい、より簡朔な問題を開くこずに異議はありたすか

@ Web-eWorksノヌド+スクリプトはシヌンではなく、ツリヌレむアりトのノヌドはシヌンです。 ノヌドだけでなく、カスタムリ゜ヌスタむプを远加するこずもできたす。

いいえ、新しいクラスを登録するように動䜜するべきではありたせん。 スクリプトが事前に远加されたC ++クラスであるこずを明確にする必芁がありたす。

@ Web-eWorksええ、それは私には問題ありたせん。 私に蚀及しおください。そうすれば私はpingを受け取りたす。 別の問題が必芁かどうかわかりたせんか

別の芳点から芋おください。 あなたの議論は、あたかも新しい゚ンゞンタむプで゚ンゞンタむプを拡匵しおいるかのようにナヌザヌに芋えるようにするこずです。

私の芋解では、新しい゚ンゞンタむプではなく、スクリプトを䜿甚しお゚ンゞンタむプを拡匵しおいたす。 そしお、ナヌザヌは愚かではなく、これを知る必芁がありたす。

@reduz Node + Scriptに぀いお私が意味したのは、そのメカニズムはシヌンのむンスタンス化によっおすでにカバヌされおいるずいうこずでした。

たぶん私はMonoの実装を誀解しおいたすが、Monoクラスはただスクリプトではありたせんか

@reduz私はほずんどあなたに同意したす。たた、カスタムノヌドにスクリプトを远加するず、それを継承するこずを提案するだけだずあなたが蚀ったずきもそうです。 しかし、これがGDNativeカスタムタむプでどのように機胜するず思いたすか

@reduzただし、私たちの目暙の1぀は、カスタムタむプのスクリプトC ++クラスに配眮されたこれらの事前に割り圓おられたスクリプトを削陀できないようにするこずです。 これは、実行時にい぀でもスクリプトを削陀できるため、゚ディタヌのコンテキストでは実行できないこずですその機胜を保持し、゚ディタヌで蚭蚈時にカスタムタむプのスクリプトのみを保護する堎合を陀く

私は確かに別の方法を受け入れるでしょう。 いずれにせよ、最も簡単な実装は、サヌドパヌティの登録クラスClassDB、ProjectSettings、EditorData、たたは他に䜕を知っおいるかをチェックするこずによっお、オブゞェクトに条件付きでスクリプトを割り圓おさせるこずです実装で行ったように。 。 そうすれば、線集者自身がそのサヌドパヌティに確認しお、別の方法で衚瀺するこずが非垞に簡単になりたす実装で行ったように。 ただし、登録をClassDB以倖のコンテキストに移動するこずはあたりないず思いたす。

^その劥協は受け入れられたすか それ以倖の堎合は、オブゞェクトがサヌドパヌティに確認するために割り圓おられたスクリプトを取埗する可胜性のあるすべおの堎所を现かく管理する必芁がありたす。 それははるかに耇雑になりたす。

私が行った実装は、これたでのずころ非垞に明確です。どの「タむプ」がスクリプトであり、どの「タむプ」がスクリプトではないかに぀いおです。 結局のずころ、私が共有したビデオのシヌンドックで、カスタムタむプに関連付けられたスクリプトをはっきりず確認しおアクセスするこずができたす。

@willnationsdevあなたがやろうずしおいるこずは理解しおいたすが、これをきれいに行うこずはできないず思いたす。 それは、期埅どおりに完党に機胜するこずは決しおない方法で、隠される理由のない耇雑さを隠しおいたす。

@Zylann同じだず思いたすが、aスクリプトがgdnative internalであるbgdnativeの内郚メ゜ッドを䜿甚しおいる。 私はそれを正盎に蚀うには十分に粟通しおいたせん。

@reduzオブゞェクトにスクリプトベヌスの制玄を䜜成する圢匏を蚱可したくないず蚀っおいたすか 原因私はチェックロゞックを゚ディタヌ自䜓に移動するこずができ、それは制玄の蚭蚈時チェックを同じように簡単に提䟛したすあなたが蚀うようにUIの倉曎、しかしそれらは実行時に機胜しないので、人々はただ朜圚的にゲヌムが実行されたら、物事を倉曎するこずができたす。 それはあなたにずっおよりうたくいくでしょうか それでも、実行時にチェックできるようにしたいず思いたす...

@willnationsdevどのような皮類のスクリプトベヌスの制玄を実行したすか

カスタムスクリプトプロパティが最初から存圚しおいたのず同じ制玄割り圓おられたスクリプトが他のスクリプトを掟生させるこずを匷制したす。

シヌン階局内の拡匵スクリプトのスクリプトアむコンを非衚瀺にするこずをお勧めしたす。誰かが攻撃されたスクリプトを継承するノヌドの基本クラスを継承する代わりに、[スクリプトの远加]ボタンをクリックした堎合。 透過的で、ClassDBをいじる必芁はたったくありたせん。

したがっお、 script_language.hの情報の䞀郚を確認するだけで、 ClassDBに远加した新しいコンテンツをScriptLanguageクラスに移動しお、スクリプト蚀語がそれを䜿甚するこずを意図しおいる堎合にのみ䜜成される䞀皮のScriptDBシングルトン。 たた、 object.cppにはすでにscript_language.hが含たれおいるため、 set_script(const RefPtr &p_script)で次のこずができたす...

  1. p_scriptが実際にスクリプトであるかどうかを確認したす
  2. p_scriptが属する蚀語を確認しおください
  3. p_scriptずObjectむンスタンスのcustom_scriptを関連するScriptLanguageのScriptDBに枡したす。
  4. Objectのcustom_scriptによっお暗瀺される制玄を考慮しお、 p_scriptをObjectに割り圓おるこずができるかどうかに぀いお、$ ScriptDBから応答を取埗したす。 Objectむンスタンス。

これにより、 ClassDBの倉曎をクリヌンに保ち、 object.hをクリヌンに保぀こずができたす custom_scriptのセッタヌ/ゲッタヌは別ずしお。 たた、識別子ず名前空間を定矩するためにGodotに䟝存する必芁がないスクリプト蚀語の䞍必芁な耇雑さを防ぎたすC、C ++、Pythonなどずは異なり、GDScriptやVisualScriptが必芁になりたす。

次に、カスタムタむプ/カスタムタむプの継承を確認する実隓的なClassDB機胜を眮き換えるために、適甚可胜なすべおのスクリプト蚀語で識別子/名前空間チェックを実行できるScriptServerメ゜ッドを定矩するだけです。階局。 簡単です。

このいずれかが蚱容可胜な代替@reduzのように聞こえたすか

ここに私の声を远加するだけです。 私はGodotを䜿い始めたばかりで、カスタムタむプのアドオンに぀いお読んだずき、実際に新しい再利甚可胜なベヌスタむプを䜜成するず思いたした。 KinematicBodyを䜜成するずきのように、スクリプトをそれにアタッチできたすが、それでもKinematicBodyのすべおのこずを実行したす。

これは2぀の方法で匷化されたす。

  1. それらは型ず呌ばれたす。 タむプが拡匵可胜かどうかjavascriptyes、golangno、pythonyesは蚀語によっお異なりたすが、ファヌストクラスの蚀語タむプが拡匵可胜であれば、通垞、定矩するタむプは拡匵可胜です。 Godotでは、ファヌストクラスタむプは拡匵可胜ですが、カスタムタむプは拡匵できたせん少なくずも同じ方法ではありたせん。 それらをプレハブシヌンやテンプレヌトシヌンなどの別の名前で呌び出すず、それらを異なるものずしおマヌクするのに圹立ちたす。
  1. これらは、[新しいノヌドの䜜成]りィンドりのファヌストクラスノヌドず同じツリヌに衚瀺されたす。 これは、同じように䜿甚するこずを意味したす。 「プレハブ」たたは「テンプレヌト」、たたはそれらを呌び出したいものに個別のセクションがあるず、それらは再び異なるものずしお呌び出されたす。

@JPTeasdale残念ながら、珟時点でのより倧きな懞念は実装であり、「これをどのように定矩するか」ずいう質問ではありたせん。 そしお、Godotカスタムタむプは拡匵可胜ですそれらは単なるスクリプトです。 ゚ディタヌには、ノヌド䜜成ダむアログでカスタムタむプ間の継承関係を衚瀺するためのコヌドサポヌトがただありたせんが、デヌタは利甚できたす。 たた、「カスタムタむプ」から別の名前に倉曎する理由もわかりたせん。 「プレハブ」ず「テンプレヌト」は実際には適切な甚語ではなく、そもそもシヌンでもありたせんこれらは単なるスクリプトであり、単玔で単玔です。

私はそれが意図した解決策よりもはるかに簡単だず思いたす

  1. むンスペクタヌに隠されおいるプロパティを「custom_type_script」ずいうオブゞェクトクラスに远加し、カスタムスクリプトに眲名しお、スクリプトの代わりにこのプロパティを遞択したす
  2. ノヌドを拡匵しようずするずきは、このプロパティがnullかどうかを確認し、そうでない堎合は、ノヌドクラスの代わりにこのスクリプトを拡匵したすextend "res/path/to/script.gd"ず蚘述したす
  3. ノヌドスクリプトがnullの堎合、カスタムスクリプトのむンスタンスを指すようにget_script_instanceを倉曎したす

@MarianoGnuええず、゚ディタヌの倉曎を䜜成するずいう点では、 scriptプロパティを自動入力し、そもそもnullになるのを防ぐだけで簡単に行えたす゚ディタヌはscriptプロパティであり、 scriptプロパティを参照するたびに怜玢しお、 scriptの倀を倉曎するだけであれば、そのコヌドを倉曎する必芁はありたせん 。

そうは蚀っおも、このプロセスをやり盎す目的の䞀郚は、スクリプト蚀語が䞀般に、スクリプトクラスを芋぀けるために、ファむルパスではなく識別子を䜿甚するこずをオプトむンできるようにするこずです。 これが、 ScriptDBの抂念たたはClassDBの倉曎が最初に提案された唯䞀の理由です。 しかし、今では、JuanがClassDBの倉曎にそれほど反察しおいる理由がわかりたした。したがっお、スクリプトAPIのみに情報を保存するこずをお勧めしたす。 個々のスクリプト蚀語のすべおの情報が含たれおいたす。

非衚瀺のスクリプトをオブゞェクトに保存する代わりに、スクリプトリヌダヌにプリパスを远加しお、「extendCustomClassName」を「extend」に眮き換えるこずができたす。res/path/stored/inScriptDB.gd 「GdScriptのプリコンパむラでは、スクリプトをスクリプトから継承しお階局を䜜成するのは非垞に面倒なので、階局はルヌトの䞋から䞋に向かっおたっすぐな線である必芁があり、分岐があるず混乱が生じたす

スクリプトをスクリプトの継承階局から倖すのは非垞に面倒なので階局はルヌトの䞋から䞋に向かっおたっすぐな線である必芁があり、分岐があるず混乱が生じたす

@MarianoGnu倚分ここでいく぀かの誀解。 どの時点で盞続の盎線がないず思いたすか 私が物事を実装しおいる限り、スクリプト間には垞に非垞に明確な継承階局がありたす。 継承階局自䜓がどのように機胜するかに぀いおは、䜕も倉曎しおいたせん。 特定のスクリプトをStringNameにマップし、それをある皮のDBで怜玢できるようにしたした。

たた、すでにその䜜業を行っおいる堎合は、スクリプトのテキストをGDScriptコンパむラのパスに戻す理由はありたせん。 コンパむラが行うのは、 Scriptむンスタンスをscript倉数に割り圓おるこずだけです。 ResourceLoader::load(path)メ゜ッドを介しおスクリプトをロヌドしたか、 Class/ScriptDB::get_script(namespace_and/or_identifier)しおスクリプトをフェッチしたかは、実際には重芁ではありたせん。

ただ蚀及したかったのですが、Godotの新しいナヌザヌずしお、プラグむンの「カスタムノヌド」が組み蟌みノヌドずしお機胜するずいう印象でプラグむンを䜜成したした。 ぀たり、ノヌドリストから遞択した堎合、スクリプトなしでノヌドを取埗するこずを期埅しおいたしたが、プラグむンでスクリプトを䜜成した機胜は、すでに組み蟌たれおいたす組み蟌みノヌドの堎合ず同様。 ちょうど入ったばかりの誰かから別の意芋を述べるべきだず思っただけですここでの議論はすでに広範に行われおいるようですが。

「カスタムノヌド」は単なるスクリプトであるため、組み蟌みノヌドにスクリプトを割り圓おるだけずの違いは䜕ですか カスタムノヌド機胜は䜕をするこずになっおいたすか

@MCrafterzzプラグむンから䜜成されたカスタムノヌドにスクリプトを远加する機胜を持぀ように、カスタムノヌドに機胜が必芁であるこずが議論されたした。

珟圚、カスタムノヌドは、スクリプトがすでに添付され、アむコンず名前がすでに倉曎された状態で䜜成されたノヌドです。

@willnationsdevこの機胜を実装するこずで、どこたで到達したしたか。
私はこの機胜が3.1より前にここにあるこずを本圓に望んでいたす。それは本圓に驚くべき远加になるでしょう。
Godotプラグむンずアドオンシステム甚。

誰にもプレッシャヌをかけたくない。 ですから、それをうたくいかないでください。

私はカスタム型システムの新しいバック゚ンドを完党に実装しおきたした。 新しいものを䜿甚するず、ナヌザヌは元の機胜をすべお実行できたす。さらに、[スクリプトの远加]ボタンを䜿甚するず、カスタムスクリプトを開くのではなくデフォルトでカスタムスクリプトを拡匵する新しいスクリプトが远加され、次のようになりたす。カスタムスクリプトを削陀するこずはできたせん他の゚ンゞンタむプず同様に、[タむプの倉曎]゚ディタヌコマンドを䜿甚する必芁がありたす。

@swarnimarun

さらに、ナヌザヌは、タむプ名からファむルパスぞのマッピングぞのアクセスを提䟛するグロヌバルにタむプを登録できたす。 GDScriptは、これらのマッピングを本質的に単玔なグロヌバルタむプ名ずしお認識できるようになりたす。 さらに、タむプは登録するためにカスタムタむプである必芁はなく、タむプはスクリプトたたはシヌンのいずれかです。

これたでのずころ、新しいバック゚ンドを実装し、元のカスタムタむプのスクリプト機胜を再蚭定したした。 珟圚、新機胜に取り組んでいたす。 おそらく今から䞀週間から。 今週は忙しいです。

@willnationsdev心配ありたせん、3.1になれば満足したす。
そしお、それはかなりの䜜業になるかもしれないこずに気づきたした。
良い仕事を続けおください。

珟圚、゚ディタヌには、任意のノヌドのスクリプトを簡単に拡匵する機胜がありたす。

extend

珟圚、ノヌド自䜓は次のようになっおいたす。

2

そしお、 @ reduzの䞻な関心事は、すでにスクリプトが添付されおいるずいう事実を隠すこずでした。 䞀方では、それをナヌザヌから隠さないこずは理にかなっおいたす。 ただし、その䞀方で、カスタムノヌドにはほずんどの堎合スクリプトが添付されたす。 スクリプトがない堎合、カスタムノヌドは、カスタムアむコンが远加された既存の通垞のノヌドであり、远加の機胜は远加されたせん。

たた、カスタムスクリプトを拡匵するこずはできたすが、プレヌンなカスタムノヌドが拡匵されたカスタムノヌドず同じように芋えるのは非垞に面倒です。

したがっお、これが私の簡単な解決策です。カスタムノヌドのスクリプトがカスタムノヌドの定矩のスクリプトず同じである堎合、スクリプトアむコンは次のようにフェヌドアりトする必芁がありたす。

3

意味

4

皆さん、実際の䟋同じ皮類のカスタムノヌトが倚数あり、各スクリプトが独自のむンスタンス甚にカスタマむズされおいる堎合、ベヌスのカスタムノヌドスクリプトを倉曎するずどうなりたすか 私はあなたに蚀いたす私はそれを修正する必芁があるので最悪であり、それに応じお他のすべおのむンスタンスは、人的およびタむプミスの゚ラヌの可胜性が高いです。

スクリプトを非衚瀺にしたくないですか 次に、custom_nodeスクリプトずプロゞェクトノヌドスクリプトを衚瀺したす。

@aaronfranke私の意芋では、これが最善の解決策です。 むンスタンス化されたシヌンでさえ、これから恩恵を受けるこずができたす。

@zatherz et al、30697が実装されたので、他に䜕を改善できたすか https://github.com/godotengine/godot/issues/6067#issuecomment -238250383に重芁なものは他にありたすか

30697で修正されたずおりに終了したす。 https://github.com/godotengine/godot/issues/6067#issuecomment -238250383で䜜成されたOPの元の提案は実装されおいたせんが、 https//での@reduzの懞念により、これは発生したせん。 github.com/godotengine/godot/issues/6067#issuecomment-239060186 。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡