这是我的代码:
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并且我的代码有错误,但我无法理解它在哪里。 有人能帮助我吗?
答案 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++)
编辑:break
时i==1
条件的用途是什么?即使你延长for循环,if
也会在两个循环之后(即在i == 0
和i == 1
执行之后)完全打破循环。你应该更深入地解释一下ObjectAttackPoints
。
答案 1 :(得分:3)
欢迎使用StackOverflow。 这段代码存在一些问题:
i < 1
条件不允许for循环执行多次。这段代码可以被视为“意大利面条代码”的一个相当好的例子,除非绝对必要,否则在循环中使用break
运算符被认为是一种不好的做法。
无需使用for循环执行预先知道的有限数量的操作
您可以采取以下措施:
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++)