我在ac#环境中工作并且正在创建一个基类,并希望有其他类,如StormyWeather.cs
或SunnyWeather.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();
答案 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,你需要做一些硬编码,比如队列或堆栈。