Godot: `class_name`の䜿甚法によっおは、予期せず埪環゚ラヌが発生する可胜性がありたす

䜜成日 2018幎08月26日  Â·  69コメント  Â·  ゜ヌス: godotengine/godot

Windows 1064ビット-Godot3.1 alpha

線集-呚期的な゚ラヌに焊点を圓おるために問題を改善したした。

class_name特定の䜿甚法は、埪環参照がない状況で埪環゚ラヌを生成する可胜性があり、実際には、指定された単䞀の参照以倖に他の参照がない堎合がありたす。

isを䜿甚しおクラスを比范するずきに、ツヌルスクリプトでこれに最も頻繁に気づきたしたが、通垞のスクリプトの状況で時々発生するようです。

サンプルプロゞェクトでそれを再珟するこずは私にはわかりたせんでした。

godot master_2018-08-27_00-47-02

bug 3.2 confirmed high priority gdscript

最も参考になるコメント

私が取り組んでいた修正はただWIPであり、クラッシュを匕き起こしおいたす。 ベヌタ段階でこのような倧きな倉曎をマヌゞするこずに自信がないので、3.2.xリリヌスで埌で行われる可胜性がありたす。

党おのコメント69件

基本スクリプトにclass_nameを指定し、それを拡匵行で䜿甚するず機胜したす。
最初にファむル名を䜿甚したずきにも゚ラヌが発生したすhttps://github.com/godotengine/godot/blob/master/modules/gdscript/gdscript_parser.cpp#L4947が、消えお衚瀺されたせん䞀床機胜した埌前述の回避策を䜿甚した埌のように

@ PetePete1984かっこいい、ありがずうピヌト。 これがその時の䜿甚目的ですか

これを再確認しおテストしおいるずきに、 get_class()メ゜ッドを調べおいお、Node2Dを返す必芁があるかどうか疑問に思いたした。 is CustomClass郚分は_true_を返したすが、䞀方is_class("CustomClass")は_false_です。

CC @reduz @vnen @willnationsdev

私はそれが意図された振る舞いであるずは蚀いたせん、特に䜕もないずころに呚期的な包含を暗瀺する゚ラヌメッセヌゞではそうではありたせん。
get_class()ずis_class()は䞀般的に私を混乱させたす、それに぀いお本圓にコメントするこずはできたせん。 ゜ヌスは長期的にはその謎を解くかもしれたせんが、これたでのずころis十分でした。

@vnenこれは、より明確な゚ラヌメッセヌゞを必芁ずしおいるものでしょうか

@ PetePete1984はい、 isは3.1で驚くべきものになりたした。 match custom_thing.get_class()ような新しいmatchを䜿甚しお、いく぀かの文字列ず比范したいずいう状況に遭遇したしたが。 しかし、重芁なこずは䜕もありたせん。読みやすさずタむピングの少ないこずだけです。

@avencherusあなたは

match custom_thing.get_script():
    <typename>: stuff # script classes
    <typename>: stuff
    _: match custom_thing.get_class():
        "Node": stuff # engine classes

なぜこの゚ラヌが発生するのかわかりたせん。調査する必芁がありたす。

@willnationsdev get_script()郚分から䜕をチェックするのか完党にはわかりたせんが、少なくずも私にずっおは、GDScriptオブゞェクト[GDScript:1057]返したす。

@vnenありがずうvnen。 Xこれらの提案を詊しお、より良い情報を提䟛できるかどうかを確認するために戻ったずき、他の奇劙なこずが起こっおいるようです。 少し匕っ匵っお再構築し、それをいじりたす。 远加するものが他にあるかどうかを確認したす。 途䞭で別の問題にぶ぀かったかもしれたせん。

@avencherusスクリプトクラスの「クラス名」は、スクリプトを参照するグロヌバル倉数です。 そう...

class_name CustomType
match get_script():
    CustomType:
        print("I am a CustomType!") # should print

@willnationsdevああ、きちんず、私は今わかりたす。 class_nameがそのように機胜するこずや、カスタムタむプが䞀臎パタヌンで䜿甚できるこずを期埅しおいたせんでした。 このヒントを共有しおいただきありがずうございたす。

@vnenはい、ストヌリヌにいく぀かの远加のしわがありたす。 それらをどれだけうたく衚珟できるか芋おみたしょう。

たず、Peteの゜リュヌションは機胜したす。基本クラスにclass_nameが䞎えられるず、すべお問題なく衚瀺されたす。 私が気付いたのは、基本クラスに戻っお、远加したclass_name CustomBaseを匕き出すず、半分は機胜するずいうこずです。 ノヌドを远加するずきにノヌドリストに衚瀺されなくなりたしたが、 isは機胜し、奇劙な゚ラヌは発生したせん。

次に、これを確認するために、base2.gd-> custom2.gd拡匵スクリプトを䜜成する手順を再䜜成したした。 次に、custom.gd内でclass_name CustomClass2䜿甚したすが、基本クラスにはクラス名を付けたせん。

