在 Unity csharp 中,我想制作一个GetOrAddComponent
方法,这将简化相应的GetComponent
和AddComponent
(我认为没有充分的理由)
通常的方法是:
// this is just for illustrating a context
using UnityEngine;
class whatever : MonoBehavior {
public Transform child;
void whateverMethod () {
BoxCollider boxCollider = child.GetComponent<BoxCollider>();
if (boxCollider == null) {
boxCollider = child.gameObject.AddComponent<BoxCollider>();
}
}}
现在我可以上课了。 。 。 :
public class MyMonoBehaviour : MonoBehaviour {
static public Component GetOrAddComponent (Transform child, System.Type type) {
Component result = child.GetComponent(type);
if (result == null) {
result = child.gameObject.AddComponent(type);
}
return result;
}
}
。 。 。所以这有效:
// class whatever : MyMonoBehavior {
BoxCollider boxCollider = GetOrAddComponent(child, typeof(BoxCollider)) as BoxCollider;
但我希望我能这样写:
BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();
我能提出的唯一想法是做得太复杂(用Transform
替换每个MyTransform
)因此不值得尝试。至少不只是为了更好的语法。
但是吗?或者还有其他方法可以实现吗?
答案 0 :(得分:5)
您是否尝试过使用Extension Methods?您可以这样声明它们:
public static class MyMonoExtensions {
public static T GetOrAddComponent<T>(this Transform child) where T: Component {
T result = child.GetComponent<T>();
if (result == null) {
result = child.gameObject.AddComponent<T>();
}
return result;
}
}
您可以将其称为实例方法,然后:
child.GetOrAddComponent<BoxCollider>();
有关扩展方法的详细信息,请参阅上面的链接。
答案 1 :(得分:2)
您可以使用自c#3.0以来的扩展方法
public static MonoBehaviourExtension
{
public static void GetOrAdd(this MonoBehaviour thisInstance, <args>)
{
//put logic here
}
}
答案 2 :(得分:1)
您可以使用扩展方法。
public static class Extensions
{
public static T GetOrAddComponent<T>(this Transform child) where T : Component
{
T result = child.GetComponent<T>();
if (result == null) {
result = child.gameObject.AddComponent<T>();
}
return result;
}
}
现在您可以使用BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();