亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Unity C# 類和對象

Unity C# 類和對象

C#
墨色風雨 2021-11-21 11:01:21
下車,我很抱歉這將是一個相當愚蠢的問題,但我正在努力全面了解對象的目的和用途。具體來說,我在 Unity 工作,但我不確定這是否重要。另外,我還應該提到語言是相當壓倒性的。但這是我正在處理的簡單示例。public class Player : MonoBehaviour {    private string name = "Players Name";    private void Start () {        var nexus = new Player();    }    public static void Using() {        // how are these different?        Attack();        this.Attack();    }    public static void Move() {        print ("The player is moving");     }    private void Attack () {        print ("The player is attacking");     }}public class UsingStuff : MonoBehaviour {    private void Start () {        Player.Move();    }}所以這里是問題:調用函數 Attack() 和 this.Attack 有什么區別?從新手的角度來看,他們似乎做完全相同的事情。然而,我假設我的例子太簡單了。我使用隨機名稱 nexus 創建了 Player 類的對象。但是,當我從不同的類調用函數時,我似乎使用了類名而不是這個變量名。那么創建變量名的目的是什么?我暫時將它放在這兩個上,希望這將有助于解決其他一些問題。感謝您的幫助。
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

調用函數 Attack() 和 this.Attack 有什么區別?


例如,當您編寫類 Player 并且想要使用方法“Attack()”時,您可以通過鍵入 Attack() 或 this.Attack() 來實現。它在兩種情況下都做同樣的事情。


當你使用“這個”時。你保證你使用的方法是在你所在的類上實現的。例如:


public void GroupAttack(DifferentPlayer ally){

    Attack(); 

    ally.Attack();

}


public void GroupAttackWithThis(DifferentPlayer ally){

    this.Attack(); 

    ally.Attack();

}

GroupAttack 和 GroupAttackWithThis 方法之間沒有區別。


我使用隨機名稱 nexus 創建了 Player 類的對象。但是,當我從不同的類調用函數時,我似乎使用了類名而不是這個變量名。那么創建變量名的目的是什么?


發生這種情況是因為您將函數“Move”設為靜態,這意味著對于該類的每個實例,它都會執行完全相同的操作。當您希望一個方法或一個變量對于類的每個實例每次都具有相同的值或具有相同的行為時,使用靜態。如果您的方法不是靜態的,您將需要使用變量的名稱來使用它,那是因為您希望您的方法為每個實例更改他的行為。一個簡單的例子:


public string GetName(){

    return name;

}

此方法將為每個玩家返回一個不同的名稱(將在變量中返回玩家的名稱)。所以如果你這樣做:


Player jhon = new Player();

jhon.name = "Jhon";

String jhonsName = jhon.GetName();

變量“jhonsName”將包含一個值為“Jhon”的字符串。


我希望這對您有用,并祝您游戲愉快。


查看完整回答
反對 回復 2021-11-21
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

Unity MonoBehaviour 與普通 C# 類之間存在一些差異。我建議觀看一些 Unity 教程。Unity 腳本是面向場景的。

  1. 沒有區別。this.Something可用于將某物標記為“來自類對象”(通常為屬性或變量)以與參數區分開來。

  2. 編寫Player nexus = new Player(); 應該是警告,因為您不應該使用 MonoBehaviour 執行此操作。

您可以通過將腳本“播放器”放在游戲對象上來在場景中創建播放器。您應該從 GameObject 訪問 Player 腳本。所以你應該刪除方法上的“靜態”。然后放公共Player播放器;在 UsingStuff 內部(在公共類 UsingStuff 下:MonoBehaviour {)。然后將您的播放器拖到播放器的占位符上。您將在場景中使用 UsingStuff-Script 的 GameObject 上找到它?,F在您可以在 Start 方法中調用 player.Move()(帶有小 p)。

為您的變量名稱嘗試另一種命名方式。它已經存在于每個 MonoBehaviour 中。它指的是腳本所在的游戲對象的名稱。您的命名也應該拋出一個警告。


查看完整回答
反對 回復 2021-11-21
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

執行時Player nexus = new Player();,您正在創建類型 (/class)“Player”的新實例 (/object)。該變量nexus是一個對象引用(即,它指的是您剛剛創建的對象實例)。一旦你有了一個實例,你就可以在那個對象上調用實例方法,設置或讀取它的屬性(順便說一下,你沒有)。由于對該對象(nexus變量)只有一個引用,當該引用超出范圍(在函數結束時)時,該對象不再被任何對象引用并且有資格進行垃圾回收。

當您使用static關鍵字聲明一個方法 (/function) 時,您是在類級別而不是在實例級別創建它。如果你想調用非靜態的UpdateorAttack方法,你必須說nexus.Updateor nexus.Attack。要調用靜態UsingMove方法,您可以使用類名 (Player),如下所示:Player.UsingPlayer.Move。

您發布的代碼無法編譯,是嗎?您不能從靜態方法調用實例方法。您不能調用實例方法Attackthis.Attack靜態方法Using(那里沒有“this”(this是與實例方法關聯的當前對象實例))。最好發布至少可以編譯的代碼(除非你說(在評論中)//this is the code that doesn't compile

您還只在Start方法中創建了一個新的 Player 實例,這有點奇怪。通常,您在其他類或靜態工廠方法中創建對象的實例(并非總是如此,但通常如此)。

閱讀面向對象編程的本質、C# 的static關鍵字和對象實例的本質(一般而言)。您可能還想閱讀 C# 的屬性。

哦,Using從長遠來看,命名某些東西會受到傷害(小寫using是一個 C# 關鍵字,已經有兩個含義)。

最后,回答你的問題,“以這種方式調用實例方法:Attack()或那樣:this.Attack()具有相同的語義?!?nbsp;當然,如上所述,如果您嘗試從靜態方法調用實例方法,則不能使用任何一種形式。


查看完整回答
反對 回復 2021-11-21
  • 3 回答
  • 0 關注
  • 196 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號