我正在清理一些代码,更多的是有改进的动力。我有一个按钮可以打开和关闭一些文本。它的工作原理是使用一个指针,点击一个按钮并淡出所有项目,除了点击的一个:
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;
}
}
}
更新根据boolean为true运行操作,并忽略false版本。这很好。
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足够好,通过查看if switchOn和switchOff的类似代码我想知道我可以通过在参数中传递一些值来清理它。我试过这个并且似乎对测试color.alpha值的if语句的条件有困难,例如:
if (TextColor.color.a >= 0.977f)
我知道sys.action但这似乎没有发挥作用。据我所知,我相信改变小于或大于符号'&lt;','&gt;'作为一个论点 救命。我做了一些搜索 - 但没有找到太多帮助我。也许看错了方向。
任何人都可以为我解释这个问题吗?
答案 0 :(得分:3)
这会有用吗? 我试图确定代码的通用性,以尝试减少一些重复。
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;
}
}
}
}
答案 1 :(得分:2)
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做任何事情。
答案 2 :(得分:2)
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/en-us/library/bb549151(v=vs.110).aspx
答案 3 :(得分:1)
如果您想根据条件/值创建代码,使用此表示法可以获得干净灵活的代码:
test ? value1 : value2
如果您不习惯这种表示法,请注意它是如何工作的:测试条件,如果为true,则使用value1,否则使用value2。
例如:
float testVal =
if (TextColor.color.a == (switchOn ? 0.0f : 1.0f))
...
在上面的示例中,我假设您可以单独使用switchOn(switchOn true&gt;您的switchOn,switchOn false&gt;您的switchOff)