Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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# for循环始终只执行一次_C#_Unity3d - Fatal编程技术网

C# for循环始终只执行一次

C# for循环始终只执行一次,c#,unity3d,C#,Unity3d,简要信息图像,我的代码的作用: 这是我的代码: private void CheckObjectAttackPoints(Point AttackPoint){ Point ObjectAttackPoint = AttackPoint; ObjectAttackPoint.X -= 1; int count=0; //This variable for reading how many tiles are false //Check tiles active

简要信息图像,我的代码的作用:

这是我的代码:

private void CheckObjectAttackPoints(Point AttackPoint){
    Point ObjectAttackPoint = AttackPoint;
    ObjectAttackPoint.X -= 1;
    int count=0; //This variable for reading how many tiles are false
    //Check tiles active and ObjectAttackPoint is exist in List
    for (int i=0; i < 1;i++) {
        if (GameManager.AllPoints.Contains (ObjectAttackPoint)) {
            if (!GameManager.TileColliders [ObjectAttackPoint.X, ObjectAttackPoint.Y].activeSelf) {
                count++;
                ObjectAttackPoints [i] = ObjectAttackPoint;
                Debug.Log (ObjectAttackPoints [i].X +", " + ObjectAttackPoints [i].Y);
            }
        }
        if (i == 1) {
            break;
        }
        ObjectAttackPoint.X += 2;
    }

    if (count > 0) {
        Debug.Log ("Object can attack " + count + " points");
    }

}
private void CheckObjectAttackPoints(点AttackPoint){
Point ObjectAttackPoint=攻击点;
ObjectAttackPoint.X-=1;
int count=0;//此变量用于读取有多少平铺为false
//检查互动程序是否处于活动状态,并且列表中是否存在ObjectAttackPoint
对于(int i=0;i<1;i++){
if(GameManager.AllPoints.Contains(ObjectAttackPoint)){
如果(!GameManager.TileColleders[ObjectAttackPoint.X,ObjectAttackPoint.Y].activeSelf){
计数++;
ObjectAttackPoints[i]=ObjectAttackPoint;
Log(ObjectAttackPoints[i].X+,“+ObjectAttackPoints[i].Y);
}
}
如果(i==1){
打破
}
ObjectAttackPoint.X+=2;
}
如果(计数>0){
Log(“对象可以攻击”+计数+“点数”);
}
}
因此,此方法需要
AttackPoint
,它已经具有
AttackPoint.Y-1
值,我们只需检查
AttackPoint.X
是否存在于
列表中,并检查此点的对象是否处于活动状态。在方法开始时,
AttackPoint.X
将其值减少1

我的问题是,即使有两个tile未激活,控制台也只返回一个点(示例图像:0,0和0,2 tile未激活,控制台只返回count=1,tile的点为0,0),这意味着该方法只检查一个tile,我的代码有错误,但我无法理解它在哪里。
有人能帮我吗?

错误在循环定义中:

对于(int i=0;i<1;i++)

这意味着对于i=0,代码只执行一次。您可以这样修复它:

for (int i=0;i<=1;i++)

for(int i=0;i您的
for
循环始终只执行一次,您方法的代码与此等效:

private void CheckObjectAttackPoints(点AttackPoint){
Point ObjectAttackPoint=攻击点;
ObjectAttackPoint.X-=1;
int count=0;//此变量用于读取有多少平铺为false
//检查互动程序是否处于活动状态,并且列表中是否存在ObjectAttackPoint
if(GameManager.AllPoints.Contains(ObjectAttackPoint)){
如果(!GameManager.TileColliders[ObjectAttackPoint.X,ObjectAttackPoint.Y].activeSelf){
计数++;
ObjectAttackPoints[0]=ObjectAttackPoint;
Log(ObjectAttackPoints[0].X+,“+ObjectAttackPoints[0].Y);
}
}
ObjectAttackPoint.X+=2;
如果(计数>0){
Log(“对象可以攻击”+计数+“点数”);
}
}
如果要循环浏览
ObjectAttackPoint
的所有元素,应使用

如果是
列表

for(int i=0;i
如果是
数组

for(int i=0;i
EDIT:当
i==1
时,
break
条件有什么用?即使您扩展for循环,该
if
将在两个循环后(即在对
i==0
i==1执行后)完全中断循环。您应该更深入地解释什么是
ObjectAttackPoints

欢迎来到StackOverflow。 此代码存在一些问题:

  • i<1
    条件不允许for循环执行多次
  • 此代码可以被视为“意大利面条代码”的一个相当好的示例,在循环中使用
    break
    运算符被认为是一种不好的做法,除非绝对必要

  • 不需要使用for循环来执行预先已知的有限数量的操作

  • 可以对每个攻击点进行检查,并且应采用单独的方法进行imho
  • 您可以按照以下方式进行操作:

    private bool CheckObjectAttackPoint(Point AttackTo)
    {
       return GameManager.AllPoints.Contains(AttackTo) && !GameManager.TileColliders[AttackTo.X, AttackTo.Y].activeSelf
    }
    
    private bool CheckObjectAttackPoint(Point AttackFrom, int xDiff, yDiff)
    {
       var pointToAttack = new Point(AttackFrom.X + xDiff, AttackFrom.Y + yDiff);
       return CheckObjectAttackPoint(pointToAttack);
    } 
    
    现在,您可以通过提供攻击点来使用此方法:

    Point objCurrentPoint = ...; // Currect position is (1;1)
    CheckObjectAttackPoint(objCurrentPoint, -1, -1);
    CheckObjectAttackPoint(objCurrentPoint, +1, -1);
    

    是的,因为
    i<1
    条件不允许for循环执行多次…我又错过了一个最轻微的错误。\指令i==1仅用于中断循环,我只需要2个数组值(点),因此我的循环属性是(int i=0;它根本不需要
    if(i==1)break;
    condition,您只需使用
    for(int i=0;i哦,好吧,break condition只是用于此方法中的测试,谢谢您的帮助!我正在尝试组织我的代码,我的经验不足以理解如何找到最佳方法,但我一直在练习,因此感谢您的描述