繁体   English   中英

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

[英]Get components that derive from base class c#

我在ac#环境中工作,正在创建基类,并且希望拥有其他类,如StormyWeather.csSunnyWeather.cs并让这些类从基类BaseWeather.cs

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派生的BaseWeather.cs上的第一个脚本

为了阐明我使用的是统一性, SunnyWeather.cs将附加到gameObject上,我想知道如何在从BaseWeather.cs类继承(更好地讲)的BaseWeather.cs上找到第一个组件

原因是对于每种天气SunyWeather.cs, StormWeather.cs, SnowWeather.cs我将有多个脚本,如SunyWeather.cs, StormWeather.cs, SnowWeather.cs ,它们均源自BaseWeather.cs

编辑:

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

为了回答您的大多数担忧,我可以说是的,您目前正在以正确的方式进行操作,但前提是它符合您的需求

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

为了确保这是正确的组件,您可以使用检查器视图将其放置在其他组件之上,或者通过调用GetComponents对其进行过滤,然后遍历所有匹配的组件。


BaseWeather ,如果您有多个BaseWeather组件,则应使用GetComponents<BaseWeather>方法,而在任何其他情况下,只要使用GetComponent<BaseWeather>方法就可以过滤出BaseWeather组件。

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

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

但是,要获得“第一”,您将需要做一些硬编码,例如队列或堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM