Как я могу использовать значение переменной в качестве имени переменной в другом скрипте? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть проект Unity с файлом конфигурации (для имен анимов)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public static class Anims{

public const string anim1= "NameOf anim1";
public const string anim2= "NameOf anim2";
public const string anim3= "NameOf anim3";
...
}
public enum animNames { anim1, anim2,anim3...}

, и в другом сценарии я хочу активировать анимацию, используя

public animNames name_Of_The_Anim_I_Want_To_Activate;

, моя проблема заключается в преобразованииname_Of_The_Anim_I_Want_To_Activate.ToString() в фактическое имя анимации

, какой инструмент я могу использовать, чтобы превратить name_Of_The_Anim_I_Want_To_Activate = anim1 в "NameOf anim1";

Я хочу просмотреть перечисление, так как на каждом есть несколько кнопокзапуск другой анимации 1. Я не хочу использовать наследование или несколько сценариев 2. Я хочу попробовать более элегантный способ, чем оператор switch. вот почему я не могу перечислить, чтобы иметь возможность получить имя переменной.

Редактировать: В конце концов я выбросил идею «Статический конфигурационный файл» для монобезопасного менеджера, тогда я мог бы иметь (статические / постоянные или нет) публичныеstring anim1 = "name1";public string anim2 = "name2";

public enum CompAnim
{
   Company1,
   Company2,
}

и используйте

public string CompanyAnim(CompAnim comp)
{
    string toRun = 
    this.GetType().GetField(comp.ToString()).GetValue(this).ToString();
    return toRun;
}

, благодаря Камиле за элегантное решение, это именно то, что я искал.

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Предполагая, что в Anims у вас есть:

public string anim1 = "someAnimation";

В сценарии, в котором вы храните фактическую анимацию:

public string someAnimation = "theActualAnimationName";

...

string toRun = this.GetType().GetField(someAnimNamesEnumValue.ToString()).GetValue(this);

Это назначит "theActualAnimationName" в переменную toRun

Если вы храните анимации как объекты анимации, а не как строки, вы можете использовать их также непосредственно с помощью вышеуказанного метода.

Редактировать: Кроме того, вы можете посмотреть, что такое отражение (это то, что делает код)

0 голосов
/ 16 октября 2019

Попробуйте добавить вспомогательную функцию, подобную этой:

    public static string GetStringValue(animNames enumTarget)
    { 
        switch (enumTarget)
        {
            case animNames.anim1:
                return Anims.anim1;
                break;
            case animNames.anim2:
                return Anims.anim2;
                break;
            case animNames.anim3:
                return Anims.anim3;
                break;
            default:
                return "Wrong Enum Value Sent!!"; 
        }  
    }

Обновление

Если вы можете использовать Dictionary<string,string>, тогда вы можете сделать это:

using System.Collections.Generic;
using System.Linq;


public static Dictionary<string, string> _AnimNames = new Dictionary<string, string>();

зарегистрируйте подобные записи

    _AnimNames.Add("anim1", "NameOf anim1");
    _AnimNames.Add("anim2", "NameOf anim2");
    _AnimNames.Add("anim3", "NameOf anim3");

Создайте вспомогательный метод, подобный этому:

    public static string GetStringValue(animNames enumTarget)
    {
        var key = System.Enum.GetName(typeof(animNames), enumTarget);
        var nameEntry = _AnimNames.FirstOrDefault(x => x.Key == key);
        var nameValue = nameEntry.Value;

        return nameValue;
    }

, чтобы, наконец, вы могли использовать его следующим образом:

     name_Of_The_Anim_I_Want_To_Activate = animNames.anim2;

     var name = GetStringValue(name_Of_The_Anim_I_Want_To_Activate);
0 голосов
/ 16 октября 2019

Вы должны просто добавить ссылку на класс Anims в другом скрипте, а затем получить доступ к переменным Anims. Если у вас нет статического класса и статических членов.

В вашем случае вы просто выбираете свойства Anims, такие как:

var name_Of_The_Anim_I_Want_To_Activate = Anims.anim1;

Вот почему у вас есть статический класс и статический член, поэтому вам не нужно создавать экземпляр / объект класса для доступа к переменной класса Anims.

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