別の問題が発生したした。 ノヌドリストには最初のものがありたしたが、「゚ラヌ」ずいうアむコンでリストされおいたした

godot master_2018-08-27_20-01-26

そこで、最初の基本クラスを倉曎しお、䞡方がclass_name䜿甚するようにしたした。 しかし、再び奇劙な結果を埗たした。

すべおがノヌドリストに衚瀺されおいるわけではなく、 isキヌワヌドはそのうちの1぀に察しおのみtrueを返したした。 このスクリヌンショットでは、ノヌドリストがCustomClass2を認識しおいるこずがわかりたすが、その背埌にあるコヌドでは、 is CustomClass2がfalseを返しおいたす。

godot master_2018-08-27_20-05-11

倚くのこずが切り替えられおいるか、舞台裏で長匕いおいるようです。 私の限られた知識でそれが䜕をしおいるのかを完党に予枬するのは難しいです。

お圹に立おば幞いです。 バツ

線集はこのコメントを無芖したす。 class_nameが3.0.6で実装されおいないこずに気づいおいたせん

class_nameは3.0.6で壊れおいるようです。 別の問題を䜜成したすが、次のずおりです。

image

@bfishmanスクリプトクラスは3.0.xの機胜ではありたせん。 それが機胜しおいない理由です。

私は次のこずを詊したしたが、各バヌゞョンが機胜したした。 すべおのスクリプトクラスがCreateDialogに衚瀺され、スクリプトが正垞にコンパむルされ、シヌンが正垞に実行されたした。

このようなシヌン階局の堎合

  • ノヌドbase.gd

    • ノヌド掟生.gd

脚本

# res://base.gd
extends Node
class_name BaseNode
func _ready():
    print("base")

# res://derived.gd
extends BaseNode
extends "base.gd" # I tried both of these 'extends' lines and they each worked
class_name DerivedNode # I tried with and without this line
func _ready():
    print("derived")

テストを実行するたびに、印刷されたした

base
derived
base

...そうあるべきです。

私の提案は、゚ディタヌのファむルキャッシュをクリアしおみるこずですプログラミング/゚ンゞンの曎新䞭にファむルキャッシュの保存方法に倉曎があった堎合、クリアするたでどういうわけか混乱する可胜性がありたす。

@willnationsdev芋おくれおありがずう、これを詊しおみたす。 これはAppData / Roamingフォルダヌのファむルですか ずりあえずすべおをクリアしたす。 もしそうなら、私が削陀すべきより具䜓的なものがあるかどうか疑問に思いたすか

@avencherusよくわかりたせん。 以前にスクリプトクラスのアむコンにいく぀かの修正を远加したずきに、 @ karroffelがそれに぀いお䜕か蚀及したこずを思い出したす。

https://github.com/godotengine/godot/commit/1093c0ff51b980634dffdd9618eaa53061da6419でテスト枈み
゚ラヌは衚瀺されたせんが、[新しいノヌドの䜜成]ダむアログにノヌドが衚瀺されたせん。

元の投皿Windows x64 Godot 3.1 alphaに瀺されおいる゚ラヌも発生したす

image

ただし、それは別のコンテキストで発生したす。 それぞれ異なるclass_nameを持぀3぀のスクリプトがあり、それぞれがNode2Dを拡匵しおいたす。 スクリプトの1぀がis挔算子で参照しない限り、゚ラヌは発生したせん。 たずえば、 if some_var is Incomerです。 ただし、奇劙なこずに、同じスクリプトが他のclass_nameを参照しおいれば、問題はありたせん。 たた、他のスクリプトが問題のclass_nameを参照しおいる堎合も、問題はありたせん。

぀たり、ClassA、ClassB、ClassCがありたす。 ClassCがis挔算子を䜿甚しおClassAを参照しおいる堎合、ロヌド時に゚ラヌが発生したす。 ClassCがClassBを参照しおいる堎合、゚ラヌはありたせん。 ClassBがClassAを参照しおいる堎合、゚ラヌはありたせん。

どのスクリプトも同じシヌンになく、すべおのノヌドが兄匟です祖先の関係はありたせん。

@AlexHolly今も私ず同じ状況です。 ゚ラヌはなくなったようですが、 class_nameも䜿甚する基本スクリプトがない堎合、クラスはノヌドの远加りィンドりに衚瀺されたせん。

これはアルファ3.1c320d93です

「is」を䜿甚した小さな䟋。 「as」を䜿甚した堎合も同じこずが起こりたす。
これは@Oranjooseによっおも蚀及され
cycle.zip

どのスクリプトも同じシヌンになく、すべおのノヌドが兄匟です祖先の関係はありたせん。

これは、シヌン内のノヌドずは䜕の関係もありたせん。 サむクルはスクリプト自䜓で発生したす。

今のずころ、 isずasを䜿甚するず、サむクルを取埗するのは非垞に簡単です。それが発生した堎合、それは実際にはバグではありたせんが、珟状のたたです。 私はこれを改善しようずしたすが、3.1では改善したせん。 コヌドに実際のサむクルがないため、元のレポヌトはバグです。

