C#Unity:在附加到GameObject的脚本中获取公共类

时间:2018-10-09 21:11:58

标签: c# unity3d reflection

编辑: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中进行搜索,而不是在单个脚本中进行搜索。

2 个答案:

答案 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在更多情况下不会失去性能,因此即使要检查的名称很多,这也是最好的方法。