Пропадает цель для снаряда

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

Пропадает цель для снаряда

Сообщение Heliosis 21 апр 2017, 21:37

В общем, у меня есть скрипты, это да.
Класс героя, от него наследуются все классы прочих героев (уже типа классы, как Маг, там, Воин, ну вы поняли), затем абилка и от нее наследуются все классы прочих абилок (опять же, огненный шар, или, не знаю, молния).

Вот есть скрипты:
Синтаксис:
Используется csharp
public abstract class Ability : MonoBehaviour
{
    public GameObject hero;

    public float cooldown;
    public int manacost;

    public enum AbilityType
    {
        Target,
        Area,
        Effect
    }

    public abstract void onUse();

    public abstract void SetTarget(GameObject _target);
    public abstract void SetHero(GameObject _hero);
}


Синтаксис:
Используется csharp
public class LightningBall : Ability
{
    public float moveSpeed;

    public int damage;
    public int damageBonus;

    public GameObject target;

    private void Awake()
    {
        StartCoroutine(Reinforcing());
    }

    void Update()
    {
        if (target != null)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.transform.position, moveSpeed * Time.deltaTime);
        }
    }

    IEnumerator Reinforcing()
    {
        while (true)
        {
            damage += damageBonus;
            moveSpeed *= 1.1f;
            yield return new WaitForSeconds(1.0f);
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        collision.gameObject.GetComponent<Hero>().currentHealth -= damage;
        DestroyObject(gameObject);
    }

    public override void onUse()
    {
        if (target != null)
        {
            print("123");
            Instantiate(gameObject, hero.transform.position, Quaternion.id[syntax=csharp][/syntax]entity);
        }
    }

    public override void SetTarget(GameObject _target)
    {
        target = _target;
    }

    public override void SetHero(GameObject _hero)
    {
        hero = _hero;
    }
}


Синтаксис:
Используется csharp
public class Hero : MonoBehaviour
{
    public int maxHealth;
    public int currentHealth;

    public int maxMana;
    public int currentMana;

    public Ability[] abilities;

    public bool canPlayThisHero;
    public GameObject controller;

    public float moveSpeed;
    protected Vector2 speed;

    public GameObject target;

    public void dealDamage(int damage)
    {
        currentHealth -= damage;
    }

    public void heal(int heal)
    {
        currentHealth += heal;
    }

    private void Awake()
    {
        currentHealth = maxHealth;
        currentMana = maxMana;
    }

    protected virtual void Update ()
    {
        if (controller == null)
        {
            controller = GameObject.FindGameObjectWithTag("GameController");
        }

        if (controller.GetComponent<HeroChooser>().currentHero == this)
        {
            speed.x = Input.GetAxisRaw("Horizontal") * moveSpeed;
            speed.y = Input.GetAxisRaw("Vertical") * moveSpeed;

            GetComponent<Rigidbody2D>().velocity = speed;
        }
        else
        {
            GetComponent<Rigidbody2D>().velocity = new Vector2();
        }

        target = controller.GetComponent<HeroChooser>().target;
    }
}


Синтаксис:
Используется csharp
public class HeroChooser : MonoBehaviour
{
    public Hero currentHero;
    public GameObject target;

    void Update ()
    {
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector3.forward, 100f);
        Debug.DrawRay(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector3.forward * 100f);

        if (Input.GetMouseButtonDown(1))
        {
            if (hit.collider != null && hit.collider.GetComponent<Hero>() != null && hit.collider.GetComponent<Hero>().canPlayThisHero == true)
            {
                currentHero = hit.collider.GetComponent<Hero>();
            }
            else
            {
                currentHero = null;
            }
        }

        if (currentHero != null)
        {
            if (Input.GetMouseButtonDown(0))
            {
                if (hit.collider != null && hit.collider.gameObject.layer == 8)
                {
                    target = hit.collider.gameObject;
                }
                else
                {
                    target = null;
                }
            }
        }
    }
}
 


Как все работает: вот есть герой, по нему кликают ПКМ, он становится активным. Затем кликают ЛКМ по цели, она устанавливается в target в HeroChooser'е, который затем переходит к герою, и затем - к абилке.
Затем, когда герой кастует абилку (то бишь просто прожимает циферку 1), появляется молния, но перед этим ей устанавливают цель и героя-создателя.
Только проблема в том, что герой-создатель остается, а цель просто исчезает, устанавливается на null. Если я вручную устанавливаю цель в рантайме, она по-прежнему тут же ставится на null.
Что не так?

P.S.: если в последнем скрипте закомментить target = null, то все еще не изменится ничего.
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Пропадает цель для снаряда

Сообщение Kabanelloo 22 апр 2017, 17:48

Синтаксис:
Используется csharp
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector3.forward, 100f);
        Debug.DrawRay(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector3.forward * 100f);


Ты каждый кадр стреляешь лучом , и даже если ты словишь таргет то на следующий кадр ты передвинешь мышку и луч стрельнет в другой слой и ты просто потеряешь сылку.

например вложи этот код в кнопку нажатия что бы при стрельбе получать таргет и не стрелять еще раз. Это теория проверяй .
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea

Re: Пропадает цель для снаряда

Сообщение Heliosis 22 апр 2017, 21:04

Kabanelloo писал(а):
Синтаксис:
Используется csharp
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector3.forward, 100f);
        Debug.DrawRay(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector3.forward * 100f);


Ты каждый кадр стреляешь лучом , и даже если ты словишь таргет то на следующий кадр ты передвинешь мышку и луч стрельнет в другой слой и ты просто потеряешь сылку.

например вложи этот код в кнопку нажатия что бы при стрельбе получать таргет и не стрелять еще раз. Это теория проверяй .


Это не помогло.
На самом деле, я так и думал, потому что он в любом случае менял target только при клике.

Есть еще советы?
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Пропадает цель для снаряда

Сообщение Kabanelloo 22 апр 2017, 23:13

В луче дело, проверь луч ! И используй 2д физику тобиш RigidBody2D и Collider2D если игра 2д.
Потом сам луч нужно настроить для 2д игры.

Здесь я заменил Hero на Collider2D так как влом копипастить твои скрипты. Замени , вот это работает , ну и по удалял всякие условия, что бы не мешали. У меня лично ,не работали твои лучи.

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

public class HeroChooser : MonoBehaviour
{
    public Collider2D currentHero;
    public GameObject target;

    void Update()
    {
        // пробуй у себя заменить на эти 3 строчки ну и пляши как хо
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity);
        Debug.DrawLine(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));


        if (Input.GetMouseButtonDown(1))
        {
            if (hit.collider != null && hit.collider.GetComponent<Collider2D>() != null)
            {
                currentHero = hit.collider.GetComponent<Collider2D>();
            }
            else
            {
                currentHero = null;
            }
        }

        if (currentHero != null)
        {
            if (Input.GetMouseButtonDown(0))
            {
                if (hit.collider != null && hit.collider.gameObject.layer == 8)
                {
                    target = hit.collider.gameObject;
                }
                else
                {
                    target = null;
                }
            }
        }
    }
}
 


http://image.prntscr.com/image/3076cbcb08904db4afa314e753f6d52e.png
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea

Re: Пропадает цель для снаряда

Сообщение Heliosis 23 апр 2017, 12:39

Kabanelloo писал(а):В луче дело, проверь луч ! И используй 2д физику тобиш RigidBody2D и Collider2D если игра 2д.
Потом сам луч нужно настроить для 2д игры.

Здесь я заменил Hero на Collider2D так как влом копипастить твои скрипты. Замени , вот это работает , ну и по удалял всякие условия, что бы не мешали. У меня лично ,не работали твои лучи.

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

public class HeroChooser : MonoBehaviour
{
    public Collider2D currentHero;
    public GameObject target;

    void Update()
    {
        // пробуй у себя заменить на эти 3 строчки ну и пляши как хо
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity);
        Debug.DrawLine(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));


        if (Input.GetMouseButtonDown(1))
        {
            if (hit.collider != null && hit.collider.GetComponent<Collider2D>() != null)
            {
                currentHero = hit.collider.GetComponent<Collider2D>();
            }
            else
            {
                currentHero = null;
            }
        }

        if (currentHero != null)
        {
            if (Input.GetMouseButtonDown(0))
            {
                if (hit.collider != null && hit.collider.gameObject.layer == 8)
                {
                    target = hit.collider.gameObject;
                }
                else
                {
                    target = null;
                }
            }
        }
    }
}
 


http://image.prntscr.com/image/3076cbcb08904db4afa314e753f6d52e.png


К сожалению, это не работает.
Просто каким-то образом target самостоятельно превращается в null, просто так, даже если я вручную его устанавливаю, там, в инспекторе перетащу какой-нибудь ГО, все равно он тут же опять становится null.
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Пропадает цель для снаряда

Сообщение Kabanelloo 23 апр 2017, 13:51

Расскажи как твои скрипты развешаны по ГО , кто кого выделяет что ыб я мог провести анализ твоего кода в реалтайм
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea

Re: Пропадает цель для снаряда

Сообщение Kabanelloo 23 апр 2017, 14:09

Ну я проверил код , опять же твои лучи подводят тебя . Но по мимо лучей Булевая CanPlayThisHero не дает получить тебе таргет если она не включена , потом ты не можешь получать таргет без Hero. Еще не мало важно проверь слои!!!
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea

Re: Пропадает цель для снаряда

Сообщение nik26 23 апр 2017, 14:38

код рабочий. :D
тут либо редактор шалит
либо на сцене у вас есть еще какой то скрипт меняющий переменную)
Аватара пользователя
nik26
UNIт
 
Сообщения: 110
Зарегистрирован: 22 июн 2013, 02:13

Re: Пропадает цель для снаряда

Сообщение Heliosis 23 апр 2017, 14:50

Kabanelloo писал(а):Расскажи как твои скрипты развешаны по ГО , кто кого выделяет что ыб я мог провести анализ твоего кода в реалтайм


http://vfl.ru/fotos/b7b8c42616966943.html
http://vfl.ru/fotos/a908b71116966944.html
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Пропадает цель для снаряда

Сообщение Kabanelloo 23 апр 2017, 15:12

Покажи гейм контроллер , понятно в общем слетает таргет с шара ? Откуда шар вылетает ?
Последний раз редактировалось Kabanelloo 23 апр 2017, 15:17, всего редактировалось 2 раз(а).
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea

Re: Пропадает цель для снаряда

Сообщение Heliosis 23 апр 2017, 15:15

Kabanelloo писал(а):Покажи гейм контроллер


http://vfl.ru/fotos/47c469f316967274.html
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Пропадает цель для снаряда

Сообщение Heliosis 23 апр 2017, 15:20

Kabanelloo писал(а):Покажи гейм контроллер , понятно в общем слетает таргет с шара ? Откуда шар вылетает ?


По идее, игрок жмет кнопку, сначала, при помощи методов внутри кода шара, устанавливается таргет для шара и его создатель (ну, тут это активный герой), затем уже появляется сам шар с установленными таргетом и создателем и должен лететь к цели.
Но суть в том, что таргет просто пропадает, в отличие от героя-создателя, к примеру.

Я не знаю почему вообще, нигде таргет же в коде не меняется, кроме как при ПКМ или ЛКМ.
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Пропадает цель для снаряда

Сообщение Kabanelloo 23 апр 2017, 15:25

Окей пока все понятно , дамми на каком слое ? 8 , и шар не вылетает ни откуда )
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea

Re: Пропадает цель для снаряда

Сообщение Heliosis 23 апр 2017, 15:33

Kabanelloo писал(а):Окей пока все понятно , дамми на каком слое ? 8 , и шар не вылетает ни откуда )


В каком смысле?
Да, дамми на слое 8 - Target, а что с шаром?
Откуда он должен "вылетать"?
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Пропадает цель для снаряда

Сообщение Kabanelloo 23 апр 2017, 15:36

Я думал ты его пускаешь )) А он это типо и есть энеми?
Kabanelloo
UNITрон
 
Сообщения: 163
Зарегистрирован: 03 фев 2012, 21:55
Откуда: Kaliningrad/Crimea

След.

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

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 5