【问题标题】:Calling method from parent object C# Unity3d从父对象C#Unity3d调用方法
【发布时间】:2013-11-28 08:27:37
【问题描述】:


我正在Unity中创建一个塔防游戏,我遇到了一个问题。
我有 Unit 类,其中我的小怪有 HP、伤害、类型、速度等参数和方法 Hit(int damage)(损坏单位)。我为每种类型的单位都有一个类:战士、游侠、法师等,它继承了 Unit 类
当暴徒进入其触发区域时,塔开始射击。塔没有子弹、导弹或其他任何东西可以射击。问题是,如何从 Tower 的脚本中调用该 Hit 方法?
对于每个单元,我都有一个带有 2 个脚本的预制件:单元,例如,坦克。我想这是不对的,因为因此我有 2 个 Unit 类:一个只是 Unit,一个由例如 Tank 继承。 所以这似乎不对:

    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 的正确方式?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    以下代码将检索 Unit 对象,即使它是继承类型。

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

    然而,

    对于每个单元,我都有一个带有 2 个脚本的预制件:单元和,对于 例如,坦克。我想这是不对的,因为因此我有 2 个单元 类:一个只是 Unit,一个由 Tank 等继承。

    这听起来不对 - 您不应该在同一个游戏对象上拥有 Unit Unit 的继承类。我认为你可能需要重新审视你是如何做事的。有很多方法可以实现我认为您正在努力实现的目标。这是我最近使用的一个:


    接口

    这是我个人的首选方法。您将接口应用于每个类 - 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();
    }
    

    【讨论】:

    • 谢谢。我刚刚拆分了 Unit 和其他人。可能不是很好的解决方案,但在我的情况下非常有效。并感谢您的链接。在 Unity 中我什至没有听说过这样的事情。
    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 2018-04-09
    • 2016-06-19
    • 2012-07-13
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多