国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Godot的幾個(gè)附加腳本和進(jìn)行繼承時(shí)比較特別的特性

這篇具有很好參考價(jià)值的文章主要介紹了Godot的幾個(gè)附加腳本和進(jìn)行繼承時(shí)比較特別的特性。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

注: 這是在Godot4.0中總結(jié)出的內(nèi)容,并且語(yǔ)言是C#。
特別的,下面有的特性和C#關(guān)系比較大。

基本特性

在Godot中,為某個(gè)節(jié)點(diǎn)編寫特別的代碼時(shí),需要為節(jié)點(diǎn)新建腳本,或引用已有腳本。

引用腳本時(shí),填入腳本路徑即可,相當(dāng)于是復(fù)用代碼了。

新建腳本時(shí),一般做法是新建一個(gè)自定義類型,并且這個(gè)類型繼承自原有節(jié)點(diǎn)的類型。

其實(shí),你也可以不繼承自原有節(jié)點(diǎn)的那個(gè)類型。下面的各小節(jié)文章均是針對(duì)這個(gè)情況的。

在選擇繼承的目標(biāo)時(shí),你可以選擇的范圍有:(最常規(guī)的)繼承自原有類型、繼承自自定義類型、繼承自"中間"類型。

繼承自自定義類型

繼承自自定義類型,一般來(lái)說(shuō)是為了滿足這個(gè)需求的:

用戶為某節(jié)點(diǎn)編寫了一個(gè)自定義了類型后,在新的情境下,需要擴(kuò)充這個(gè)類型,讓它有新的功能,并且舊的不能變。
此時(shí),程序員一般第一個(gè)想到的就是繼承。Godot順理成章地允許用戶這樣進(jìn)行繼承。

想要進(jìn)行這樣的繼承時(shí),為節(jié)點(diǎn)新建腳本時(shí)必須先選擇已有類型,若直接填入想繼承的類型,Godot不允許這樣做。

Godot的幾個(gè)附加腳本和進(jìn)行繼承時(shí)比較特別的特性

創(chuàng)建完成后,用戶可以打開腳本文件,手動(dòng)修改繼承類型。

雖然看上去就像作弊,但是Godot方面認(rèn)可這種做法,也有人建議在建立腳本時(shí),"繼承"內(nèi)容框可以選擇自定義類型進(jìn)行繼承,但是Godot的開發(fā)者們暫時(shí)并沒有這么做。

需要注意的是,這種做法對(duì)此腳本附加到的節(jié)點(diǎn)有要求。

  • 首先,你在編寫一系列一層一層繼承起來(lái)的類時(shí),你建立起來(lái)的最底層的那個(gè)自定義類肯定是繼承自"原生類型"的
    • "原生類型"就是新建節(jié)點(diǎn)時(shí),你能在面板里選到的類型(沒錯(cuò),這里找不到你自定義的類型,它們100%是Godot內(nèi)置的!)
  • 要將這一系列自定義類中的任何一個(gè)附加到一個(gè)目標(biāo)節(jié)點(diǎn)時(shí),這個(gè)目標(biāo)節(jié)點(diǎn)在編輯器中體現(xiàn)出來(lái)的類型必須能夠兼容自定義類最底層的"原生類型",和它相同,或是繼承自它,都可以。
    (注:如果不兼容,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。)

繼承自"中間"類型

讀了上面的內(nèi)容時(shí),你也許會(huì)意識(shí)到,其實(shí)任何一個(gè)自定義類型底層的"原生類型",可以是它附加的節(jié)點(diǎn)的繼承樹中大于等于Node的類型之中的任何一個(gè)類型。

我稱這種做法為"繼承自中間類型"。




事實(shí)上,也許需要調(diào)整一下觀念。大家一開始似乎會(huì)認(rèn)為,節(jié)點(diǎn)附加了一個(gè)自定義類型后,節(jié)點(diǎn)就是自定義類型的實(shí)例了。

實(shí)際情況似乎要稍微割裂一點(diǎn)。因?yàn)槔^承自中間類型后,你會(huì)發(fā)現(xiàn),這個(gè)自定義類型無(wú)法完全描述這個(gè)節(jié)點(diǎn)。請(qǐng)看接下來(lái)的例子。

這里,我給一個(gè)精靈Sprite2d掛上這樣一個(gè)自定義類型,它繼承自Node。

public partial class TNode : Node
{
}

Godot的幾個(gè)附加腳本和進(jìn)行繼承時(shí)比較特別的特性

我想知道,這個(gè)節(jié)點(diǎn)從C#繼承體系的角度看,還是不是"精靈(Sprite2D)"了

讓我們?cè)诟?jié)點(diǎn)中寫一點(diǎn)代碼,試圖了解該節(jié)點(diǎn)的類型。

public partial class AskForClass : Node2D
{
    public override void _Ready()
    {
        var t1node = GetNode("TNode");

        //方法1 打印繼承樹
        Type tobj;
        tobj = t1node.GetType();
        while (tobj != null)
        {
            GD.Print(tobj.Name);
            tobj = tobj.BaseType;
        }
        GD.Print("以上是繼承樹。");

        //方法2 類型轉(zhuǎn)換。轉(zhuǎn)換失敗的話就是null。
        var t2node = t1node as Sprite2D;
        GD.Print(t2node);

        //方法3 我發(fā)現(xiàn)Godot有一個(gè)IsClass()方法
        GD.Print("is sprite2D class?" + t1node.IsClass("Sprite2D"));

    }
}

(小提示:Godot的_Ready()函數(shù)被執(zhí)行順序是先子節(jié)點(diǎn),再父節(jié)點(diǎn),這樣嵌套的,所以父節(jié)點(diǎn)訪問子節(jié)點(diǎn)總是萬(wàn)無(wú)一失的,當(dāng)然,這個(gè)示例就算順序不是這樣也不存在問題)

上面用了3種方式試圖確認(rèn)我們的t1node有沒有Sprite2D的成分,以及Sprite2D的成分通過哪種方式能查到,猜猜看?

結(jié)論是:

TNode
Node
GodotObject
Object
以上是繼承樹。
null
is sprite2D class?True

除非使用Godot提供的函數(shù)IsClass(), 光靠C#的繼承體系,查不到Sprite2D的成分, 而且實(shí)例無(wú)法轉(zhuǎn)換成Sprite2D類型,這樣就不能以C#通常的方式操作Sprite2D特有的函數(shù)和變量了。

在C#內(nèi),雖然它"放棄了作為Sprite2D的身份",但我們的節(jié)點(diǎn)在運(yùn)行時(shí)仍然做著一個(gè)"精靈"會(huì)做的事情,比如我在編輯器里對(duì)它的位置和旋轉(zhuǎn)進(jìn)行了變更,這些變更都沒有丟失。
個(gè)人推測(cè),此時(shí)需要使用GetIndexed()SetIndexed()等方法來(lái)操作那些無(wú)法直接訪問的東西。

Godot的幾個(gè)附加腳本和進(jìn)行繼承時(shí)比較特別的特性



這個(gè)實(shí)例和實(shí)際存在于Godot運(yùn)行時(shí)的節(jié)點(diǎn)竟然有這樣的不同。

以后也許時(shí)不時(shí)需要想起來(lái)這樣一件事——C#實(shí)例和Godot內(nèi)的節(jié)點(diǎn)只是連在一起,有一個(gè)映射的關(guān)系罷了,并不100%是那個(gè)節(jié)點(diǎn)本身。

節(jié)點(diǎn)除了有C#能提供給它的函數(shù)和字段外,還可以擁有相當(dāng)突出的Godot賦予它的不同類型的功能,即各種類型的"原生節(jié)點(diǎn)"的各種各樣的功能。


閱讀文檔后,大概可以這樣理解,Godot運(yùn)行時(shí)維護(hù)的節(jié)點(diǎn)身上的函數(shù)和變量的表現(xiàn)更符合動(dòng)態(tài)語(yǔ)言的特征,而不是靜態(tài)類型語(yǔ)言。
不論是C#腳本、Godot腳本、還是"原生類型"的節(jié)點(diǎn),行為都是將自己的各種功能附加或覆蓋到了節(jié)點(diǎn)身上。

Godot is very dynamic. An object's script, and therefore its properties, methods and signals, can be changed at run-time. Because of this, there can be occasions where, for example, a property required by a method may not exist. To prevent run-time errors, see methods such as set, get, call, has_method, has_signal, etc. Note that these methods are much slower than direct references.
Godot很是動(dòng)態(tài)。對(duì)象的腳本及其屬性、方法和信號(hào)可以在運(yùn)行時(shí)更改。因此,在某些情況下,例如,方法所需的屬性可能不存在。若要防止運(yùn)行時(shí)錯(cuò)誤,請(qǐng)參閱設(shè)置、獲取、調(diào)用、has_method、has_signal等方法。請(qǐng)注意,這些方法比直接引用慢得多。

