Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122

Как сделать эффект лазера?

26.06.2020, 17:45. Показов 3204. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть башня которая стреляет снарядами (игра типа TD), вот пример реализации

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
public class TowerBullet : MonoBehaviour{
    public float FindRadius = 2f;
    public float TimeShot = 0.5f;
    Enemy enemy;
    Transform towerHead;
    private float timerShot = 0f;
    public GameObject bullet;
    
    void Start(){
        towerHead = transform.Find("Head");
        }
    
    void Update(){
        if(enemy == null) FindEnemy();
            else{
                towerHead.LookAt(enemy.transform);
                shot();
                float dist = Vector3.Distance(enemy.transform.position, transform.position);
                if(dist > FindRadius) enemy = null;
                }
        }
    
    public void shot(){
        timerShot -= Time.deltaTime;
        if(timerShot <= 0){
            timerShot = TimeShot;
            GameObject obj = (GameObject)Instantiate(bullet, towerHead.transform.position, towerHead.transform.rotation);
            Bullet b = obj.GetComponent<Bullet>();
            b.Enemy = enemy;
            }
        }
    
    public void FindEnemy(){
        GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy") as GameObject[];
        float min = FindRadius;
        Enemy minEnemy = null;
        foreach(GameObject e in enemies){
            float dist = Vector3.Distance(e.transform.position, transform.position);
            if(dist <= min){
                min = dist;
                minEnemy = e.GetComponent<Enemy>();
                }
            }
        enemy = minEnemy;
        }
    }
 
public class Bullet : MonoBehaviour{
    public float Speed = 15f;
    public float TimeLife = 0.1f;
    float timerLife = 0f;
    public Enemy Enemy;
    public float Damage = 25f;
    public float Accuracy = 90f;
    public float Critical = 2f;
    public float Chance_Critical = 20f;
    void Start(){
        timerLife = TimeLife;
        }
    
    void Update(){
        timerLife -= Time.deltaTime;
        float _speed = Speed * Time.deltaTime;
        if(timerLife <= 0){
            timerLife = TimeLife;
            Object.Destroy(gameObject);
            }else if(Enemy != null && Vector3.Distance(transform.position, Enemy.transform.position) <= _speed){
                Enemy.SetDamage(Damage);
                Object.Destroy(gameObject);
                return;
                }
        transform.Translate(new Vector3(0,0, _speed));
        }
    }
К башне прикрепляется TowerBullet, к самим пулям Bullet, работает все как нужно - башня выслеживает противника, пули в них вылетают и пропадают при попадании, при этом нанося нужный урон.

Как можно модифицировать скрипт чтобы эта башня стреляла лазером ?( луч который будет начинаться с башни до противника и растягиваться при удалении пока из радиуса не выйдет)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.06.2020, 17:45
Ответы с готовыми решениями:

Как в Unity сделать эффект мутной воды
Как в Unity сделать эффект мутной воды?Кто знает не молчите.

Как сделать эффект затухания/расцветания экрана
1)При нажатии кнопки Play, надо с обычного экрана сделать плавно черный, после загрузится 1-ый уровень. 2)Уже на первом уровне с...

Хочется узнать как сделать временным определённый эффект с C#?
player.GetComponent &lt;Rigidbody2D&gt; ().mass = 1.25f; Как сделать чтобы этот эффект длился только несколько секунд? Добавлено через 3...

6
109 / 81 / 37
Регистрация: 13.01.2016
Сообщений: 409
26.06.2020, 18:12
LineRenderer. Там как раз ставишь точки начала и конца, тебе отрисовывается отрезок с нужной текстурой.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
26.06.2020, 19:24  [ТС]
Цитата Сообщение от DarkPtect Посмотреть сообщение
LineRenderer. Там как раз ставишь точки начала и конца, тебе отрисовывается отрезок с нужной текстурой.
Я конечно смотрел примеры в нете по данному вопросу, но не могу пока что сделать, можно пример?
0
109 / 81 / 37
Регистрация: 13.01.2016
Сообщений: 409
26.06.2020, 21:36
Создаёте объект, накидываете на него LineRenderer:
https://docs.unity3d.com/Scrip... derer.html
https://docs.unity3d.com/Manua... derer.html

В настройках компонента ищете массив Positions. Там указываете точки, через которые хотите, чтобы проходил отрезок.
Для лазера задаёте их всего две и выходит прямой отрезок. Первая точка - позиция выстрела, вторая - цель.
На картинке массив в настройках.
Миниатюры
Как сделать эффект лазера?  
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
28.06.2020, 11:22  [ТС]
Цитата Сообщение от DarkPtect Посмотреть сообщение
Создаёте объект, накидываете на него LineRenderer:
Не могу понять 2 вещи.
1. Вот я сделал дефолтный луч от башни до объекта

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
public class TowerLaser : MonoBehaviour{
    