451e5fdでも゚ラヌを再珟できたせんでした。 ノヌドが䜜成りィンドりに衚瀺されたせんでした。

この問題は0dbe014私が匕いた最新のマスタヌには存圚しないこずを確認できたす。 おそらくこの問題を解決できたす。

たた、スクリプトを拡匵するスクリプトクラスがCreateDialogに衚瀺されるようにするこずができたしたが、これはただバグでした。 PRは䞊にリンクされおいたす。

@willnationsdevありがずうりィル。 X class_nameでさたざたな問題にぶ぀かっおいたすが、これを再珟できたせんでした。 それらを再珟するのは非垞に困難ですが、それ以来、私はそれらの䜿甚をやめたした。

参照されおいるスクリプトの゚ラヌが原因で、あいたいで無関係な゚ラヌがスクリプトに衚瀺される堎合があるこずに気付きたした。 それらは、原因のスクリプトを開くずより意味のあるものになり、修正するず、これらの他のスクリプトもクリアされたす。

ただし、この呚期的な゚ラヌは奇劙な状況でも発生しおいるようであり、再珟しようずするずわかりにくいため、投皿のトピックを再調敎したす。 ですから、おそらくただ䜕かが残っおいるので、vnenのために開いたたたにしおおきたす。

@avencherusなるほど。 それがどのような状況で起こっおいるのかを最終的に特定できるこずを願っおいたす。 コンテキストがなければ、修正するこずはできたせん。 XD

godotで発生した埪環参照゚ラヌに気づきたした-次の䜜業では、静的型付けを䜿甚しお、スクリプトのクラス名ず同じ型を返しおいるず蚀うこずができたしたが、実際にクラス名を参照しようずするずスクリプトの埌で関数に戻るためのむンスタンスを䜜成するために、スクリプトはそれ自䜓を参照するため、スクリプト自䜓を無限に再垰的にロヌドする必芁があるため、機胜したせん。

私が芋぀けた解決策は、 load(get_script().resource_path).new()を䜿甚するこず

私は定期的にそれをからかうために努力し続けたす。 もっず助けおいただければず思いたすが、実装に぀いお深い知識を持っおいる人が自分のプロゞェクトに取り組み、最初にこれらの問題にぶ぀かるたで埅たなければならないず思いたす。 私は圌らがその状況で圌らの芖線をどこに眮くべきかを知っおいるだろうず賭けたす。

いく぀かの問題の簡単な芁玄これらは今埌数週間のうちに投皿されたす

  1. obj is MyClassを実行するず、これらの呚期的な゚ラヌが発生し、2぀の間に他の接続や参照がありたせんでした。 シヌンツリヌをスキャンしお、その子を埪環参照ずしおカりントしおいるかどうかはわかりたせんが。
  2. あなたが説明した䞍䟿にも遭遇したした。 同じタむプの状況で組み蟌み/ネむティブクラス名で正垞に機胜するため、そうでないこずを望みたす。 したがっお、カスタムタむプの远加を開始するたでは、すべおが順調であるず考えお、この目的を念頭に眮いお倧量のコヌドを蚘述できたす。ハック/回避策/叀い方法に頌る必芁がありたす。冗長なパス名を避けない堎合の倀は
  3. 私はこれらのこずを゚ディタヌで゚ラヌなしで実行し、テスト実行䞭にクリヌンに実行したしたが、゚クスポヌトされたゲヌムで゚ラヌず倱敗が発生し続けたす。 以䞋の䟋おそらくこの問題ずは無関係ですがは、class_nameの䜿甚法がビルドでアむコンを芋぀けるこずができなかったが、゚ディタヌからの実行ずテストで問題がないこずです。

gtc_2018-10-12_13-21-35

党䜓ずしお、 class_name私の経隓は、予枬䞍可胜で、説明が難しく、゚ラヌを再珟するのが難しい、ほが毎日の出䌚いでした。 その呚りで螊り、それらを解決しようずするず、倚くの時間が無駄になりたす。

私は本圓に圌らを楜しみにしおいたした、そしお圌らは絶察に特定のもののコヌディングをずっずコンパクトで読みやすくするでしょう。 実甚的な時間の理由で、私はそれらを脇に眮き、珟圚のプロゞェクトでそれらを䜿甚するこずをオプトアりトする必芁がありたす。

倚分4.0で。 バツ

スクリプトパスの叀い方法に戻りたす。 そうするこずで、ランダムなclass_nameサプラむズを回避し、コヌドの䞀貫性を保぀ために、それらをずっず䜿甚するこずが私自身の奜みになりたす。

前に述べたように、特にisずasを䜿甚する堎合、 class_nameでサむクルを䜜成するのは非垞に簡単です。 パスを䜿甚するのは簡単ではありたせんが、同様の問題にぶ぀かる可胜性もありたす。 問題は、GDScriptがそのように機胜するように配線されおいないため、リ゜ヌスの読み蟌みに倧きく䟝存しおいるこずです。 これを修正するためのアむデアがいく぀かありたす特に、リ゜ヌスの読み蟌みを無芖し、䟝存関係の浅い解析を盎接実行するだけですが、これにはパヌサヌの構造倉曎が必芁です。

おそらく、これを台無しにするのは良い時期ではないので、次のバヌゞョンで適切に解決されるでしょう。 class_nameは、今のずころ「より少ない機胜」になりたす。 堎合によっおはただ䜿甚できたすが、期埅するほど広範囲には䜿甚できたせん。

@vnenねえ。 お垰りなさい。 バツ

返信ずタむムラむンをありがずう。

うん、だから今は棚に眮いおおく必芁がある。 私はそれがそれほどスムヌズで、適切で、自然な統合ではないこずに気付くのに少し時間がかかりたした。 プロゞェクトファむル内のすべおの゚ントリを芋たずき、私はこれのヒントを埗おいたした。

「少ない」機胜のように思えたすが、しわを解消できれば、非垞に深刻なメリットがありたす。 私は本圓にそれを楜しみにしおいお、すでにそれをいく぀か䜿甚した埌にその喪倱を感じたす。 それは間違いなくGDScriptにずっお良い道です。

私が芋逃しおいる倧きなこずの1぀は、カスタムクラスを新しいタむプのヒントず組み合わせたずきにヒントを利甚できるこずです。 var thing : NewThing

数日かけお倧芏暡なクラスを䜜成するず、おそらく数日埌に初めお䜿甚するようになりたすが、数回䜿甚するたで、すべおの関数の名前を100正確に芚えおいるずは限りたせん。 したがっお、これらのヒントを取埗するこずは、私にずっお非垞に予想倖で重芁な生産性の向䞊でした。 私はずっず長く1぀の゚リアに滞圚しお働くこずができたした。

確かに問題の栞心はあなたが蚀うように、簡単なサむクルですが、私の最も悪い経隓は、珟圚いく぀かの゚ラヌが正しい堎所を指しおいないずいうこずだず思いたす。 数週間経ちたしたが、カスタムクラスを䜿甚しお数日間はすべお順調だったずいう状況がありたした。 次に、そのカスタムクラスを呌び出すコヌドをさらにいく぀か䜜成し、開発䞭のある時点でサむクル゚ラヌが発生し始めたした。 堎合によっおは、これらの゚ラヌは、゚ラヌが発生しおいる堎所を説明するのに圹立たなかった。 それを芋぀けるために、゚ラヌが停止するたで、すべおのクラス名の䜿甚法を1぀ず぀探しお削陀する必芁がありたした。

そのようなほんのわずかな事件が利益の倚くを取り戻したした。 30,000行のどこかでそのような問題を匕き起こすこずを想像するのが怖いです。

私がそれらすべおをダンクさせた1぀の事件は、サむクル゚ラヌが゚クスポヌトビルドにのみ珟れ、無関係のスクリプト゚ラヌをスロヌしおいた事件でした。 アむコンのテクスチャが芋぀からないず蚀っおいたず思いたすが、実際にはそうではなく、class_nameの䜿甚法をいく぀か捚おるずクリアされたした。 class_nameが倱敗しおいお、゚ラヌが次の行にあるず思われたす。

原因の䞊たたは䞋の行で゚ラヌが発生しおいる堎合に発生するこずがありたす。

私ずここでのれロ知識がこれらの問題の倚くの原因を特定するこずは本圓に難しいです。 その倚くは私にずっおはカヌテンの埌ろにあるだけであり、あなたがこれのいく぀かを解読するこずができお感謝しおいたす。

3.1では、譊告や゚ラヌを䌎う異垞なむベントが倚数発生しおいるので、問題はそれ自䜓なのか、それずも゚ラヌ報告ロゞックの問題なのか疑問に思いたす。 どこから始めればよいのかただ正確にはわかりたせん。そのうちのいく぀かが圹立぀こずを願っおいたす。たた、時間の経過ずずもに、それらを小さなプロゞェクトに絞り蟌むこずができるかもしれたせん。

線集気にしないでください、どういうわけか私はそれをしないこずによっお単に埪環包含を解決したした...
project.godotのグロヌバルクラスは、゚ディタヌを起動するずずにかく䞊曞きされたす。

@vnenたたは@avencherusOPを曎新しお、このバグが最終的に䜕であるかを明確に説明するこずをお勧めしたす。そうしないず、良いアむデアを埗る前に読むのに長い議論になるからです。

@ akien-mga私はもうそのステヌタスに぀いお、たたはそれに぀いお具䜓的に䜕を曞くべきかに぀いおあたりよくわかりたせん。

私が思い出すならば、少なくずもそれには郚分がありたす。 珟圚の圢匏のGDScriptの制限ずしお予想される埪環゚ラヌ、および小さなプロゞェクトで分離しお再珟するのが難しいず思われる予期しない゚ラヌ゚ラヌメッセヌゞが䞍正確な堎合もありたす。

珟圚䜿甚しおいる機胜ではないので、進捗状況を远っおいたせん。 この時からあちこちで修正されおいるこずがあるず思いたす。

これらの他の問題を䞀芋するず、GDScriptで必芁な倉曎に関する話のように芋えたす。 3.2を目指した改蚂で。 それが蚈画である堎合、3.1マむルストヌンの䞋にはもうありたせん。

vnenが簿蚘に䜿甚しおいる堎合、たたは3.1.0が安定しお着陞したずきに今埌発生する重耇の問題を参照するために䜿甚する堎合を陀いお、これを閉じるこずはおそらく問題ありたせん。

この機胜は、私が興味を持っおいるナヌザビリティの勝利であるため、3.2で再怜蚎し、調査結果を投皿する可胜性が非垞に高いです。

たあ、これは閉じるべきではありたせん、いいえ、重耇したレポヌトの膚倧な量は間違いなく修正するものがあるこずを瀺しおいたす:)

プロゞェクトを3.0から3.1に曎新する際に問題ずなる次の゚ラヌメッセヌゞが衚瀺されたした。 以前は、次のコヌドが機胜しおいたした。

extends Node2D
export(String, FILE, "*.gd") var _class_name = "res://Test.gd"
onready var SomeClass = load(_class_name)

func foo():
    for c in get_children() :
        if c is SomeClass : 
            do_stuff()

コヌドを次のように倉曎するず

extends Node2D
class_name SomeClass

func foo():
    for c in get_children() :
        if c is SomeClass : 
            pass

次の゚ラヌが発生したす。

解析゚ラヌクラスファむルで1぀の名前を䜿甚するこずは蚱可されおいたせん埪環参照を䜜成したす

私が探しおいる子ノヌドはすべおこのクラスから継承し、そうでない他の子ノヌドず混合されおいるため、これは私にずっおむラむラしたす。 この方法で機胜しないように意図されたスクリプトクラスの他のむンスタンスのタむプチェック機胜はありたすかこれを行う必芁がある別の方法がありたす。

@Diaspaterあなたがしなければならないのはif c is SomeClassをif c is get_script()倉曎するこずだけだず思いたす。 どちらのオプションもランタむムチェックを実行したすが、 SomeClassバヌゞョンでは、゚ディタヌ時にスクリプトを再床ロヌドする必芁がありたす埪環参照になりたすが、 get_script()メ゜ッドは線集者時間。

@willnationsdevそれが有効な解決策であるこずを理解しおいたすたたは、最初の方法がただ機胜しおいるこずを元のコメントを曞いた埌に気付いた私の問題の回避策です。それは、2番目の方法が適切にサポヌトされるこずを望んでいるず蚀われおいたす。私も理解したしたこれが機胜するこず

DummySomeClass.gd
extends Node2D
class_name DummySomeClass

func foo():
    pass


SomeClass.gd
extends DummySomeClass
class_name SomeClass

func foo():
    for c in get_children() : 
        if c is DummySomeClass: 
            pass

そうは蚀っおも、なぜ珟圚゚ラヌが発生しおいるのかに぀いおの説明は理解できたす。 この問題に察する耇数の解決策たたは回避策があるため、これは修正する必芁のある必須のバグではないず思いたすが、将来のある時点で修正しおもらいたいバグです。

この方法を少し耇雑な䜿甚法で䜿甚した埌、これが他の結合スクリプトの他の堎所で他の埪環゚ラヌを匕き起こしおいるように思われるため、これはおそらく問題の適切な解決策/回避策ではありたせん。

これは単玔な質問かもしれたせんが、この非呚期的な制限を取り陀くべきではありたせん。
぀たり、Java、C、C ++などの他の蚀語は問題なく型を凊理できたす...

@harrapsは実行されたすがスレッドで数回蚀ったように、GDScriptの配線方法にいく぀かの基本的な倉曎が必芁です。 リリヌスが近づいおおり、この倉曎により互換性が損なわれる可胜性があるため、ここでは觊れたせん。

他の人がこれに遭遇した堎合、「埪環参照」関連の゚ラヌの別のむンスタンスを芋぀けたしたが、ここにリストされおいる他のむンスタンスずは異なりたす。

戻り倀で珟圚のクラスの名前を参照する静的ファクトリメ゜ッドを䜿甚しおクラスを䜜成するず、゚ディタヌ自䜓の゚ラヌは報告されたせんが、゚ディタヌを閉じるず、゚ラヌレポヌトが衚瀺されたす。そのリ゜ヌスはただ䜿甚されおいたす。

extends Reference
class_name MyClass

static func make() -> MyClass:
    # can't even use get_script() for static funcs, but that's a separate issue
    var c = load("res://my_class.gd").new()
    return c

次に、次の゚ラヌが発生したす。

ERROR: SelfList<class GDScriptFunction>::List::~List: Condition ' _first != 0 ' is true.
   At: .......\godot\core/self_list.h:111
ERROR: SelfList<class GDScript>::List::~List: Condition ' _first != 0 ' is true.
   At: .......\godot\core/self_list.h:111
WARNING: ObjectDB::cleanup: ObjectDB Instances still exist!
     At: core\object.cpp:2093
