C # Unity: получить общедоступные классы в сценарии, прикрепленном к GameObject - PullRequest
0 голосов
/ 10 октября 2018

edit: Ванетран привлек мое внимание к тому факту, что я уже звонил в классы в своих примерах - но я ищу тех, чье имя я не могу проверить вручную (оно для этой цели неизвестно).

Все еще плохо знакомы с размышлениями: в настоящее время я читаю кучу свойств и печатаю их - я устраняю нежелательные, задавая нужные мне имена с определенным префиксом.Например:

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 и т..

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Для получения списка всех компонентов, которые прикреплены к GameObject, вы можете просто использовать ( Source )

GetComponents(typeof(Component));

Чем для проверки компонентовтипы / имена типов, которые вы можете использовать Regex для поиска определенных совпадений, не проверяя полное имя.

В общем случае рекомендуется использовать switch - case вместо if - else, если вы проверяете только одну переменную для различных значений, поскольку это намного эффективнее.

К сожалению, это не работает для сравнения типов, таких как

var Type = component.GetType();

// can not use switch for that
if(Type == typeof(MyFirstClass)) // ... etc

Но вы можете использовать Regex для сопоставления определенной части имени типа, используя, например,

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.*"))
    {
       // ....
    }
}

(Для написания и тестированияregex Я рекомендую 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 не теряет производительностьс большим количеством случаев, так что даже если есть много имен для проверки, это может быть лучшим подходом.

0 голосов
/ 10 октября 2018

у вас уже есть объект сценария, почему бы просто не изменить его свойства напрямую?

  MyFirstScript elementproperties = GameObject.GetComponent<MyFirstScript>();

script.my_blah="blahblah";

или в вашем случае:

elementproperties.variable=change;

вам необходимо добавить модификатор public к любым переменнымхочешь получить извне класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...