我有一个带有配置文件的统一项目(用于动画名称)
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提供的优雅解决方案,这正是我所要的。
答案 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);