C# 逐个运行任务,其中包含检查
因此,我有多个不同的任务,我想在前一个任务完成后运行。 我可以这样做来运行它们,但我需要检查实体是否存在,它们是否处于活动状态C# 逐个运行任务,其中包含检查,c#,task,C#,Task,因此,我有多个不同的任务,我想在前一个任务完成后运行。 我可以这样做来运行它们,但我需要检查实体是否存在,它们是否处于活动状态 var t1 = await spawnEntities(); if (!t1) goto cancel; var t2 = await goToLocation(); if (!t2) goto cancel; var t3 = await goToPed(); if (!t3) goto cancel; await goToBase(); cancel:
var t1 = await spawnEntities();
if (!t1) goto cancel;
var t2 = await goToLocation();
if (!t2) goto cancel;
var t3 = await goToPed();
if (!t3) goto cancel;
await goToBase();
cancel:
removeEntities();
以下是关于其中一项任务的简短示例:
private async Task<bool> goToLocation()
{
if (!runCheck()) return false;
Vector3 targetLocation = Game.PlayerPed.Position;
officer1.Task.DriveTo(targetLocation);
if (!runCheck()) return false;
while (!policeCar.IsInRangeOf(targetLocation, 50.0f) || !runCheck()) await Delay(500);
if (!runCheck()) return false;
return true;
}
private异步任务goToLocation()
{
如果(!runCheck())返回false;
Vector3 targetLocation=Game.PlayerPed.Position;
officer1.任务.DriveTo(目标定位);
如果(!runCheck())返回false;
当(!policcar.IsInRangeOf(targetLocation,50.0f)| | |!runCheck())等待延迟时(500);
如果(!runCheck())返回false;
返回true;
}
runCheck
方法检查实体是否存在并且它们是否处于活动状态,并返回布尔值。问题是它“有点”混乱,我还有更长更复杂的任务,我必须检查它们,否则如果玩家杀死了一个ped,它可能会挂断脚本并抛出错误。
如果任何返回的布尔值为false,则应转到removeEntities
,该操作将删除存在的实体
有什么更好的解决方案吗?您可以依赖
|
的短路行为:
if (!await spawnEntities()
||!await goToLocation()
||!await goToPed()
||!await goToBase()) {
removeEntities();
}
它当然更容易阅读
对于runChecks()
问题,您可以执行以下操作:
bool allChecksAreGood;
Vector3 targetLocation;
//you will get a warning on the next line the "=" is intentional
if (allChecksAreGood = runCheck()) {
targetLocation = Game.PlayerPed.Position;
officer1.Task.DriveTo(targetLocation);
}
if (allChecksAreGood && (allChecksAreGood = runCheck()){
while (!policeCar.IsInRangeOf(targetLocation, 50.0f) || !runCheck()) {
await Delay(500);
}
}
return allChecksAreGood && runCheck();
注意,我稍微改变了您的逻辑,我假设如果
goToBase()
失败,您可能希望removeenties()
。如果没有,则很容易修复。您可以依赖|
的短路行为:
if (!await spawnEntities()
||!await goToLocation()
||!await goToPed()
||!await goToBase()) {
removeEntities();
}
它当然更容易阅读
对于runChecks()
问题,您可以执行以下操作:
bool allChecksAreGood;
Vector3 targetLocation;
//you will get a warning on the next line the "=" is intentional
if (allChecksAreGood = runCheck()) {
targetLocation = Game.PlayerPed.Position;
officer1.Task.DriveTo(targetLocation);
}
if (allChecksAreGood && (allChecksAreGood = runCheck()){
while (!policeCar.IsInRangeOf(targetLocation, 50.0f) || !runCheck()) {
await Delay(500);
}
}
return allChecksAreGood && runCheck();
注意,我稍微改变了您的逻辑,我假设如果
goToBase()
失败,您可能希望removeenties()
。如果没有,就很容易修复。啊,这太好了!是的,我希望removeenties
最终运行。比使用goto
要好得多,尤其是在async
方法中。当然,这更清楚,但是如果(!runCheck())返回false,那么呢代码>方法内部?有没有什么方法可以在方法内部不断运行它并返回false?啊,这会很好!是的,我希望removeenties
最终运行。比使用goto
要好得多,尤其是在async
方法中。当然,这更清楚,但是如果(!runCheck())返回false,那么呢代码>方法内部?是否有任何方法可以在方法内部不断运行它并返回false?如果(!runCheck())返回false,您是否试图摆脱代码>语句?它们很棘手,因为它们会导致当前函数返回-您无法真正封装该行为,这是我的主要问题。。。我认为有一些神奇的方法可以让它runCheck()
昂贵吗?如果没有,您可以If(runCheck()){Vector3 targetLocation=Game.PlayerPed.Position;officer1.Task.DriveTo(targetLocation);}
等等。最后一个可以简化为returnruncheck()代码>否,它只运行空检查。将尝试一下。如果(!runCheck())返回false,您是否正在尝试摆脱代码>语句?它们很棘手,因为它们会导致当前函数返回-您无法真正封装该行为,这是我的主要问题。。。我认为有一些神奇的方法可以让它runCheck()
昂贵吗?如果没有,您可以If(runCheck()){Vector3 targetLocation=Game.PlayerPed.Position;officer1.Task.DriveTo(targetLocation);}
等等。最后一个可以简化为returnruncheck()代码>否,它只运行空检查。我会试试看。