Четверг, 25 Апреля 2024, 12:17

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Raycast All
Raycast All
RebyataYaNeSharyДата: Четверг, 16 Февраля 2017, 21:04 | Сообщение # 1
частый гость
Сейчас нет на сайте
Подскажите пожалуйста, как удалить объекты через которые проходит рейкаст олл?
XanKriegorДата: Четверг, 16 Февраля 2017, 21:50 | Сообщение # 2
участник
Сейчас нет на сайте
hit.gameobject.destroy()?
RebyataYaNeSharyДата: Четверг, 16 Февраля 2017, 22:46 | Сообщение # 3
частый гость
Сейчас нет на сайте
Спасибо, а не подскажите. Я столкнулся с такой проблемой. Как проверить что рейкаст олл проходит через 3 объекта и если через 3 объекта то удалять их (ежели 1 или 2 не трогать).
Код
RaycastHit[] hits;
        hits = Physics.RaycastAll(StartRay, FinalRay, 100.0f);
        Debug.DrawLine(StartRay, FinalRay, Color.red);
        for (int i = 0; i < hits.Length; i++)
        {

            if (i > 2) {

                RaycastHit hit = hits[i];
                g = true;

                if (g == true)
                {

                    Destroy(hit.transform.gameObject);

                }

            }

Добавлено (16 февраля 2017, 22:46)
---------------------------------------------
Я вот думаю типа того но никак не разберусь что с i

berilДата: Четверг, 16 Февраля 2017, 23:54 | Сообщение # 4
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
List.Add((hit.collider.gameObject)
if (List.Count равно 3)
то чето делаем там




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
ReanДата: Пятница, 17 Февраля 2017, 00:33 | Сообщение # 5
участник
Сейчас нет на сайте
RebyataYaNeShary, ты и так получаешь массив, следовательно достаточно проверить его размер и выполнить необходимые действие:
Код

RaycastHit[] hits = Physics.RaycastAll(StartRay, FinalRay, 100.0f);
if (hits.Length > 2)
    foreach (RaycastHit hit in hits)
        Destroy(hit.collider.gameObject);
RebyataYaNeSharyДата: Пятница, 17 Февраля 2017, 11:16 | Сообщение # 6
частый гость
Сейчас нет на сайте
У меня чет не робит, хотя я делаю проверку массива, и объектов там 3, может быть это зависит от того что у меня объекты клоны одного префаба, или это не влияет, а если влияет подскажите пожалуйста как это исправить
ReanДата: Пятница, 17 Февраля 2017, 11:45 | Сообщение # 7
участник
Сейчас нет на сайте
RebyataYaNeShary, выложи код сценария, чтобы можно было разобраться, что у тебя там не работает.
RebyataYaNeSharyДата: Пятница, 17 Февраля 2017, 12:51 | Сообщение # 8
частый гость
Сейчас нет на сайте
Код
using UnityEngine;
using System.Collections;
using Text = UnityEngine.UI.Text;

public class Tap : MonoBehaviour {

    public GameObject myPrefab;
    Vector3 Cursor;
    public Camera Camera;
    public Text Scores;
    public int score = 0;
    public int plusScore = 1;
    bool a = false;
    public float Distance;
    Vector3 StartRay;
    Vector3 FinalRay;
    bool g = false;

    void Start () {
        Input.simulateMouseWithTouches = true;
    }

  

    void Update () {
        Vector3 StartRay = new Vector3(5.28f, -4.73f, 0f); //вектора начала и конца рейкаста
        Vector3 FinalRay = new Vector3(14.34f, -4.73f, 0f);
      Vector3 Cursor = Input.mousePosition;

        Cursor = Camera.main.ScreenToWorldPoint(Cursor);

        Cursor.z = -0.09f;
        if (Input.GetMouseButtonDown(0)) {
            myPrefab.transform.position = Cursor;
            if (myPrefab.transform.position.y > 1.7)
            {

                Instantiate(myPrefab); //создание объектов при клике мышью
                a = true;
          
            }
            if (a == true) {

                if (Camera.transform.position == new Vector3(10, 0, -10)) {

                    score += plusScore; //прибавление очков
                    a = false;
                
                }
    
            }
  
        }

        if (Camera.transform.position.x == 0 || Camera.transform.position.x == 20)
        {
            if (a == true)
            {
                var clones = GameObject.FindGameObjectsWithTag("clone");
                foreach (var clone in clones)
                {
                    Destroy(clone, 5f);

                }

            }

        }

        if (a == true) {
            score = 0;
            a = false;
        }

        if (Camera.transform.position.x == 0 || Camera.transform.position.x == 20) {

            score = 0;
        
        }

        Scores.text = score.ToString();

        RaycastHit[] hits = Physics.RaycastAll(StartRay, FinalRay, 100.0f); //рейкаст, в него падают эти объекты клоны префаба и если их определенное число он должен их удалять
        Debug.DrawLine(StartRay, FinalRay, Color.red);
        if (hits.Length > 2)
            foreach (RaycastHit hit in hits)
                Destroy(hit.collider.gameObject);

        

        }

    public void But() {

        Camera.transform.position = new Vector3(10, 0, -10);
    
    
    }

    public void Main()
    {

        Camera.transform.position = new Vector3(0, 0, -10);

    }
    

    }



VerdCSДата: Пятница, 17 Февраля 2017, 20:20 | Сообщение # 9
частый гость
Сейчас нет на сайте
RebyataYaNeShary,
скорее всего дело в том что луч выпущенный методом Physics.RaycastAll(StartRay, FinalRay, 100.0f), не касается искомых объектов.

Метод Debug.DrawLine(StartRay, FinalRay, Color.red); рисует не луч, а прямую линию между двумя координатами. Он не подходит для вашей задачи и показывает ложный результат.

Добавьте строку Debug.DrawRay (StartRay, FinalRay.normalized * 100f, Color.cyan); что бы увидеть реальное направление и длину луча.

Ещё один момент. StartRay это действительно координата начала луча. FinalRay это не "вектор конца рэйкаста", это вектор направления луча. Луч, испускается из точки StartRay, по направлению FinalRay. Поскольку FinalRay это вектор направления, он нормализуется перед применением.


Сообщение отредактировал VerdCS - Пятница, 17 Февраля 2017, 20:21
ReanДата: Пятница, 17 Февраля 2017, 22:13 | Сообщение # 10
участник
Сейчас нет на сайте
VerdCS, всё верно.

Для того, чтобы сделать каст от одной точки до другой следует использовать Physics.Linecast. Но out переменная вернёт только один коллайдер. Для множественных пересечений лучше использовать луч - RaycastAll. Единственно, что использоваться должна не конечная точка и не сонаправленный вектор единичной длинны, а направление от вектора А к вектору Б. Находится оно с помощью простого вычитания векторов (Б - А).
Я сперва тоже подумал, что у ТС луч проходит мимо, но судя по цитате:
Цитата RebyataYaNeShary ()
я делаю проверку массива, и объектов там 3

проблема в чём-то другом. Да и по скриншоту, луч проходит сквозь кубы.

RebyataYaNeShary, коли у тебя FinalRay - это не направление, а просто точка в пространстве, то попробуй внести изменения в Raycast:
Код
Physics.RaycastAll(StartRay, FinalRay - StartRay, 100.0f)

А в остальном, конечно, чёрт ногу сломит, догадываясь о том, что у тебя происходит в этих:
Код

...
if (a == true) {
            score = 0;
            a = false;
        }
...
if (Camera.transform.position.x == 0 || Camera.transform.position.x == 20)
...

и тому подобному. Неплохо было бы привести всё это дело к удобочитаемому виду.


Сообщение отредактировал Rean - Пятница, 17 Февраля 2017, 22:22
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Raycast All
  • Страница 1 из 1
  • 1
Поиск:

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