Наложение тригеров

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

Наложение тригеров

Сообщение VitaMin00 25 мар 2012, 18:49

Всем добрый вечер)
У меня вопрос и надеюсь на вашу помощь)
Делаю 2д игру. Герой выпускает стрелу и она летит во врага. Попадает, стрела входит в тригер - ура, поПеда, противник мертв.
Но появилась проблема. Если противника 2. и они соприкасаются, то стрела начинает убивать сразу 2их а не по очереди. вот рисунок, где показано, что если стрела касается обоих тригеров, то оба врага получают урон. Как сделать, чтобы только один тригер работал?
У вас нет доступа для просмотра вложений в этом сообщении.
VitaMin00
UNITрон
 
Сообщения: 187
Зарегистрирован: 12 мар 2012, 19:54

Re: Наложение тригеров

Сообщение Левш@ 25 мар 2012, 19:13

Дестрой стрелу после попадания.
Можно ограничение на 1 срабатывание сделать, много чего можно.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Наложение тригеров

Сообщение VitaMin00 25 мар 2012, 19:18

стрелу уничтожаю, не помогает. А как сделать ограничение на 1 срабатывание?
VitaMin00
UNITрон
 
Сообщения: 187
Зарегистрирован: 12 мар 2012, 19:54

Re: Наложение тригеров

Сообщение Левш@ 25 мар 2012, 22:35

Заглушкой boolean переменной.
У тебя архитектура процесса не совсем верная.
Для эксперимента триггеры конечно норм, а для проекта так не стоит делать.
Или хотя бы сделай предел близости персонажей, чтоб они своими триггерами не пересекались.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Наложение тригеров

Сообщение VitaMin00 28 мар 2012, 20:08

У тебя архитектура процесса не совсем верная.
Для эксперимента триггеры конечно норм, а для проекта так не стоит делать.

А как тогда правильно сделать? Просто пересекания обьектов полюбому должны быть у меня.
VitaMin00
UNITрон
 
Сообщения: 187
Зарегистрирован: 12 мар 2012, 19:54

Re: Наложение тригеров

Сообщение Левш@ 28 мар 2012, 20:42

Правильно - это рейкаст, сильно сомневаюсь что он поразит сразу 2 колайдера.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Наложение тригеров

Сообщение VitaMin00 28 мар 2012, 22:32

А можно подсказать, как правильно написать? Изначально у меня было так, с помощью тригеров, вешаю скрипт на префаб моба и если ловит пулю, получает урон:
Синтаксис:
Используется csharp
void OnTriggerEnter(Collider obj){
                if (obj.gameObject.tag == "Bullet"){
                        EnemyHp -10;   
                        }
                }
 


Как с райкастом это написать?
Синтаксис:
Используется csharp
void update(){
   if(Physics.Raycast(...))
  EnemyHp-10;
}
 
VitaMin00
UNITрон
 
Сообщения: 187
Зарегистрирован: 12 мар 2012, 19:54

Re: Наложение тригеров

Сообщение Левш@ 29 мар 2012, 01:36

Раньше у тебя тригер срабатывал на враге, а теперь обратная связь рейкаста будет с отправителем а не с приемником, зато рейкаст принесет с собой ссылку на обьект в который попал, остальное дело техники.
Синтаксис:
Используется javascript
var hit : RaycastHit;
var dist : int = 100;

function Update () {
    if (Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit, Dist))  
         hit.collider.gameObject.GetComponent("ИмяСкриптаНаВраге").EnemyHp - 10; // EnemyHp не должно быть private, должно быть static или public.
}

Синтаксис:
Используется csharp
RaycastHit hit;
int dist

void Update () {
    if (Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit, Dist))  
          hit.collider.gameObject.GetComponent("ИмяСкриптаНаВраге").EnemyHp - 10; // EnemyHp не должно быть private, должно быть static или public.
}
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Наложение тригеров

Сообщение Berenold 30 мар 2012, 12:01

