Unity GameObject не будет перемещаться в сторону сборного

unity3d

#unity3d

Вопрос:

У меня есть GameObject со сценарием RobotMovment, который выглядит следующим образом:

 public class RobotMovement : MonoBehaviour {

    private Transform target;
    private float speed = 2f;

    void Start() {
        target = GameObject.FindGameObjectWithTag("Ball").transform;
    }

    void Update() {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);
    }
}
 

Затем у меня есть другой скрипт, помещенный в пустой игровой объект с именем Ball, который выглядит следующим образом:

 public class Ball : MonoBehaviour {

    public GameObject ballPrefab;

    void Start() {
        var randomPosition = new Vector3(Random.Range(GetComponent<Collider>().bounds.min.x, GetComponent<Collider>().bounds.max.x), 0.25f, Random.Range(GetComponent<Collider>().bounds.min.z, GetComponent<Collider>().bounds.max.z));
        Instantiate(ballPrefab, randomPosition, Quaternion.identity);
    }
}
 

Чего я хочу добиться, так это чтобы игровой объект RobotMovement двигался в направлении сборного шара, который появляется в начале игры. Теперь я получаю сообщение: nullreferenceexception object reference not set ошибка при запуске игры. Может быть, положение сборных элементов шара не может быть прочитано сценарием RobotMovement при запуске?

Комментарии:

1. какая строка выдает ошибку?

2. Я думаю, что вам может потребоваться установить начальный порядок выполнения скрипта , как если бы это было не так, вы не можете быть уверены, что мяч Start() будет запущен до RobotMovement Start()

Ответ №1:

Функция Awake() выполняется перед Start() . Рекомендуется использовать Awake() для поиска и назначения ссылок, таких как target , а затем использовать Start() для любой необходимой вам логики инициализации, как только вы будете уверены, что все ваши ссылки на месте.

Тем не менее, ваша нулевая ссылка может быть в нескольких местах, но, скорее всего,:

  • При вызове функции RobotMovement Start() игровой объект с именем «Ball» не найден.
  • В какой-то момент мяч уничтожается или ссылка теряется, и робот перемещается.Выбрасывает Update().
  • Нет компонента коллайдера на Ball, поэтому Ball.Запуск () вызывает.

Одна вещь, о которой вы не просили, но которую важно знать, это то, что GetComponent() — дорогостоящий метод для вызова, поэтому вам лучше вызвать его только один раз:

 Collider collider = GetComponent<Collider>()
var randomPosition = new Vector3(Random.Range(collider.bounds.min.x, collider.bounds.max.x), 0.25f, Random.Range(collider.bounds.min.z, collider.bounds.max.z));
 

Комментарии:

1. Большое спасибо за ответ. Я забыл о методе awake, который решил эту проблему, чтобы поместить Awake() вместо Start() в сценарий Ball. Также спасибо за совет по коллайдеру 🙂