Пятница, 11 Октября 2024, 17:51

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как проверить столкновения
berilДата: Четверг, 22 Октября 2015, 23:59 | Сообщение # 1
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
В общем ребята выручайте голова уже не варит, а нужно доделывать. Наверно ответ очень прост, но я его не вижу %)

Нужно проверить столкнулся ли обьект с другим обьектом в классе без MonoBehavior(я отметил в каком месте)

В общем есть код
Код

public class FireMagicClotFire : BaseSpellData, IDamageSpellType
{

    private const string SPELL_POINT_NAME = "CreateSpellPoint";//имя обьекта, в позиции которого создаются обьекты заклинаний
    private const float VELOCITY = 3.3f;//скорость полета снаряда
    private const float DISTANCE = 5f;//дистанция, которую пролетает заклинание

    public SpellDamageType SpellDamageType
    {
        get { return SpellDamageType.FireDamage; }
    }

    public int Damage { get; set; }//урон наносимый заклинанием

    private readonly GameObject _player;//игрок
    private readonly GameObject _spellLoadModel;//модель заклинания

    private  Transform _spellPoint;//точка где создаются обьекты заклинаний

    private GameObject _spellObj;//
    private Vector3 _starPos;

    public FireMagicClotFire()
    {        
        _player = GameObject.FindGameObjectWithTag(ManagerTag.Player);
        _spellLoadModel = Resources.Load<GameObject>("MagicSpellObject/FireClotObj") as GameObject;
    }

    public void Initialization()
    {
        //поиск обьекта CreateSpellPoint
        foreach (var trans in _player.transform.Cast<Transform>().Where(trans => trans.name == SPELL_POINT_NAME))
        {
            _spellPoint = trans;
            Debug.Log(trans.name);
        }

        if (_spellPoint == null && GeneraGameSetting._GeneraGameSetting.BuildVersion == BuildVersion.Debug)
            DebugConsole.Log(string.Format("[FireMagicClotFire] Не найден обьект CreateSpellPoint"), 3);
        //создание обьекта
        if (_spellPoint != null)
            _spellObj = InstantiateObject.InstantiateGameObject(_spellLoadModel, _spellPoint.position, Quaternion.LookRotation(_player.transform.TransformDirection(Vector3.forward)));

        _starPos = _spellObj.transform.position;

        CoroutineStart.StartCoroutineStatic(GameObject.FindObjectOfType<MonoBehaviour>(), moved(_spellObj));
    }

    //движение к цели
    private IEnumerator moved(GameObject obj)
    {
        while ((_starPos - obj.transform.position).sqrMagnitude <  DISTANCE * DISTANCE)
        {
            //дебаг луч
            Debug.DrawRay(obj.transform.position, obj.transform.TransformDirection(Vector3.forward) * 10, Color.red);

          >>>>>>>>>>>>>>>>здесь нужно как то проверку столкновения сделать, что то типа obj.OnCollisionEnter<<<<<<<<<<<<<<<<<<<<

            obj.transform.Translate(Vector3.forward * VELOCITY * Time.deltaTime, Space.Self);

            yield return null;
        }

        GameObject.Destroy(obj);
    }
}




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
irinautkinaДата: Пятница, 23 Октября 2015, 00:08 | Сообщение # 2
участник
Сейчас нет на сайте
прости, может я не по теме, я проверяю столкновения в юнити двумя видами либо

эвент

OnTriggerEnter2D(Collider2D col)

либо через функцию

Raycast (

другие способы мне не известны.
PocifikДата: Пятница, 23 Октября 2015, 02:03 | Сообщение # 3
участник
Сейчас нет на сайте
beril, ну в принципе ничто не мешает написать OnCollisionEnter и добавлять в коллекцию, все объекты которые в входят в коллизию, а в OnCollisionExit удалять их. Затем просто вызывать где тебе надо, функцию Contains коллекции, для твоего объекта, или какой нибудь аналог.
shizofrenДата: Пятница, 23 Октября 2015, 12:00 | Сообщение # 4
Starting MS-DOS...
Сейчас нет на сайте
beril, если предоставленный тобою класс один на сцене, можно поступить так:

  • Повесить на объекты, которые нужно проверять, новый MonoBehaviour класс с методом OnCollisionEnter (или подобный).
  • Создать в твоем чудо-классе публичный метод, который будет вызываться при нужных коллизиях (с нужными тебе аргументами).
  • В классе объекта (MonoBehaviour) в методе OnCollision... проверять столкновение, и если случилось то столкновение, которое тебе нужно - вызывать тот самый публичный метод в твоем классе.


Моя команда
Storm54Дата: Пятница, 23 Октября 2015, 13:50 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
Подробней можно узнать? Что из себя представляет объект?
Если луч, то естественно райкастом проверять, если же какой-то примитив, то можно overlap заюзать (а можно вообще написать тригонометрией)
berilДата: Пятница, 23 Октября 2015, 17:14 | Сообщение # 6
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Миром правит простота)
Я решил просто динамически прицеплять MonoBehavior к обьекту, там просчитывать все и потом его удалять wink Всем спасибо




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
  • Страница 1 из 1
  • 1
Поиск:

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