Есть такое понятие как контекст. Если переменная создана внутри одного блока кода, она не будет видима нигде, кроме этого и дочерних ему блоков кода, коими являются как методы, так и конструкции типа if. В вашем коде есть два фрагмента:
if (!oneApple) {
if (Input.GetKeyUp(KeyCode.Q)) {
createApple();
GameObject apple = GameObject.Find("apple");
oneApple = true;
}
}
if (oneApple) {
apple.transform.position -= new Vector3(0, 0, 5 * Time.deltaTime);
if (apple.transform.position.z < -15) {
Destroy(apple);
oneApple =false;
}
}
Не понятно, идут они вместе или в разных методах, но даже на этом уровне видно, что контекст переменной apple находится исключительно внутри блока первого фрагмента кода. Решается это путём создания переменной класса. Если таковая уже есть, тогда из первого фрагмента удалите GameObject, чтобы получилось.
if (!oneApple) {
if (Input.GetKeyUp(KeyCode.Q)) {
createApple();
apple = GameObject.Find("apple");
oneApple = true;
}
}
И, на будущее, вставляйте скрипты внутрь соответствующего тега.
Пара непрошенных советов// Данный код
GameObject createApple() {
GameObject result = new GameObject("apple");
GameObject apple = null;
apple = apllePrefab;
Vector3 applePos = transform.position + new Vector3 (1, 0.5f,1);
if (apple != null) {
GameObject go = Instantiate(apllePrefab, applePos,Quaternion.identity);
}
return result;
}
// Можно заменить на такой без потери смысла
GameObject сreateApple() {
var applePos = transform.position + new Vector3(1, 0.5f, 1);
return Instantiate(apllePrefab, applePos, Quaternion.identity);
}
// Далее в этом фрагменте вы сначала помещаете объект на сцену, а затем пытаетесь его найти
if (!oneApple) {
if (Input.GetKeyUp(KeyCode.Q)) {
createApple();
apple = GameObject.Find("apple");
oneApple = true;
}
}
// Не то чтобы метод GameObject.Find вообще не стоило
// никогда использовать, но обычно есть более практичные
// способы это сделать. Например передать прямую ссылку:
if (!oneApple) {
if (Input.GetKeyUp(KeyCode.Q)) {
apple = сreateApple();
oneApple = true;
}
}