繼承自中間類型后可能遇到的坑

上述特性可能會(huì)引發(fā)一個(gè)問題,當(dāng)你需要用C#找到場(chǎng)景中的所有某一原生類型的節(jié)點(diǎn)時(shí),從"中間"繼承的節(jié)點(diǎn)被獲取后,由于一些身份被放棄了,有可能被漏掉!

也就是說(shuō),在上面的案例中,想找Sprite2D時(shí),用下面的方法,掛載了TNode腳本的精靈將被跳過,盡管它這么大一個(gè)放在屏幕上。

List<Sprite2D> lst = new List<Sprite2D>();
var children = FindChildren("*");
foreach (var chi in children)
{
    if (chi is Sprite2D sp)
    {
        lst.Add(sp);
        GD.Print("這個(gè)是精靈" + chi.Name);
    }
    else
    {
        GD.Print("這個(gè)不是精靈" + chi.Name);
    }
}

Godot的幾個(gè)附加腳本和進(jìn)行繼承時(shí)比較特別的特性

我沒有測(cè)試GDScript,不知道是否情況會(huì)不同。也許它支持多重繼承?

綜上所述,個(gè)人建議盡量避免附加腳本時(shí)從中間繼承。

實(shí)在有這樣的需求,要么避免一個(gè)類型的每一個(gè)身份都需要被C#直接操作,要么用IsClass()配合GetIndexed()SetIndexed()等方法處理該對(duì)象。

參考:
https://godotengine.org/qa/141137/best-way-to-add-a-node-that-extends-a-custom-class
https://docs.godotengine.org/en/latest/classes/class_object.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-470024.html

