Пятница, 19 Апреля 2024, 15:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вынести переменную из столкновения.
Вынести переменную из столкновения.
ArtemSДата: Понедельник, 11 Сентября 2017, 18:14 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Есть код
Код

public class Health : MonoBehaviour {

    public float health;
    float damage;    
    public  EnemyShot shot;

    void OnTriggerEnter2D (Collider2D other)
    {
        
        if (other.tag == "EnemyBullets")
        {
            EnemyShot shot = GetComponent<EnemyShot>();
            damage = shot.BulletDamage;            

            Debug.Log("enemy" + damage);

            health -= damage;
        
            if (health <= 0)
            {                
                Destroy(gameObject);
            }
        Destroy(other.gameObject);
        }
    }
}


Как можно вытащить переменную урона из пули, а то у меня пишет что объект не найден ?

NullReferenceException: Object reference not set to an instance of an object
Health.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/SpaceAdventures/Scripts/Health.cs:17)


хуяк, хуяк и в продакшн
VuvkДата: Понедельник, 11 Сентября 2017, 18:59 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
В строке
Код
EnemyShot shot = GetComponent<EnemyShot>();

ты берешь значение поля класса Health:
Код
public  EnemyShot shot;

Оно наверное не назначено и потому ты получаешь
Цитата
NullReferenceException: Object reference not set to an instance of an object

Что и означает - ссылка на объект не назначена.
Подозреваю, что EnemyShot - это скрипт на пуле?
Тогда код надо изменить:
Код

public class Health : MonoBehaviour
{
    public float health;
    float damage;    
    EnemyShot shot;

    void OnTriggerEnter2D (Collider2D other)
    {
        if (other.CompareTag("EnemyBullets"))
        {
            shot = other.gameObject.GetComponent<EnemyShot>();
            if (shot)
            {    
                damage = shot.BulletDamage;        
                health -= damage;
        
                if (health <= 0)
                    Destroy(gameObject);
            }
   
            Destroy(other.gameObject);
        }
    }
}


Сообщение отредактировал Vuvk - Понедельник, 11 Сентября 2017, 19:02
ArtemSДата: Вторник, 12 Сентября 2017, 04:13 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Цитата Vuvk ()
Подозреваю, что EnemyShot - это скрипт на пуле?


Блин!! я же пытаюсь взять переменную с противника, а не с пули!!!! :p

А можно как-то все пули объединить, или нужно будет на объект вешать все префабы пуль чтобы он брал с нихъ значение "damage" ? blink ....или придется создавать один скрипт под все пули сразу...как-то это некрасиво


хуяк, хуяк и в продакшн
VuvkДата: Вторник, 12 Сентября 2017, 05:44 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
ArtemS, создай префаб пули с нужным скриптом. В чем проблема-то?

Сообщение отредактировал Vuvk - Вторник, 12 Сентября 2017, 05:46
ArtemSДата: Вторник, 12 Сентября 2017, 12:09 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Цитата Vuvk ()
В чем проблема-то?


Код
shot = other.gameObject.GetComponent<EnemyShot>();


тут надо будет задавать объект столкновения, иначе он будет не видеть объект, получается пишу

Код
public  EnemyShot shot;


Отсюда и вытекает мой вопрос. если у меня 2 разных врага (каждый имеет свой префаб пули, который отличается по скрипту атаки: траектория движения пули, тип атаки и прочие характеристики разные). То мне придется добавить 2 таких объекта на игрока, а если у меня таких 20 врагов, то придется добавить все 20 объектов на игрока. И на все прифабы всех врагов мне придется вешать все возможные виды атак моего игрока. Вот я и спрашиваю, можно как-то этого избежать или страдать и вешать хренову тучу объектов?


хуяк, хуяк и в продакшн
VuvkДата: Вторник, 12 Сентября 2017, 12:17 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
ArtemS, странная логика. В EnemyShot же есть публичное поле BulletDamage (float)??

Создаешь объект "пуля1", на него вешаешь скрипт EnemyShot, выставляешь BulletDamage 10, сохраняешь префаб.
Создаешь объект "пуля2", на него вешаешь скрипт EnemyShot, выставляешь BulletDamage 20, сохраняешь префаб.
Теперь у тебя целых два вида пуль с разным уроном.
ArtemSДата: Вторник, 12 Сентября 2017, 17:57 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Vuvk, это понятно, но если у меня снаряд движется не только прямо, а допусти самонаводящаяся ракета, что-то что движется по дуге, имеет разрывной эффект, может 3 пули в разные стороны летит, получается мне нужно будет создавать EnemyShotBullet, EnemyShoRocket, EneyShotAOE и тд и тп и все эти скрипты вешать на игрока и точно так же с противником, если по ходу игры я смогу в менюшке изменять оружие и тем самым меняя основной скрипт снарядов, то мне нужно вешать скрипы всех снарядов на всех врагов....короче я понял..буду делать отдельно скрипт на урон и на все остальные свойства снарядов) спасибо за помощь :D

хуяк, хуяк и в продакшн

Сообщение отредактировал ArtemS - Вторник, 12 Сентября 2017, 18:46
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вынести переменную из столкновения.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг