【发布时间】:2017-02-14 04:18:23
【问题描述】:
我正在创建一个像蛇一样的游戏。在我下面的代码中,蛇身体的每一部分都是 Character 类的一个实例。当我尝试添加一个新字符时,我收到错误:
ArgumentOutOfRangeException: Argument is out of range. Parameter name: index
其他在线资源建议我尝试引用一个空列表。但我在我的代码中没有看到任何关于这种情况的证据。
也许比我聪明的人能发现我做错了什么?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* This class controls the entire snake. The snake has a list
* of segments that are each a character. We can move along the snake
* by moving the characters bottom up, so that the character replaces
* the position of the character before him.
*/
public class PlayerController : MonoBehaviour {
//how many units will he move per 'frame'
public float moveUnits = 1;
//how often he will move (every quarter second)
public float moveTimer = 0.25f;
private float timeSinceLastMoved;
public KeyCode dir = KeyCode.RightArrow;
//locations of boundaries
public float topBoundary = 4.5f;
public float bottomBoundary = -4.5f;
public float leftBoundary = -8.5f;
public float rightBoundary = 8.5f;
//Holds all characters for the snake body
public List<Character> chars = new List<Character>();
// Use this for initialization
void Start () {
timeSinceLastMoved = Time.time;
getFirstCharacter ();
}
// Update is called once per frame
void Update () {
getInput ();
if (timeSinceLastMoved + moveTimer < Time.time) {
move ();
timeSinceLastMoved = Time.time;
}
}
void getInput() {
//if i press right go right, but i can't be going left when i want to go right
if (Input.GetKeyDown (KeyCode.RightArrow) && dir != KeyCode.LeftArrow) {
dir = KeyCode.RightArrow;
} else if (Input.GetKeyDown (KeyCode.LeftArrow) && dir != KeyCode.RightArrow) {
dir = KeyCode.LeftArrow;
} else if (Input.GetKeyDown (KeyCode.UpArrow) && dir != KeyCode.DownArrow) {
dir = KeyCode.UpArrow;
} else if (Input.GetKeyDown (KeyCode.DownArrow) && dir != KeyCode.UpArrow) {
dir = KeyCode.DownArrow;
}
//for testing character addition
else if (Input.GetKey (KeyCode.A)) {
addCharacter ();
}
}
void move() {
float x = 0;
float y = 0;
if (chars.Count != 0) {
//moves the transform in the appropriate directions
switch (dir) {
case KeyCode.RightArrow:
x = transform.position.x + moveUnits;
y = transform.position.y;
break;
case KeyCode.LeftArrow:
x = transform.position.x - moveUnits;
y = transform.position.y;
break;
case KeyCode.UpArrow:
x = transform.position.x;
y = transform.position.y + moveUnits;
break;
case KeyCode.DownArrow:
x = transform.position.x;
y = transform.position.y - moveUnits;
break;
default:
break;
}
//prevents him from moving outside the set boundaries
x = Mathf.Clamp (x, leftBoundary, rightBoundary);
y = Mathf.Clamp (y, bottomBoundary, topBoundary);
Vector2 pos = new Vector2 (x, y);
//this moves the whole snake
transform.position = pos;
//this moves the first snake segment
chars[0].transform.position = pos;
//for all characters(aka snake segments)
//take the position of the segment before you
for (int i = chars.Count - 1; i > 0; i++) {
chars [i].transform.position = chars [i - 1].transform.position;
}
}
}
void addCharacter() {
//the position of the last segment
Vector2 prevCharPos = chars[chars.Count-1].transform.position;
Vector2 pos;
float x = 0;
float y = 0;
switch (dir) {
case KeyCode.RightArrow:
x = prevCharPos.x - moveUnits;
y = prevCharPos.y;
break;
case KeyCode.LeftArrow:
x = prevCharPos.x + moveUnits;
y = prevCharPos.y;;
break;
case KeyCode.UpArrow:
x = prevCharPos.x;
y = prevCharPos.y + moveUnits;
break;
case KeyCode.DownArrow:
x = prevCharPos.x;
y = prevCharPos.y - moveUnits;
break;
default:
break;
}
pos = new Vector2 (x, y);
//make a new character at the position behind the last segment
Character newChar = Instantiate (chars[chars.Count - 1], pos, Quaternion.identity, this.transform);
//add him to the list
chars.Add (newChar);
}
void getFirstCharacter() {
//find the character that already exists and add him to the list
GameObject firstChar = GameObject.Find ("Character");
if (firstChar != null) {
chars.Add(firstChar.GetComponent<Character>());
}
}
}
【问题讨论】:
-
希望这不是您的第一篇文章,并且您知道如何提问。那么为什么会有这么多不必要的代码行呢?
-
你在哪一行得到这个异常?调试到那时我可以帮助您了解问题的原因!
-
你能告诉我们你在哪一行得到错误吗?
-
只是我的直觉 - 如果您正确使用 for 循环,请检查这一行? for (int i = chars.Count - 1; i > 0; i++) { chars [i].transform.position = chars [i - 1].transform.position;
-
看起来错误出现在
addCharactermethod 中的Character newChar = Instantiate (chars[chars.Count - 1], pos, Quaternion.identity, this.transform);行。如果char.Count为零,chars[chars.Count -1]将抛出异常。