我正在使用Unity Engine,其中有一个基类Component
和派生自其中的多个类,包括Transform
,MeshRenderer
和我创建的许多类。
我想执行一个动作(在这种情况下,Destroy
不是所有类型的组件:Transform
,MeshRenderer
,MeshFilter
,{{1} }和Collider
)。我的基本方法如下:
BuildMenuItem
我认为它看起来很丑,我发现缩短它的唯一方法是使用Component[] components = obj.GetComponents<Component>();
foreach (var component in components) {
if (component is MeshFilter)
continue;
if (component is MeshRenderer)
continue;
if (component is Transform)
continue;
if (component is Collider)
continue;
if (component is BuildMenuItem)
continue;
Destroy(component);
}
运算符,但是它并不能解决很多问题,而且IMO看起来更糟。有没有更清洁的实现方式?
答案 0 :(得分:3)
您可以初始化Type
个集合(例如List<Type>
,HashSet<Tepe>
等),向其中添加所有必需的类型(typeof(Transform)
,...) ,然后使用Contains
检查组件类型是否在该集合中。
var types = new HashSet<Type> {typeof(Transform), typeof(MeshRenderer)};
Component[] components = obj.GetComponents<Component>();
foreach (var component in components.Where(c => !types.Contains(c.GetType())))
{
Destroy(component);
}
已更新:
Type[] types = { typeof(Transform), typeof(MeshRenderer) };
Component[] components = obj.GetComponents<Component>();
foreach (var component in components.Where(c => !types.Any(x => c.GetType().IsAssignableFrom(x))))
{
Destroy(component);
}
答案 1 :(得分:0)
创建接口INotDestroyable
,使不可破坏类型Transform
,MeshRenderer
,MeshFilter
,Collider
和BuildMenuItem
实现它,然后在循环上,只需检查元素是否未实现即可。界面不必定义任何属性或成员。