到了這里,關(guān)于Godot的幾個(gè)附加腳本和進(jìn)行繼承時(shí)比較特別的特性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ARFoundation多圖識(shí)別的一個(gè)腳本

    ARFoundation多圖識(shí)別的一個(gè)腳本

    使用ARFoundation的圖像識(shí)別發(fā)布出來(lái)的安卓應(yīng)用存在一個(gè)令初學(xué)者撓頭的問題——模型始終是背對(duì)用戶的,雖然可以在3ds Max等軟件中調(diào)整其軸心,終歸是麻煩。受汪祥春老師《AR開發(fā)權(quán)威指南基于AR Foundation》一書的啟發(fā),編寫如下MultiImageTracking腳本: 用法: 為參考圖像庫(kù)添加

    2024年02月11日
    瀏覽(17)
  • 賦的幾個(gè)發(fā)展階段

    賦,起源于戰(zhàn)國(guó),形成于漢代,是由楚辭衍化出來(lái)的 ,也繼承了《詩(shī)經(jīng)》諷刺的傳統(tǒng)。關(guān)于詩(shī)和賦的區(qū)別,晉代文學(xué)家陸機(jī)在《文賦》里曾說(shuō): 詩(shī)緣情而綺靡,賦體物而瀏亮。 也就是說(shuō),詩(shī)是用來(lái)抒發(fā)主觀感情的,要寫得華麗而細(xì)膩;賦是用來(lái)描繪客觀事物的,要寫得爽朗而

    2024年02月07日
    瀏覽(25)
  • IO的幾個(gè)模型

    IO的幾個(gè)模型

    說(shuō)到I/O模型,都會(huì)牽扯到同步、異步、阻塞、非阻塞這幾個(gè)詞,以下講解這幾個(gè)詞的概念。 阻塞和非阻塞 阻塞和非阻塞指的是一直等還是可以去做其他事。 阻塞(一直等水燒開)(blocking): 調(diào)用結(jié)果返回之前,調(diào)用者被掛起(當(dāng)前線程進(jìn)入非可執(zhí)行狀態(tài),在這個(gè)狀態(tài),CPU不

    2024年02月12日
    瀏覽(20)
  • SQL中的幾個(gè)區(qū)別

    1:幾種JOIN連接方式的區(qū)別? 2:幾種排序窗口函數(shù)的區(qū)別? 3:on和where的區(qū)別? 4:having和where的區(qū)別? 5:union和union all的區(qū)別? 6:in和exists的區(qū)別? 7:數(shù)據(jù)庫(kù)中空字符串、0和NULL的區(qū)別? 8:count(1)、count(*)和count(列名)的區(qū)別? 1- 幾種JOIN連接方式的區(qū)別? INNER JOIN(內(nèi)連

    2024年01月19日
    瀏覽(22)
  • C++代碼重用:繼承與組合的比較

    C++代碼重用:繼承與組合的比較

    ? 目錄 一、簡(jiǎn)介 繼承 組合 二、繼承 三、組合 四、案例說(shuō)明 4.1一個(gè)電子商務(wù)系統(tǒng) 4.1.1繼承方式 在上述代碼中,Order類繼承自User類。通過繼承,Order類獲得了User類的成員函數(shù)和成員變量,并且可以添加自己的特性。我們重寫了displayInfo()函數(shù),以便在Order類中顯示訂單相關(guān)信

    2024年01月22日
    瀏覽(19)
  • 容器編排的幾個(gè)概念理解

    1.1、 如何理解容器編排 ? 先拆成兩個(gè)部分,什么是容器?什么是編排?以前,程序運(yùn)行在物理機(jī)或虛擬機(jī)中。容器,是現(xiàn)代程序的運(yùn)行方式。編排就是部署、管理應(yīng)用程序的系統(tǒng),能動(dòng)態(tài)地響應(yīng)變化,例如以下部分功能。 - 回滾 - 滾動(dòng)升級(jí) - 故障自愈 - 自動(dòng)擴(kuò)縮容 自動(dòng)完成

    2024年02月12日
    瀏覽(23)
  • 動(dòng)態(tài)規(guī)劃的幾個(gè)經(jīng)典問題

    矩陣鏈加括號(hào)問題 【問題描述】 給定 n 個(gè)矩陣 A1, A2?,…, An,? 其中 Ai 與 Ai+1 是可乘的 ,? 計(jì)算這 n 個(gè)矩陣的連乘積 A1A2…An 。 用加括號(hào)的方法表示矩陣連乘的次序。 【輸入形式】 輸入有2行,第1行輸入一個(gè)整數(shù)n,第2行輸入n個(gè)矩陣的維度值p0,p1,...,pn 【輸出形式】 輸出分3部

    2024年04月10日
    瀏覽(40)
  • SQL調(diào)優(yōu)的幾個(gè)方法

    1.為什么調(diào)優(yōu),好處是什么?? SQL語(yǔ)句在編寫之后,對(duì)于數(shù)據(jù)量較少的表基本沒有什么性能上的需求,但是如果考慮到性能方面的話,SQL語(yǔ)句優(yōu)化就是必須的。 2.如何調(diào)優(yōu)?調(diào)有點(diǎn)方法有哪些? ? 1、對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先考慮在where及order by上建立索引

    2024年02月16日
    瀏覽(21)
  • 關(guān)于中斷的幾個(gè)小問題

    關(guān)于中斷的幾個(gè)小問題

    1. intel 8259芯片中的IRQ2和int2的區(qū)別是什么? 答曰:IRQ2是芯片上的引腳,而int2是中斷向量表的第2項(xiàng),兩者有很大區(qū)別。 Intel8259A芯片的中斷引腳分別為: 主片: 0:8254時(shí)鐘 1:鍵盤 2: 從片 3: com2 4:com1 5:聲卡 6:軟盤 7: lpt打印機(jī) 從片: 0:cmos時(shí)鐘 1:到主片IRQ2的引腳 2:網(wǎng)

    2024年02月07日
    瀏覽(22)
  • 求數(shù)組長(zhǎng)度的幾個(gè)函數(shù)

    純純小白,有錯(cuò)請(qǐng)指出,謝謝。 1、sizeof函數(shù) 對(duì)于一個(gè)給定數(shù)組,如:int arr[]={1,2,3,4,5} , 可以利用 sizeof(arr)/sizeof(arr[0]) 的方式來(lái)求字符串長(zhǎng)度 , 需要注意的是,sizeof 計(jì)算出的字符串長(zhǎng)度包括了本身隱含的‘\\0’;對(duì)于一個(gè)自定義輸入的數(shù)組,如:int arr[10] , 同樣的方法并不能

    2024年02月16日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包