2013-11-27 5 views
2


Я создаю игру с башней в Unity, и я столкнулся с проблемой.
У меня есть класс Unit, где у моих мобов есть параметры, такие как HP, урон, тип, скорость и т. Д. И метод Hit (int damage) (который повреждает блок). И у меня есть класс для каждого типа единиц: воин, рейнджер, маг и т. Д., Которые наследуют. Класс объекта
Башня начинает стрелять, когда моба входит в зону его действия. Башни не имеют пули, ракеты или что-то еще, чтобы стрелять. Вопрос в том, как назвать этот метод Хит из сценария башни?
Для каждого устройства у меня есть сборник с двумя скриптами на нем: Единица и, например, Танк. Я думаю, это неправильно, потому что у меня есть 2 класса Unit: один только Unit и один унаследованный, например, Tank. Так что это не кажется правильным:Метод вызова из родительского объекта 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. 

Так что это правильный способ вызова Hit?

ответ

2

Следующий код будет извлекать объект Unit, даже если он является унаследованным.

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

Однако

Для каждого блока я имею сборный с 2 ​​сценариями на нем: Unit и, для например, танка. Я предполагаю, что это не так, потому что у меня есть 2 класса классов: один только Unit и один унаследованный, например, Tank.

Это не звучит - Вы не должны иметь блок и унаследованный класс Unit на том же GameObject. Я думаю, вам, возможно, придется вернуться к тому, что вы делаете. Существует несколько способов достижения того, что, как я думаю, вы пытаетесь достичь. Вот один я недавно:


Интерфейсы

Это мой личный предпочтительный метод. Вы применяете интерфейсы к каждому из ваших классов - Warrior, Mage и т. Д. Одним из таких интерфейсов может быть IDamagable, который определит некоторые свойства, такие как Health, TakeDamage (int) и т. Д.

Если вы еще не использовали интерфейсы до , Я нашел этот Unity3D конкретным video tutorial here.

Я также использую этот фантастический метод расширения, который вы можете поместить в Utilities класс где:

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

Спасибо. Я просто разделил Единицу и другие. Может быть, это нехорошее решение, но отлично работает в моем случае. И спасибо за ссылку. Я даже не слышал об этом в Единстве. – user3043365

Смежные вопросы