获取从基类c#派生的组件

时间:2018-01-31 10:28:43

标签: c# unity3d

我在ac#环境中工作并且正在创建一个基类,并希望有其他类,如StormyWeather.csSunnyWeather.cs,并且这些类派生自基类BaseWeather.cs < / p>

public class BaseWeather: MonoBehaviour{
    public ParticleSystem particleSystem;
    public AudioClip weatherAudio;

    public string Name;
    public float AudioFadeTime = 0.25f;

    public float LightDimTime = 0.1f;
    public float MinimumIntensity = 0f;
    public float MaximumIntensity = 1f;
    public float Intensity = 0.25f;

    private void Start(){
        particleSystem.enableEmission = false;
    }

    public virtual void Weather (){
        if (WeatherSystem.Instance._debugState == DebugLevel.Full) {
            Debug.Log (Name + " Starting at: " + Time.timeSinceLevelLoad);
        }

        particleSystem.enableEmission = true;
    }
}

反过来,SunnyWeather.cs可能看起来像这样

public class SunnyWeather : BaseWeather {
    public override void Weather(){
        base.Weather ();
    }
}

如何查看/获取源自BaseWeather.cs

的游戏对象的第一个脚本

为了澄清我正在使用unity并且SunnyWeather.cs将附加到gameObject我想知道如何在继承的gameObject上找到 First Component (为了更好来自BaseWeather.cs

的术语

原因是我会为每个天气设置多个脚本,例如SunyWeather.cs, StormWeather.cs, SnowWeather.cs,它们都来自BaseWeather.cs

编辑:

我目前正在使用它来调用它,但不知道这是否是正确的方法 GetComponent<BaseWeather>().Weather();

2 个答案:

答案 0 :(得分:3)

为了回答您的大部分疑虑,我可以说是的,您目前正在以正确的方式进行,但只有在符合您需求的情况下

GetComponent将返回与您的查询匹配的第一个组件,在这种情况下,该组件可由组件类型分配。这意味着如果您将基类放在查询中,它将返回第一次出现的派生类型或该类型。

要确保这是正确的组件,您可以使用检查器视图将其置于其他组件之上,或通过调用GetComponents将其过滤掉,然后遍历所有匹配的组件。

缩短我的答案,如果您有多个BaseWeather组件,则应使用GetComponents<BaseWeather>方法,并在任何其他情况下过滤掉您想要的方法,只需使用GetComponent<BaseWeather>方法。

答案 1 :(得分:-2)

如果我理解了这个问题,你可以使用以下方法识别继承:

    (from assemblies in AppDomain.CurrentDomain.GetAssemblies()
        from types in assemblies.GetTypes()
        where typeof(IWeatherState).IsAssignableFrom(types)
        select types
    ).ToArray();

但是,要获得First,你需要做一些硬编码,比如队列或堆栈。