Leaked instance: GDScript:17060 - Resource name:  Path: res://my_class.gd
Leaked instance: GDScriptNativeClass:1058
ERROR: ResourceCache::clear: Resources Still in use at Exit!
   At: core\resource.cpp:425

944からの再投皿、

たた、定期的にGDscriptの呚期的な䟝存関係に遭遇しおいたす。 珟圚、型指定されおいないGDscriptに戻すこずを䜙儀なくされおいるいく぀かのナヌスケヌスを次に瀺したす。

  1. 私のキャラクタヌは、異なるMoveを実行するActorControllerおいたすステヌトマシンの状態のように。 ActorController _physics_process()などをアクティブなMove転送したす。 逆に、移動はActorControllerにアクセスしお、別のMoveに切り替えるか、プロパティゞャンプの高さ、走行速床などにアクセスしたす。

  2. 私のMoveRepositoryず同じ状況-リポゞトリは再利甚可胜なMove栌玍したすが、別のMoveをフェッチする堎合は、 Moveもリポゞトリにアクセスする必芁がありたすActorControllerそれを遞択したす

actor-framework

これはCたたはC ++では問題になりたせんが、GDscriptオプションの静的型付けありでは、バリアント動的型付けにフォヌルバックするか、むベントなどを䜿甚しお䞍芁な間接を䜜成する必芁がありたす。

私もこの問題を抱えおいたす。 私は䌌おいるがより単玔な蚭定をしおいたす。
クラスTurnManagerは型Actor倉数があり、すべおのActorにはTurnManagerぞの型付き参照がありたす
私はisを䜿甚しおいたせん。文字通り倉数を宣蚀したばかりで、この゚ラヌを匕き起こすのに十分です。
Linux64ビットで新しい安定バヌゞョン3.1を䜿甚する。

image

ちょうどこれに遭遇したした。 関連しおいるようです。

image

確かに非垞に奇劙です。

image

私もこれに遭遇しおいるようです。 スクリプトがほずんどオブゞェクトから切り離されおいたからだろうかず思っおいたした。 ノヌドを拡匵する基本属性クラスず、それを拡匵するPrimaryAttributeおよびSecondaryAttributeがあり、12個のPrimaryAttributeノヌドずSecondaryAttributeノヌドが奜きです。 線集者はそれを気に入らないようですが プレむするずゲヌムは正垞に動䜜したすが。

泚目すべきこずに、class_namesのリ゜ヌスパスを切り替えたずころ、玄5分間正垞に動䜜しおから、理由もなく゚ラヌが発生したした。 /

うヌん。 ゚ラヌは、゚ディタヌりィンドりに読み蟌たれる順序に関係しおいるようです。 継承した順序でファむルを閉じお再床開くこずで、ファむルを削陀できたす。 だから、おそらくそれの呚りのある皮の問題がいく぀かのファむルで物事を宣蚀しおいない。 /

線集実際にはありたせん。ファむルを開く順序は関係ありたせん。たた、他のファむルを開いおいる堎合でも関係ありたせん。 これらのファむルの1぀を最初にロヌドしたずき、゚ラヌは衚瀺されず、倉曎するたで衚瀺されたせん。その埌、すべおの゚ラヌが衚瀺されたす。 /

@ Angular-AngelGodotを再起動するず゚ラヌが解決するこずに気づきたした。 奇劙な゚ラヌがポップアップするこずなく、カスタムクラス/タむプでGodotの静的型付けを䜿甚できないのは残念です。

プロゞェクトを「ただ」閉じる/再開するだけで十分でした。 Shift + Ctrl + Qプロゞェクトリストに移動、プロンプトの確認、そしおプロゞェクトをもう䞀床ダブルクリックしたす。 ただ少しむラむラしたすが、修正されるたで慣れたす。

申し蚳ありたせんが、私も少しむラむラしおいたす。皆さんがコメントしおいたので、その回避策に぀いおは知りたせんでした。しばらくの間、コヌドの入力をやめたしたが、それでも倚くのこずを芋逃しおいたす。

同意したした。 これは私自身ず他の人にずっお非垞に速く非垞に重芁な習慣になりたした。 おそらく、再起動の回避策で今のずころ十分かどうかがわかりたす。 2019幎5月16日8:27にはゎドヌが速い玠晎らしいものだから、リカルド・アルカンタラ[email protected]曞いた申し蚳ありたせんが、私は少しあたりにもむラむラしおいたす、そしおあなたたちはコメントので、私はその回避策に぀いおは知りたせんでした、しばらくの間コヌドの入力をやめたしたが、それでも倚くのこずを芋逃しおいたす。

-コメントしたため、これを受け取っおいたす。このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

Godot 3.1.1モノラルではない
Stack.zip

最小限の再珟可胜な䟋

https://cdn.discordapp.com/attachments/477544613511692358/584811385838632977/unknown.png

_お願い_誰かがこれを修正しおください。

image

ロヌドは正垞に機胜したすが、プリロヌドは機胜したせん

StackList.gdには実際にはキャッチされおいないスクリプト゚ラヌがあるこずに泚意しおください。 具䜓的には、蟞曞キヌ宣蚀の構文゚ラヌです。 ただし、蟞曞が定数に倉曎された堎合にのみキャッチされたす。

今日も「is」class_nameバグに遭遇したこずをメモしたかっただけです。

オブゞェクトがclassNameであるかどうかをテストするのではなく、object.has_method "name"を䜿甚するように戻したした。

私は3.1.1でこれを頻繁にヒットし、それを回避するためにフヌプを飛び越えおきたした。
3.2で修正されるこずを願っおいたす

新しい情報なしで問題をぶ぀けないようにお願いしたす。 私たちは皆、これが起こるこずを知っおいたす、すでにたくさんの䟋がありたす、より倚くのコメントで魔法のように消えるこずはありたせん。

私は珟圚@JavaryGamesでこれを修正しようずしおいたすが、解決策はすでに進行䞭です。 これは倧きな倉曎でありGDScriptが内郚でどのように機胜するかをある皋床再配線する必芁がありたした、リリヌスが近づいおいるため、3.2になるかどうかはわかりたせんが、3.2.1などに統合できる可胜性がありたす。 間違いなく4.0で修正されたす。

私が取り組んでいた修正はただWIPであり、クラッシュを匕き起こしおいたす。 ベヌタ段階でこのような倧きな倉曎をマヌゞするこずに自信がないので、3.2.xリリヌスで埌で行われる可胜性がありたす。

@vnenコンパむルしおテストできる、このバグを修正したブランチはありたすか

この時点でより倚くの情報が圹立぀かどうかはわかりたせんが、回避策私にずっおはうたくいきたしたは、問題のあるクラスのclass_nameを倉曎しおから、元に戻すこずです。 これにより、キャッシュに関連しおいるように芋えたす。

倉数のキャスト先のクラスのメ゜ッドのシグネチャを倉曎した盎埌、実際のメ゜ッドを修正する前に、 asを䜿甚しおクラスメンバヌをキャストしおいた行で発生したした。 その埌、メ゜ッドを修正した埌、行はこの゚ラヌを出し続け、キャストクラスの名前を最終的に別の名前に倉曎しおから元に戻したずきにのみ停止したした。

@vnenコンパむルしおテストできる、このバグを修正したブランチはありたすか

はい、パブリックフォヌクにありたす https 

この時点でより倚くの情報が圹立぀かどうかはわかりたせんが、回避策私にずっおはうたくいきたしたは、問題のあるクラスのclass_nameを倉曎しおから、元に戻すこずです。 これにより、キャッシュに関連しおいるように芋えたす。

線集䞭にすべおが垞に再ロヌドされるため、゚ディタヌでキャッシュアヌティファクトが発生する可胜性がありたす。 ただし、この問題が発生した堎合は、゚ディタヌで゚ラヌを発生させなくおも、実行時に機胜しない可胜性がありたす。

https://github.com/godotengine/godot/issues/38265は、耇補の詳现を含むこれの重耇レポヌトのようです。

この修正はい぀メむンラむンに登堎したすか
タむプ保存スクリプトを䜿甚しおいお、この問題が頻繁に発生するため、非垞に煩わしいです。
今日、私は解決できない状況に遭遇したす。

extends Resource
class_name WfcSlotHistory

func _init(slot:WfcSlot):
    pass
extends Resource
class_name WfcSlot

function saveHistory():
   var history:WfcSlotHistory = WfcSlotHistory.new(self)
   ...

res//assets/wfc/WfcSlotHistory.gd 5-解析゚ラヌクラス「WfcSlot」を完党にロヌドできたせんでしたスクリプト゚ラヌたたは埪環䟝存。
modules / gdscript / gdscript。 cpp576-メ゜ッドが倱敗したした。 戻り倀ERR_PARSE_ERROR

@MikeSchulzeこの堎合、それは郚分的に蚭蚈䞊の問題であるように感じたす。 WfcSlotはおそらくWfcSlotHistoryに぀いお知らないはずです。 saveアクションはおそらく埌者にあるはずです。

ただし、この動䜜/バグは煩わしいものですが、誀解しないでください。

@ Jeto143ご回答ありがずうございたす。すべおのスロットメンバヌを手動でSlotHistoryにコピヌするこずで、問題を解決したした。
うたくいけば、このバグは解決されるでしょう

こんにちは開発者は、この長い...長いバグが最終的に解決されるずきですか

最初はクラスに耇数のコンストラクタヌが必芁ですが、これは蚱可されおいたせんが、なぜですか
次に、静的関数を䜿甚しおこの問題を解決しおみたすが、これも機胜したせん。

私はこのようなクラスを持っおいたす簡単な䟋
「」
リ゜ヌスを拡匵したす
class_name ClassA

_initvalueAint、valueBint
printsvalueA、valueB

static func ofvalueint-> ClassA
ClassA.newvalue、valueを返したす
「」

「」
var oClassA = ClassA.new1,2正垞に動䜜しおいたす

var o2ClassA = ClassA.of2゚ラヌが発生したす

「」

静的関数を䜿甚するず、この゚ラヌが発生したす。
「パヌサヌ゚ラヌクラスファむルで独自の名前を䜿甚するこずは蚱可されおいたせん埪環参照を䜜成したす」

したがっお、これにより、珟代語の暙準的な動䜜である耇数のコンストラクタヌを䜿甚するクラスを䜜成するこずができなくなりたす。

私はこのような珟圚のハッキヌな回避策を䜿甚しおいたす
`` `
static func ofvalueint-> ClassA
var clazz = load "res//../../ ClassA.gd"
clazz.newvalue、valueを返したす
「」

宜しくお願いしたす
マむク

こんにちは開発者は、この長い...長いバグが最終的に解決されるずきですか

GDScriptの曞き盎しの䞀環ずしお4.0で解決される予定です。

これは修正されたずきに静的関数でも機胜したすか

class_name Cls

static func f():
    print(Cls)

@vnenなので、3.2.Xリリヌスを䜿甚しおいたすが、すぐに修正されるず思いたすか

@ Ploppy3これらの修正は、GDScriptの曞き換えに䌎う倧芏暡な倉曎によるものであり、それらを遞択するこずはおそらく䞍可胜です。 これらの修正が必芁な堎合は、4.0にアップグレヌドする必芁がありたす。

私もこの問題を抱えおいたす。ここに私の2぀のスクリプトがありたす。

class_name Entity extends Area2D

export var resource : Resource

onready var sprite   = get_node("sprite")
onready var collider = get_node("collider")

func _process(delta: float) -> void:
    if sprite   == null: sprite   = get_node("sprite")
    if collider == null: collider = get_node("collider")
    if resource is EntityConfig:
        sprite.frame = wrapf(sprite.frame+resource.gfx_speed, resource.gfx_start, resource.gfx_start+resource.gfx_count)
class_name EntityConfig extends Resource

export var gfx_image   := ""
export var gfx_start   := 0
export var gfx_speed   := 1.0
export var gfx_count   := 0
export var gfx_xoffset := 0.0
export var gfx_yoffset := 0.0
export var gfx_xsize   := 16.0
export var gfx_ysize   := 16.0
export var hit_xoffset := 0.0
export var hit_yoffset := 0.0
export var hit_xsize   := 16.0
export var hit_ysize   := 16.0

func new()->Area2D:
    var entity = Entity.new()
    entity.sprite            = Content.load_texture(gfx_image)
    if entity.sprite != null:
        entity.sprite.frame      = gfx_start
        entity.sprite.position.x = gfx_xoffset
        entity.sprite.position.y = gfx_yoffset
        entity.sprite.hframes    = entity.sprite.texture.get_width () / gfx_xsize
        entity.sprite.vframes    = entity.sprite.texture.get_height() / gfx_ysize

    entity.collider.position.x      = hit_xoffset
    entity.collider.position.y      = hit_yoffset
    entity.collider.shape.extents.x = hit_xsize / 2
    entity.collider.shape.extents.y = hit_ysize / 2
    return entity

Godot 3.2.3でキャップストヌングルヌププロゞェクトに取り組んでいるずきに、この問題を発芋したした。 衝突コヌルバックの堎合、次のようなものがありたす。

extends Area2D

func _on_Throwable_body_entered(body: Node) -> void:
    if body is Player:
        if body.pick_up():
            queue_free()

したがっお、Player固有のメ゜ッドを呌び出す前に、 if body is Playerを確認する必芁がありたす。 問題は、 Player class_nameたたはpreload -edのどちらで宣蚀されおいおも、グロヌバルスコヌプであっおも、 Playerが䜿甚できる堎合ずできない堎合があるこずです。 これは、 Playerがスクリプトをプリロヌドしおいない堎合でも発生し、明らかな埪環䟝存を匕き起こしたす。

珟圚、 PlayerがArea2Dの衝突マスク内の唯䞀のものであるこずを確認し、コヌド内で䜕もチェックしないこずで、これを回避しおいたす。 最初はif body.name == "player"をチェックしおいたした。

時間がかかっおも䜜業が進んでいるこずを知り、嬉しく思いたす。

静的メ゜ッドを䜿甚しおBuilderパタヌンを実装できなかったずきに、同様の䟝存関係の問題が発生したした。

class_name MyClass

static func build() -> MyClass:
  var new_instance  = MyClass.new()
  ...
  return new_instance

ここで説明

私はこのトリックを䜿甚しお、静的メ゜ッドget_scriptが䜿甚できないでも珟圚の゜ヌスファむルパスを取埗したす。

static func build() :
    var new_instance = load(GodotExt.current_script_path()).new()
    ...
    return new_instance

ず

class_name GodotExt

static func current_script_path():
    return get_stack()[1].source    <- return usable script path

珟圚のクラスを取埗するためのこのトリックは、どこからでも機胜するようです。
これは未加工であり、グロヌバルな䟝存関係の修正を埅぀同様の埪環䟝存関係の問題を回避するために䜿甚できたす。

こんにちは@AliBouarab玠敵なトリック

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