在团结CSHARP,我想打一个GetOrAddComponent方法,这将简化respectives 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>();
}
}}
Run Code Online (Sandbox Code Playgroud)
现在我可以上这堂课...:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
...这样可行:
// class whatever : MyMonoBehavior {
BoxCollider boxCollider = GetOrAddComponent(child, typeof(BoxCollider)) as BoxCollider;
Run Code Online (Sandbox Code Playgroud)
但我希望我能这样写:
BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();
Run Code Online (Sandbox Code Playgroud)
我能提出的唯一想法是做得太复杂(用Transforma 代替每个MyTransform),因此不值得尝试的麻烦.至少不只是为了更好的语法.
但是吗?或者还有其他方法可以实现吗?
您是否尝试过使用扩展方法?你可以像这样声明它们:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以像实例方法一样调用它,然后:
child.GetOrAddComponent<BoxCollider>();
Run Code Online (Sandbox Code Playgroud)
有关扩展方法的详细信息,请参阅上面的链接.
| 归档时间: |
|
| 查看次数: |
1295 次 |
| 最近记录: |