如何在其他脚本中将变量值用作变量名?

时间:2019-10-16 11:50:03

标签: c# unity3d const

我有一个带有配置文件的统一项目(用于动画名称)

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语句更优雅的方法。这就是为什么我无法使枚举能够到达变量名。

编辑: 最终,我将“静态配置文件”的想法丢给了单行为管理器 那么我可能有(静态/常量或没有)     公共字符串anim1 =“ name1”;     公共字符串anim2 =“ name2”;

public enum CompAnim
{
   Company1,
   Company2,
}

并使用

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

感谢Camile提供的优雅解决方案,这正是我所要的。

3 个答案:

答案 0 :(得分:1)

假设您在Anims中拥有:

public string anim1 = "someAnimation";

在存储实际动画的脚本中:

public string someAnimation = "theActualAnimationName";

...

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

这会将“ theActualAnimationName” 分配给变量 toRun

如果将动画存储为动画对象而不是字符串,则也可以直接通过上述方法使用动画。

编辑: Additionally you might want to look into what reflection is (this is what the code is doing)

答案 1 :(得分:0)

您只需要在另一个脚本中添加Anims类的引用,然后访问Anims的变量即可。如果您没有静态类和静态成员。

在您的情况下,您只需要访问Anims属性,例如:

  

var name_Of_The_Anim_I_Want_To_Activate = Anims.anim1;

这就是为什么因为您具有静态类和静态成员,所以您无需创建类的实例/对象来访问Anims类的变量。

答案 2 :(得分:0)

尝试添加类似于以下内容的辅助函数:

    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);