    public float FindRadius = 2f;
    public float TimeShot = 0.5f;
    Enemy enemy;
    Transform towerHead;
    private float timerShot = 0f;
    Transform hit;
    LineRenderer lineRenderer;
 
    void Start(){
        towerHead = transform.Find("Head");
        GameObject lineObj = new GameObject("LineObj");
        lineRenderer = lineObj.AddComponent<LineRenderer>();
        }
    
    void Update(){
        if(enemy == null) FindEnemy();
            else{
                towerHead.LookAt(enemy.transform);
                shot();
                float dist = Vector3.Distance(enemy.transform.position, transform.position);
                if(dist > FindRadius) enemy = null;
                }       
        }
    
    public void shot(){
        timerShot -= Time.deltaTime;
        if(timerShot <= 0){
            timerShot = TimeShot;
            if(enemy!=null){
                lineRenderer.SetPosition(0, towerHead.transform.position);
                lineRenderer.SetPosition(1, enemy.transform.position);
                    }else{
                        Destroy(lineRenderer);
                        }   
            }
        }
    
    public void FindEnemy(){
        GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy") as GameObject[];
        float min = FindRadius;
        Enemy minEnemy = null;
        foreach(GameObject e in enemies){
            float dist = Vector3.Distance(e.transform.position, transform.position);
            if(dist <= min){
                min = dist;
                minEnemy = e.GetComponent<Enemy>();
                }
            }
        enemy = minEnemy;
        }
    }
Какой никакой луч появляется от башни до объекта, но после того как объект уходит из радиуса действия то это луч остается, я добавил Destroy(lineRenderer);, но тогда после первого пропадания он уже не появляется, так как я понял что я удаляю не именно этот луч а вообще его

2. Как прицепить свой префаб к этому лучу, пробую public LineRenderer lineRenderer; и в инспекторе вешаю на него созданный луч и его не видно вовсе...

Добавлено через 17 минут
В впринципе если не уничтожать а отключать то все получается
C#
1
lineRenderer.gameObject.SetActive(false);
Осталось только понять как спрайт прикрепить за место создаваемого нового объекта...
0
109 / 81 / 37
Регистрация: 13.01.2016
Сообщений: 409
28.06.2020, 11:37
Nebiros, Так. Понял. Суть в чём. Вы один раз создаёте LineRenderer! Один раз! Не более. И один раз устанавливаете начальную позицию. Лучше всего в старте или эвэйке - это позиция, откуда должен вылетать луч:
C#
1
LineRenderer.SetPosition(0, spawnBulletPosition); //например
Далее, проверяете наличие цели. Если цель имеется, то в Update устанавливаете во вторую точку позицию цели:

C#
1
2
3
4
5
6
7
    void Update()
    {
        if(target != null)
        {
            LineRenderer.SetPosition(1, target.transform.position);
        }
    }
Новый объект создавать не надо! Только один "рисователь" луча должен быть.
При смене цели в массив, в качестве второй точки - точки конца луча, начинаете передавать позицию новой цели.

Если луч не нужен, то можно удалять вторую точку с массива, либо отключать сам LineRenderer.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
28.06.2020, 12:44  [ТС]
Не пойму одну вещь, почему когда создается линия в старте
C#
1
2
GameObject lineObj = new GameObject("LineObj");
lineRenderer = lineObj.AddComponent<LineRenderer>();
то она есть, а если я хочу добавить префаб и объявляю
C#
1
public LineRenderer lineRenderer;
В инспекторе создаю объект типа линия, разрисовываю, смотрю какой она получилась, засовываю её в префабы, далее этот префаб цепляю на lineRenderer и при запуске нет никаких линий и ошибок тоже нет...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2020, 12:44
Помогаю со студенческими работами здесь

Unity как сделать эффект "вдавливание" кнопки
Как скриптом сделать так, что при при нажатии на объект (кнопку) она продавливалась внутрь?Спасибо.

Как сделать эффект размытия (эффект стекла) в Xaml?
Как сделать эффект размытия(эффект стекла) в Xaml?

Как сделать эффект
Как сделать эффект как на сайте http://velgorsky.ru/

Как сделать подобный эффект?
Доброе время суток, подскажите пожалуйста, как можно реализовать подобный эффект при наведении мышкой? Просто вообще не знаю с какой...

Как сделать такой эффект ?
Привет всем! Есть такой пример( картинка прикреплена) . Подскажите кто-нибудь как такой эффект сделать??Знаю что можно использовать...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
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
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru