[英]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()方法,這似乎也不對,我的意思是,我想應該有,但並非總是如此。
所以這是一個多部分的問題:
如果我有(例如) FlightingAlienController和WalkingAlienController,而不必專門查詢對象名稱,然后進行潛在的大切換,如何確定自己根據敵人的類型調用相關的控制器? 如果我只能在一個GameObject上附加一個腳本,那么無論我叫什么名字,為什么我不能只引用“腳本”?
如何檢查是否有TakeHit()方法可用,還是要確保我始終在標記為“ Alien”的任何內容上公開該方法?
額外的問題是,控制器名稱周圍的<>有什么用,我是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.