минус очки и уничтожение объекта

Программирование на Юнити.

минус очки и уничтожение объекта

Сообщение MrDmitry 12 ноя 2018, 19:38

Всем Hi. Столкнулся с такой ситуевеной.
Есть два скрипта, 1 скрипт отвечает за общую логику, второй за поведения врагов. Второй скрипт наследуется от 1.
Хотел сделать так. На экране в рандомном месте появляется enemy, если игрок не успел на него кликнуть и enemy уничтожился то игрок теряет жизнь.
Отрывок из 1 скрита

Синтаксис:
Используется csharp
void GreateEnemy()
    {
        inst_obj = Instantiate(enemy, new Vector3(0,0,0), Quaternion.identity) as GameObject;
    }


private void LifeMenu()
    {
        double x = 6.44f;
        for (int i = 0; i < Misses; i++)
        {
            Vector3  pos = new Vector3((float)x, 4.56f, -0.03f);
            Life_obj[i] = Instantiate(LifeImage, pos, Quaternion.identity) as GameObject;
            x -= 1;
        }
    }

    protected void LifeDestroy()
    {
        Destroy(Life_obj[Misses]);
    }


2 скрипт

Синтаксис:
Используется csharp
using UnityEngine;

public class Enemy : Game {
    //Время жизни enemy
    private int isLife;
    private int isTimeDead = -1;
    System.Random rnd = new System.Random();

    void Start()
    {
        System.Random rand = new System.Random();
        double x = rand.NextDouble() * (6.72f - (-6.72f)) + (-6.72f);
        double y = rand.NextDouble() * (4.37 - (-4.37f)) + (-4.37f);
        gameObject.transform.position = new Vector3((float)x, (float)y, 0);

        isLife = rnd.Next(2, 7);
        InvokeRepeating("DeadEnemy", 0, 0.7f);
    }

    void OnMouseDown()
    {
        Score++;
        Destroy(gameObject);
    }

    void DeadEnemy()
    {
        isTimeDead++;

        if(isTimeDead == isLife)
        {
            Misses--;
            LifeDestroy();
            Destroy(gameObject);
        }
    }
}


В итоге после самоуничтожения enemy получаю ошибку
NullReferenceException: Object reference not set to an instance of an object
Game.LifeDestroy () (at Assets/Script/Game.cs:89)
Enemy.DeadEnemy () (at Assets/Script/Enemy.cs:33)



89 строка в скрипте Game указывает на функцию LifeDestroy()
33 строка в скрипте Enemy указывает также на вызов функции LifeDestroy()
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: минус очки и уничтожение объекта

Сообщение 1max1 12 ноя 2018, 19:48

Объект сдох, но ты пытаешься получить к нему доступ.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: минус очки и уничтожение объекта

Сообщение MrDmitry 12 ноя 2018, 20:09

Ну я понимаю это, только я вызываю LifeDestroy() до того как уничтожу объект. Как мне справиться то с этой ситуацией?
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: минус очки и уничтожение объекта

Сообщение MrDmitry 12 ноя 2018, 20:31

Почему то из скрипта Enemy массив Life_obj пуст

Синтаксис:
Используется csharp
public class Game : MonoBehaviour {

    private GameObject Life_obj;
    public GameObject LifeImage;

     void Start()
    {
        Life_obj = new GameObject[life];
    }

}


Хотя если сделать так

Синтаксис:
Используется csharp
void Update()
    {
        if (Input.GetKeyUp(KeyCode.Escape)) Application.Quit();
        Debug.Log(Life_obj.Length);
    }


То выводится число, а если

Синтаксис:
Используется csharp
    protected void LifeDestroy()
    {
       Debug.Log(Life_obj.Length);
    }


то ошибка
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: минус очки и уничтожение объекта

Сообщение seaman 13 ноя 2018, 10:15

Разберитесь в индексации массивов. Какой индекс у последнего элемента массива?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: минус очки и уничтожение объекта

Сообщение Friend123 13 ноя 2018, 15:54

Не проще ли использовать тут List?
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: минус очки и уничтожение объекта

Сообщение MrDmitry 13 ноя 2018, 21:40

Дело то не совсем в индексах массива. Дело в том что при обращении к индексу массива 0 из класса enemy выдается эта ошибка, при обращении к массиву из класса где он был инициализирован все нормально. Хотя массив объявлен как статик публичный....

PS Ошибка вышла, он был объявлен как просто публичный и соотвественно класс наследник enemy создавал свой экземпляр класса который был не инициализирован ))
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6