[英]Changing the conditions of an if statement inside a function for C# Unity
我正在清理一些代码,更多是出于改进的动力。 我有一个可以打开和关闭一些文本的按钮。 它通过使用指针,单击按钮并淡出所有项目(单击的项目除外)来工作:
public void OnHideClick()
{
AllText.Remove(this.gameObject);
if (newSwitchOne)
{
for (int i = 0; i < 3; i++)
{
switchOn = true;
}
}
else if (newSwitchTwo)
{
for (int i = 0; i < 3; i++)
{
switchOff = true;
}
}
}
更新将根据布尔值是true来运行操作,而忽略错误的版本。 这很好。
void Update()
{
if (switchOn)
{
for (int j = 0; j < 4; j++)
{
TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
TextColor.color = Color.Lerp(TextColor.color, new Color(255, 255, 255, 0), 0.0075f * Time.time);
if (TextColor.color.a <= 0.023f)
{
TextColor.color = new Color(255, 255, 255, 0);
if (TextColor.color.a == 0.0f)
{
switchOn = false;
switchOff = false;
newSwitchOne = false;
newSwitchTwo = true;
}
}
}
}
if (switchOff)
{
for (int j = 0; j < 4; j++)
{
TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
TextColor.color = Color.Lerp(TextColor.color, new Color(255, 255, 255, 1), 0.005f * Time.time);
if (TextColor.color.a >= 0.977f)
{
TextColor.color = new Color(255, 255, 255, 1);
if (TextColor.color.a == 1.0f)
{
switchOn = false;
switchOff = false;
newSwitchOne = true;
newSwitchTwo = false;
}
}
}
}
}
我正在尝试清理此代码。 我对函数和CoRoutines足够了解,并且通过查看关于switchOn和switchOff的类似代码,我想知道是否可以通过将一些值作为参数传递来清理此问题。 我已经尝试过了,似乎对测试color.alpha值的if语句的条件有困难,例如:
if (TextColor.color.a >= 0.977f)
我知道sys.action,但这似乎没有发挥作用。 据我所知,我相信将小于或大于符号'<','>'用作自变量会有所帮助。 我已经进行了一些搜索-但找不到很多帮助我的东西。 也许看错了方向。
谁能帮我这个忙?
这行得通吗? 我试图确定代码的通用性,以尝试减少某些重复。
void Update()
{
var color = switchOn ? new Color(255, 255, 255, 0) : new Color(255, 255, 255, 1);
var multiplier = switchOn ? 0.0075f : 0.005f;
for (int j = 0; j < 4; j++)
{
TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
TextColor.color = Color.Lerp(TextColor.color, color, multiplier * Time.time);
if ((switchOn && TextColor.color.a <= 0.023f) || (!switchOn && TextColor.color.a >= 0.977f))
{
TextColor.color = color;
if ()
{
switchOn = false;
switchOff = false;
newSwitchOne = !switchOn;
newSwitchTwo = switchOn;
}
}
}
}
public void OnHideClick()
{
AllText.Remove(this.gameObject);
if (newSwitchOne)
{
switchOn = true;
}
else if (newSwitchTwo)
{
switchOff = true;
}
}
然后
void Update()
{
if (switchOn || switchOff)
{
var alpha = switchOn ? 0 : 1;
for (int j = 0; j < 4; j++)
{
TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
TextColor.color = Color.Lerp(TextColor.color, new Color(255, 255, 255, alpha), 0.0075f * Time.time);
if ((TextColor.color.a <= 0.023f && switchOn) || (TextColor.color.a >= 0.977f && switchOff))
{
TextColor.color = new Color(255, 255, 255, alpha);
switchOn = false;
switchOff = false;
newSwitchOne = switchOff;
newSwitchTwo = switchOn;
}
}
}
}
错过的其他答案是,有时switchOn和switchOff标志都变为false,在这种情况下我们不应该对Update进行任何操作。
System.Action将不会执行任何操作,因为它们不会返回任何值。 但是Func会的。
void MyMethodWithCondition(Func<bool>condition)
{
if(condition == null){ return; } // or throw exception
if(condition() == true)
{
// Do something
}
}
这是您的用法:
MyMethodWithCondition(()=>{ return TextColor.color.a >= 0.977f; });
MyMethodWithCondition(()=>{ return TextColor.color.a <= 0.977f; });
Func还可以采用一个或多个参数: https : //msdn.microsoft.com/zh-cn/library/bb549151(v=vs.110).aspx
当您要根据条件/值创建代码时,使用此表示法可以产生干净灵活的代码:
test ? value1 : value2
如果您不习惯这种表示法,请按以下步骤操作:测试条件,如果为true,则使用value1,否则使用value2。
例如 :
float testVal =
if (TextColor.color.a == (switchOn ? 0.0f : 1.0f))
...
在上面的示例中,我假设您可以单独使用switchOn(switchOn true>您的switchOn,switchOn false>您的switchOff)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.