for循环总是只执行ONCE

时间:2018-03-15 08:33:15

标签: c# unity3d

简要信息图片,我的代码所做的事情: enter image description here

这是我的代码:

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");
    }

}

因此,此方法需要AttackPoint已经有AttackPoint.Y-1值,我们只需检查AttackPoint.X中是否存在List并检查此时对象是否有效。在方法开始时,AttackPoint.X将其值减1。

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

3 个答案:

答案 0 :(得分:4)

您的for循环始终只执行ONCE,您的方法代码与此相同:

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
    if (GameManager.AllPoints.Contains(ObjectAttackPoint)) {
        if (!GameManager.TileColliders[ObjectAttackPoint.X, ObjectAttackPoint.Y].activeSelf) {
            count++;
            ObjectAttackPoints[0] = ObjectAttackPoint;
            Debug.Log(ObjectAttackPoints[0].X + ", " + ObjectAttackPoints[0].Y);
        }
    }
    ObjectAttackPoint.X += 2;

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

如果要循环浏览ObjectAttackPoint的所有元素,则应使用

如果是List

for (int i=0; i < ObjectAttackPoint.Count;i++)

如果它是array

for (int i=0; i < ObjectAttackPoint.Length;i++)

编辑breaki==1条件的用途是什么?即使你延长for循环,if也会在两个循环之后(即在i == 0i == 1执行之后)完全打破循环。你应该更深入地解释一下ObjectAttackPoints

答案 1 :(得分:3)

欢迎使用StackOverflow。 这段代码存在一些问题:

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

  3. 无需使用for循环执行预先知道的有限数量的操作

  4. 检查每个攻击点是否可以,并且imho 应该以单独的方法完成。
  5. 您可以采取以下措施:

    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);
    

答案 2 :(得分:2)

错误在循环定义中:

  

for(int i = 0; i&lt; 1; i ++)

这意味着代码只会执行一次,因为i = 0。你可以像这样解决它:

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