Доброго времени суток.
Не знаю поможет тебе это или нет но я делал так.
У меня на пуле есть колайдет и на противнике есть колайдер. Если 2 или больше противника стояли в одной точке(приблизительно как у тебя) у меня пуля наносила повреждения всем. Я избавился от этого следующим образом. Когда происходило столкновение по колайдеру я запускал цикл и заносил в массив все объекты с которыми столкнулась пуля. После чего брал первый объект из массива и наносил ему повреждения. После чего дестроил пулю.
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Наложение тригеров

Сообщение VitaMin00 30 мар 2012, 14:00

Вот это мне больше подходит) Обьясню почему. Дело в том, что делаю 2д игру и абсолютно всё у меня состоит из plane, которые лежат в одной плоскости. Столкновения между ними у меня не получилось организовать, не ощущают они друг друга. Поэтому приходится использовать коллайдеры, которые растягиваю, как мне удобно. Berenold, не мог бы помочь кодом, как именно это написать?) Буду премного благодарен)
VitaMin00
UNITрон
 
Сообщения: 187
Зарегистрирован: 12 мар 2012, 19:54

Re: Наложение тригеров

Сообщение Berenold 01 апр 2012, 09:58

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

public class PyliaTransform : MonoBehaviour
{
        float _moveSpeed=40f;                                   // Скорость передвижения пули
        bool moveOn = true;                                       // Переменная которая говорит что пуля может двигаться
        int inc = 0;                                                     // Счетчик для заполнения массива
        GameObject[] targets = new GameObject[30]; // Непосредственно сам массив
   
        void Update ()
        {
                Ptransform();
        }
       
        void Ptransform() // Метод для перемещения пули
        {
               if (moveOn) // Пока значение "true"
               {
                         transform.Translate(0, 0, _moveSpeed * Time.deltaTime);
                         transform.position = new Vector3(transform.position.x, transform.position.y, 0);
                         Destroy(gameObject, 0.8f); // уничтожаю объект если за 0.8 секунды он не с чем не соприкоснулся
               }
        }
       
        void OnCollisionEnter(Collision Other) // Срабатывает если соприкосаешся с любой колизиец(подробнее читай в справке)
        {
                if(Other.gameObject.tag != "Enemy") // Если объект с которым мы столкнулись не является противником(например стеной)
                {
                        moveOn = false;          // Останавливаем пулю(смотри метод "Ptransform")
                        Destroy(gameObject); // Уничтожаем объект
                }
                else if(Other.gameObject.tag == "Enemy") // В ином случае если объект с которым мы столкнулись враг
                {
                       moveOn = false; // Останавливаем пулю
                       if (!Array.Exists(targets, go => { if (Other.gameObject == go) return true; return false; })) // Проверяем не находится ли уже этот объект в массиве, если нет тогда...
                       {
                                targets[inc] = Other.gameObject; // Заносим в наш массив данный объект
                                inc++;                                         //  Увеличиваем счетчик массива на один
                       }
                       if (targets[0] != null) // Проверяем не пусто ли наше первое значение массива( null -> логический "0") если первая ячейка массива содержит значение тогда...
                       {
                               targets[0].gameObject.renderer.material.color = Color.red; // Изменяем цвет объекта на крассый
                               /* Тут по факту должен находится ваш код
                                   ...
                                   ...
                                   ...
                               */

                               Destroy(gameObject); // Уничтожаем объект(пулю)
                      }
                }
        }
}
 


Данный скрипт вешается на пулю. Собственно его с легкостью можно переделать под все, что вам нужно))
Удачи ;)
Последний раз редактировалось Berenold 01 апр 2012, 13:07, всего редактировалось 1 раз.
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Наложение тригеров

Сообщение VitaMin00 01 апр 2012, 10:43

Ух, вот это расписано так расписано))) Большое человеческое спасибо за код)) Как отрезвею после субботней ночи, сразу же опробую))))
VitaMin00
UNITрон
 
Сообщения: 187
Зарегистрирован: 12 мар 2012, 19:54

Re: Наложение тригеров

Сообщение Berenold 01 апр 2012, 13:09

VitaMin00 писал(а):Ух, вот это расписано так расписано))) Большое человеческое спасибо за код)) Как отрезвею после субботней ночи, сразу же опробую))))

Незашто. Удачи))
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт


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

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

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


cron