C# 获取布尔值作为字符串
我有两个脚本。我使用一个脚本来更改另一个脚本的bool变量。我希望在第一个脚本中使用字符串作为布尔变量(在第二个脚本中引用bool)。我如何做到这一点 我想实现这一点,因为我正在将第一个脚本添加到多个游戏对象中,并且每个GO都具有从第二个脚本激活/停用某些bool的功能。我想从我的inspector窗口中为脚本1中的每个bool提供名称C# 获取布尔值作为字符串,c#,unity3d,C#,Unity3d,我有两个脚本。我使用一个脚本来更改另一个脚本的bool变量。我希望在第一个脚本中使用字符串作为布尔变量(在第二个脚本中引用bool)。我如何做到这一点 我想实现这一点,因为我正在将第一个脚本添加到多个游戏对象中,并且每个GO都具有从第二个脚本激活/停用某些bool的功能。我想从我的inspector窗口中为脚本1中的每个bool提供名称 public Script2 script2; public string nameOfBool; void Start () { scrip
public Script2 script2;
public string nameOfBool;
void Start () {
script2.nameOfBool= true; //Is there a way to do this?
}
脚本2
public bool Bool_1;
public bool Bool_2;
public bool Bool_3;
按名称引用属性并不简单,我建议您在启动时为每个属性创建lambda:
public class Script1
{
public Script2 script2;
public Action<bool> UpdateBool1;
public Action<bool> UpdateBool2;
public Action<bool> UpdateBool3;
void StartUp()
{
UpdateBool1 = (newValue) => script2.Bool_1 = newValue;
UpdateBool2 = (newValue) => script2.Bool_2 = newValue;
UpdateBool3 = (newValue) => script2.Bool_3 = newValue;
}
}
如果要将每个名称与一个名称关联,请将它们存储在
词典中
:
如果要根据更新程序的名称(提前知道)生成更新程序列表,可以通过使用简单的PowerShell脚本生成代码来节省键入时间:
param([string[]]$BoolNames)
$BoolNames.ForEach({
'{{"{0}", (newValue) => script2.{0} = newValue}}' -f $_
})
保存到
.ps1
文件,启动PowerShell,然后运行命令path\to\file.ps1-BoolNames Bool\u 1,Bool\u 2,Bool\u 3,…
为什么需要它?你当然可以做到,但你可能根本不需要它。也许某种字典或开关能更好地满足你的实际需要。因此,请描述您在这里实际想要实现的目标,而不是您认为解决方案可能是什么。@HimBromBeere我将向多个游戏对象添加第一个脚本,因此每个游戏对象都有不同的功能来激活bool。这就是为什么我想看看是否有办法做到这一点。[bool]
是一种值类型,它没有标识-不确定如何使用另一个字符串化的值“在第二个脚本中引用bool”。如果您打算在运行时使用反射来按名称增加属性的值,请将其存储为:nameof(ClassInScript2.Bool_1)
为什么不使用BitArray
或者干脆使用Bool[]
?如果您想要命名布尔值,还可以使用字典。所有这些都应该比使用反射从属性名称中动态访问属性值更容易、更快。。只需将列表
替换为bool
谢谢。你能告诉我这里什么是newValue
,我应该声明它为int/bool吗?newValue
是bool
,如果你愿意,你可以声明它,但这不是必需的(编译器会根据上下文推断它是bool
,因为lambda表达式是动作
),谢谢。我喜欢你的回答。我有一个问题。如果我的第二个剧本中有20-30个bools呢。我是否必须在StartUp()中声明它们中的每一个?有没有一种方法可以让我提到一个{nameOfBool,(newValue)=>script2.Bool_1=newValue}
,然后我可以从我的inspector窗口中给出Bool的名称?@soxe您是否知道/事先有字段名列表,或者您是否希望基于script2
动态发现它们?是的,我已经知道脚本2中的Bool名称。基本上总共有25个布尔。因此,我的理论是,我可以将第一个脚本附加到几个游戏对象上,然后为每个对象提供bool的参考名称。因此,每个游戏对象都有唯一可更改的布尔值。
public class Script1
{
public Script2 script2;
public Dictionary<string, Action<bool>> BoolUpdaters;
void StartUp()
{
BoolUpdaters = new Dictionary<string, Action<bool>>
{
{"first", (newValue) => script2.Bool_1 = newValue}
{"second", (newValue) => script2.Bool_2 = newValue}
{"third", (newValue) => script2.Bool_3 = newValue}
}
}
}
string targetBool = "first";
BoolUpdaters[targetBool](true);
param([string[]]$BoolNames)
$BoolNames.ForEach({
'{{"{0}", (newValue) => script2.{0} = newValue}}' -f $_
})