Показать сообщение отдельно
Старый 09.04.2013, 14:47   #1036
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Фак по Юнити.

Внезапно наткнулся на что то, что не могу понять и найти решение, хотя оно логически должно быть элементарным. Имею пулю, имею стены (на них висит компонент Level). У пули в событии OnCollisionEnter нужно узнать стену в которую попали и изменить у неё переменную health.

Пишу вот так:
    void OnCollisionEnter(Collision col)
    {
        string name = col.gameObject.name;

        if (name == "wall_1" || name == "wall_2")
        {
            
            Level wall = col.gameObject.GetComponent<Level>();

            if (wall)
                wall.health--;
            
        }

        Debug.Log("bullet collided with: "+name);
        m.FreeEntity(body, gameObject);
    }
условие if (wall), никогда не срабатывает, откуда логически следует, что я неправильно ищу нужный мне компонент на полученом при столкновении GameObject'ом. Если его убрать получаю много следующего мата от юнити:
NullReferenceException: Object reference not set to an instance of an object
Shot.OnCollisionEnter (UnityEngine.Collision col) (at Assets/Scripts/Shot.cs:49)
Само столкновение происходит прекрасно, в лог строка записывается, пуля удаляется. Переменная health у компонента Level является public-переменной.

Долго гуглил, но наверно я плохой гуглер, не нашёл решения. Не пойму, что я делаю не так?
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием