2013-11-27 23 views
2


我在Unity中創建了塔防遊戲,並且遇到了問題。
我有班級單位,我的小怪有類似HP的傷害,傷害,類型,速度等等和方法Hit(int damage)(傷害單位)。而且我還有一種類型的單位:繼承單位類的戰士,遊俠,法師等等。
當暴徒進入觸發區時塔開始射擊。塔沒有子彈,導彈或任何其他射擊。問題是,如何從tower的腳本中調用Hit方法?
對於我預先製作了2個腳本的每個單元:單元和例如Tank。我想這是不對的,因爲我有2個單位類:一個是單位,一個是坦克繼承的單位。 所以這似乎並不正確:來自父對象C#的調用方法Unity3d

if (obj.GetComponent<Unit>()) obj.GetComponent<Unit>().Hit(dmg); 

而且我認爲這是不正確的檢查是這樣的:

if (obj.GetComponent<Tank>()) obj.GetComponent<Tank>().Hit(dmg); 
    else if (obj.GetComponent<Warrior>()) obj.GetComponent<Warrior>().Hit(dmg); 
    else ... etc. 

那麼什麼是選召,打正確的方式?

回答

2

以下代碼將檢索Unit對象,即使它是繼承類型。

if (obj.GetComponent<Unit>()) obj.GetComponent<Unit>().Hit(dmg); 

然而,

對於每一個單位我有預製有2個腳本就可以了:單位,並且對於 例如坦克。我想這是不對的,因爲我有2個單位 職業:一個只是單位,一個例如坦克繼承。

這不健全的權利 - 你不應該有單位在同一個遊戲對象繼承的類股。我想你可能需要重新審視自己如何做事。有很多方法可以實現我認爲你想實現的目標。這是一個我最近使用:


接口

這是我個人的首選方法。您可以將接口應用到每個類 - 戰士,法師等等。一個這樣的接口可以是IDamagable,它將定義一些屬性,如Health,TakeDamage(int)等。

如果您之前沒有使用過接口,我發現這個Unity3D具體video tutorial here

我也用這個夢幻般的擴展方法,你可以拖放到公用事業類的地方:

using System.Linq; 
using UnityEngine; 

public static class Utilities { 
    public static T GetInterface<T>(this GameObject inObj) where T : class { 
     if (!typeof (T).IsInterface) { 
      Debug.LogError(typeof (T).ToString() + ": is not an actual interface!"); 

      return null; 
     } 

     return inObj.GetComponents<Component>().OfType<T>().FirstOrDefault(); 
    } 


    public static IEnumerable<T> GetInterfaces<T>(this GameObject inObj) where T : class { 
     if (!typeof (T).IsInterface) { 
      Debug.LogError(typeof (T).ToString() + ": is not an actual interface!"); 

      return Enumerable.Empty<T>(); 
     } 

     return inObj.GetComponents<Component>().OfType<T>(); 
    } 
} 

您可以使用此代碼如下所示:

var item = someGameObject.GetInterface<IItem>(); 

if (item != null) { 
    // Access a Property from IItem in here: 
    item.Drop(); 
} 
+0

感謝。我剛分裂單位和其他人。可能不是很好的解決方案,但在我的情況下完美。並感謝您的鏈接。我甚至沒有聽說過Unity的這種事情。 – user3043365