编辑:Vanethrane使我注意到了我已经在示例中调用类的事实-但我正在寻找那些我无法手动检查的姓名(为此目的是未知的)。
对反射仍然是新知识:我目前正在阅读一堆属性并打印它们-我通过给那些我想要的属性加上特定前缀来消除那些不需要的属性。例如:
var elementProperties = new object();
if(element.GetComponent<MyFirstScript>() != null)
elementProperties = element.GetComponent<MyFirstScript>();
else if(element.GetComponent<MySecondScript>() != null)
elementProperties = element.GetComponent<MySecondScript>();
else
return;
System.Reflection.PropertyInfo[] properties = elementProperties.GetType().GetProperties();
for(int i = 0; i < properties.Length; i++)
{
if(properties[i].Name.Substring(0, 3) != "my_")
continue;
//IF VARIABLE NAME STARTS WITH "my_" DO STUFF WITH properties[i].PropertyType OR GetValue ...
}
麻烦的是这不会自动查找类。我认为,如果我不使用变量名搜索,而是使用诸如bool isReadable = true之类的额外变量来创建一个类,那会更好地满足我的需求。以及其他一些简洁的信息(isEditable,displayName等)。
那么,在这种情况下我该如何处理?
在整个GameObject中进行搜索,而不是在单个脚本中进行搜索。
答案 0 :(得分:1)
您已经有了脚本对象,为什么不直接更改其属性?
MyFirstScript elementproperties = GameObject.GetComponent<MyFirstScript>();
script.my_blah="blahblah";
或您的情况:
elementproperties.variable=change;
您需要将public修饰符添加到您想从外部类获取的任何变量
答案 1 :(得分:1)
仅需获取(Source)
,即可获取与GameObject相连的所有组件的列表。GetComponents(typeof(Component));
与检查组件类型/类型名称相比,您可能更愿意使用Regex查找某些匹配项而不必检查完整名称。
通常,如果您只检查一个变量的不同值,则建议使用switch - case
而不是if - else
,因为这样做效率更高。
不幸的是,这不适用于比较类似的类型
var Type = component.GetType();
// can not use switch for that
if(Type == typeof(MyFirstClass)) // ... etc
但是您可以使用正则表达式来匹配Type名称的特定部分,例如使用
var components = GetComponents(typeof(Component));
foreach(var component in components)
{
var Type = component.GetType();
var TypeName = Type.Name;
// Matching types starting with My
if( Regex.IsMatch(TypeName, "My.*"))
{
// ....
}
}
(对于编写和测试正则表达式,我建议使用https://regexr.com)
或者您可以使用switch - case
来匹配完整的类型名称,例如
foreach(var component in components)
{
var Type = component.GetType();
var TypeName = Type.Name;
switch(TypeName)
{
case "MyFirstClass":
// ...
break;
case "MySecondClass":
// ....
break;
//.... etc
default:
// Nothing matched
return;
}
}
与if - else if - else
语句不同,swith - case
在更多情况下不会失去性能,因此即使要检查的名称很多,这也是最好的方法。