簡體   English   中英

Unity / C#-在另一個對象上引用方法

[英]Unity/C# - Referencing a method on another object

幾天前,我決定與Unity一起玩游戲,盡管在編程方面起了很大的作用,但Unity和C#對我來說都是全新的。 我正在2D模式下工作。

我創建了一個小游戲來嘗試學習引擎,該引擎(唯一)涉及向外星人發射子彈。 我正在使用bullet對象來檢測它何時擊中某些東西(並摧毀自身),以及在其擊中需要做出反應的東西的情況下-目標對象來決定其響應。

這是BulletController的相關部分,它附加在子彈的每個實例上:

    // Check to see if the bullet is colliding with anything.
void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.tag == "Terrain") {
        this.audio.Play ();
        int smokeIndex = 0;
        GameObject smoke = (GameObject) Instantiate(bulletSmoke[smokeIndex],transform.position,transform.rotation); 
        Destroy (smoke, 5f);
        Destroy (gameObject,0.05f);
    }

    if (col.gameObject.tag == "Enemy") { 
        col.gameObject.GetComponent<BasicAlienController>().TakeHit (1,1);
    }

}

為了完整起見,來自BasicAlienController的(占位符)部分:

public void TakeHit(int damageType, int damageAmount) {
    print ("Taking hits");
}

我最初在如何在外星人的腳本上調用TakeHit時打了一個大問題,但是經過一番嘗試和錯誤之后,發現上面的內容很有效,但是我對它的編寫方式並不滿意。 盲目相信每個敵人上都有一個BasicAlienController似乎是不對的,因為稍后,我可能會使用特定於外星人的控制器來擴展它,以便它們可以以不同的方式做出反應。 盲目相信標記為“外星人”的所有內容上也都可以使用TakeHit()方法,這似乎也不對,我的意思是,我想應該有,但並非總是如此。

所以這是一個多部分的問題:

  1. 如果我有(例如) FlightingAlienControllerWalkingAlienController,而不必專門查詢對象名稱,然后進行潛在的大切換,如何確定自己根據敵人的類型調用相關的控制器? 如果我只能在一個GameObject上附加一個腳本,那么無論我叫什么名字,為什么我不能只引用“腳本”?

  2. 如何檢查是否有TakeHit()方法可用,還是要確保我始終在標記為“ Alien”的任何內容上公開該方法?

  3. 額外的問題是,控制器名稱周圍的<>有什么用,我是C#的新手,以前沒有看過這種語法,為什么不只是使用gameObject.GetComponent(“ BasicAlienController”)或類似名稱呢?

1.如果我有(例如)FlyingAlienController和WalkingAlienController,而不必專門查詢對象名稱,然后進行潛在的大切換,如何確定我根據敵人的類型調用相關的控制器? 如果我只能在一個GameObject上附加一個腳本,那么無論我叫什么名字,為什么我不能只引用“腳本”?

實際上,您可以在GameObject上擁有任意數量的腳本。 我的建議是為每個控制器實現一個接口,然后使用“ SendMessage”。 SendMessage會對性能產生影響,但是對於這種情況,我認為這是正確的選擇。

http://docs.unity3d.com/ScriptReference/GameObject.SendMessage.html

不幸的是,您不能嚴格鍵入該調用,但是可以。 您的代碼可能看起來像這樣:

BasicAlienController:

public class BasicAlienController : MonoBehavior, ITakeHit
{
    // It can only take a single input
    public void TakeHit(object args) 
    {
        // Logic here
        print ("Taking hits in BasicAlienController ");
    }
}

FlyingAlienController:

public class FlyingAlienController : MonoBehavior, ITakeHit
{
    // It can only take a single input
    public void TakeHit(object args) 
    {
        // Logic here
        print ("Taking hits in FlyingAlienController ");
    }
}

BulletController:

// Check to see if the bullet is colliding with anything.
void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.tag == "Terrain") 
    {
        this.audio.Play ();
        int smokeIndex = 0;
        GameObject smoke = (GameObject) Instantiate(bulletSmoke[smokeIndex],transform.position,transform.rotation); 
        Destroy (smoke, 5f);
        Destroy (gameObject,0.05f);
    }

    if (col.gameObject.tag == "Enemy") 
    { 
        int[] hit = new int[] {1, 1};
        col.gameObject.SendMessage("TakeHit", hit);
        // If you don't want to require a receiver
        // col.gameObject.SendMessage("TakeHit", hit, SendMessageOptions.DontRequireReceiver);
    }
}

3.獎勵問題,控制器名稱周圍的<>有什么用,我是C#的新手,以前沒有看過這種語法,為什么不只是使用gameObject.GetComponent(“ BasicAlienController”)或類似的名稱? C#通用。 參見安迪的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM