Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取布尔值作为字符串_C#_Unity3d - Fatal编程技术网

C# 获取布尔值作为字符串

C# 获取布尔值作为字符串,c#,unity3d,C#,Unity3d,我有两个脚本。我使用一个脚本来更改另一个脚本的bool变量。我希望在第一个脚本中使用字符串作为布尔变量(在第二个脚本中引用bool)。我如何做到这一点 我想实现这一点,因为我正在将第一个脚本添加到多个游戏对象中,并且每个GO都具有从第二个脚本激活/停用某些bool的功能。我想从我的inspector窗口中为脚本1中的每个bool提供名称 public Script2 script2; public string nameOfBool; void Start () { scrip

我有两个脚本。我使用一个脚本来更改另一个脚本的bool变量。我希望在第一个脚本中使用字符串作为布尔变量(在第二个脚本中引用bool)。我如何做到这一点

我想实现这一点,因为我正在将第一个脚本添加到多个游戏对象中,并且每个GO都具有从第二个脚本激活/停用某些bool的功能。我想从我的inspector窗口中为脚本1中的每个bool提供名称

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 $_
})