Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 26.11.2017
Сообщений: 118

Line Renderer выдаёт луч длиннее, чем надо

08.06.2021, 21:28. Показов 1332. Ответов 7

Студворк — интернет-сервис помощи студентам
здравствуйте. я делаю скрипт лучевого оружия:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class RayFire : MonoBehaviour
{
    public GameObject flame; //пламя на конце луча
    public GameObject dulo; //дуло
    public float length; //длина луча
    public float damage;
    private LineRenderer lr; //рендерер луча
    public bool isprotagon; //стреляет ли протагонист
    private bool worked; //пересёкся ли луч
 
    public GameObject shooter;
    void Start()
    {
        lr = dulo.GetComponent<LineRenderer>(); //получаем рендерер луча
        if (lr == null) //если рендерера нет, выводим сообщение об ошибке и выходим из игры
        {
            Debug.LogError("No dulo");
            Application.Quit();
        }
    }
    void Update()
    {
        var zer = new Vector2(0, 0); 
        lr.SetPosition(1, zer);
 
        if (Input.GetKey(KeyCode.X) && isprotagon) //если стреляет протагонист и нажата кнопка Х, стреляем
        {
            RayShoot();
        }
    }
 
    public void RayShoot()
    {
        worked = false;
        //устанавливаем направление луча
        int zh; 
        if (shooter.transform.localScale.x < 0)
            zh = -1;
        else
            zh = 1;
 
 
        Debug.DrawRay(dulo.transform.position, transform.right * zh*length);
        RaycastHit2D[] ahit = Physics2D.RaycastAll(dulo.transform.position, transform.right*zh, length); //смотрим пересеклись ли с кем-то
        if (ahit != null) //если пересечения есть перебираем их
            foreach (var hit in ahit)
            {
                var t = hit.collider.tag; //тег объекта пересечения
                if (t!= gameObject.tag) //если пересечение не с самим с собой
                {
                    var lpoi = new Vector2(Vector2.Distance(dulo.transform.position, hit.point), 0); //точка пересечения
                    lr.SetPosition(1, lpoi); //рисуем луч
                    worked = true; //есть пересечение
                    if (flame != null) //если мы задали пламя луча, добавляем его
                    {
                        StartCoroutine(Blow(flame, hit.point, dulo.transform.rotation));
                    }
                    break;
                }
            }
        if (!worked) //если пересечения нет, строим луч заданнйо длины
        {
            var l = new Vector2((length), 0);
            lr.SetPosition(1, l);
        }
        //animateRay();
    }
    private IEnumerator Blow (GameObject flame ,Vector2 hp, Quaternion rot)
    {
        var blow = Instantiate(flame, hp, rot); //создаём клон пламени
        yield return new WaitForSecondsRealtime(0.0001F); //ждём
        Destroy(blow); //уничтожаем пламя
    }
пересечения отлавливаются нормально, flame ставится там, где надо если есть пересечение, однако сам луч раза в 2 длиннее заданной длины. превышение длины луча также заметно при использовании
C#
1
Debug.DrawRay(dulo.transform.position, transform.right * zh*length);
луч дебага короче, чем луч, который даёт line renderer, но они должны быть одинаковой длины. скажите, пожалуйста, что я сделал не так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.06.2021, 21:28
Ответы с готовыми решениями:

Под каким углом к оси Ох надо направить луч из точки A(2;4), чтобы отраженный луч прошел через точку В(-5;3) ?
Под каким углом к оси Ох надо направить луч из точки A(2;4), чтобы отраженный луч прошел через точку В(-5;3) ?

Работа с Line renderer
Всем доброго времени суток. Есть простой код, получающий координаты точек на окружности с определённым шагом и далее по этому массиву...

Line Renderer Collider
Ситуация такая: 2D игра-платформер, игрок рисует курсором мышки произвольную линию на экране, после чего эта линия должна стать физически...

7
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
08.06.2021, 21:53
Есть вопрос-нюанс, у вашего lineRenderer установлена галочка useWorldSpace?
0
1 / 1 / 0
Регистрация: 26.11.2017
Сообщений: 118
08.06.2021, 21:54  [ТС]
samana, галочка снята
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
08.06.2021, 22:04
Конечно я вряд ли помогу, так как код лучше было бы протестировать.
Но сейчас вы пускаете луч, который возвращает пересечения СО ВСЕМИ объектами сразу, которые встретит на своём пути. То-есть у вас может быть много пересечений. А lineRenderer у вас один, и он всегда рисует только последний луч, точнее последняя точка луча - всегда последняя точка найденного пересечения.

А нет, я ошибся, не заметил break в цикле.
0
1 / 1 / 0
Регистрация: 26.11.2017
Сообщений: 118
08.06.2021, 22:53  [ТС]
на ум приходит деление длины на два, но это будет костыль и нельзя будет сказать, что проблема решена

Добавлено через 7 минут
да и то, в таком случае на близких расстояниях луч не будет соприкасаться с целью

Добавлено через 27 минут
samana, а, чуть не забыл сказать, я этот скрипт вытащил из другого своего проекта, и там всё отлично работает. также я обратил внимание на координаты. значения координат точек похожи на правду и ставится именно то, что я задаю. такое ощущение, что что-то типа масштабирования нарушено. я не знаю, что делать с этим
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
09.06.2021, 00:08
Annigilyator98,
Рискну предположить, что у Вас объект из которого исходит LineRenderer изменен в масштабе раза в два от 1. По этому и LR тоже будет раза в два длиннее, так как Scale объекта тоже влияет и на длину LR. Нужно привести Scale к 1, чтоб LR корректно отображал длину. Либо же делить переменную length / dulo.transform.localScale.x, чтоб получить корректную длину.
0
1 / 1 / 0
Регистрация: 26.11.2017
Сообщений: 118
09.06.2021, 00:09  [ТС]
Ronin_v, scale был равен 1. и в результате, для корректной работы, scale пришлось подобрать со значением меньше одного
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
09.06.2021, 00:26
Annigilyator98,
скейл у Parent тоже влияет. Если дуло дочернее к другому объекту.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2021, 00:26
Помогаю со студенческими работами здесь

Line Renderer линии в unity3d
Добрый вечер, возникла проблема, не могу понять как отрисовывать несколько линий одновременно. Вообще ничего не рисуется. Пытаюсь...

Line renderer регистрация клика
Всем привет. Можно ли как то сделать Line Renderer кликабельным? То есть, нужно при нажатии мышкой по линии фиксировать координаты точки...

Обновление позиций точек line renderer
Есть line renderer и функция с рекурсивным отражением. Есть пара вопросов: 1)Как можно обновлять, т.е. перерисовывать линию в режиме...

Unity line renderer растягивает текстуру
Сама проблема заключается в том, что при добавлении новых точек в комплект line renderer, которые создают поворот (идут в сторону от линии)...

Line Renderer, при рисовании второй линии связывает ее с первой
Уважаемые форумчане помогите пожалуйста новичку в Unity, при рисовании линии возникает такая ситуация, конец первой линии автоматически...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru