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

Разработка игры на телефон

26.02.2021, 02:46. Показов 2210. Ответов 16

Студворк — интернет-сервис помощи студентам
Не могу решить проблему... в общем у меня есть объект который испускает луч... я хочу сделать так чтобы при активации этот луч постепенно увеличивался в определенном направлении и при этом его начало находилось в координатах объекта.... сама проблема в том, что луч у меня растягивается по обеим сторонам, а нужно чтобы с одной стороны и в сторону цели, не могу это сделать... пробовал смещать позицию но луч вечно куда то уходил от моего объекта... буду благодарен если поможете!

p.s игра 2Д
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2021, 02:46
Ответы с готовыми решениями:

От чего может сильно греться телефон от игры?
От чего может сильно греться телефон от игры? Собственно сделал игру 3 в ряд и запустил на телефоне потесить, довольно таки нагрелся...

разработка игры на телефон
Не могу решить проблему... в общем у меня есть объект который испускает луч... я хочу сделать так чтобы при активации этот луч постепенно...

Asp core Разработка под телефон (Интерфейс)
Добрый день. Разрабатываю приложение под телефон с небольшим экраном. Сейчас интерфейс смотрю в браузере, но хочется видеть пример...

16
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
26.02.2021, 03:48
SpideCode,
Код в студию, pls!
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
26.02.2021, 04:08  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
public void Rotate_and_Transform_func(Transform object_shut,Transform object_Enemy, float time)
    {
        
        Vector3 defence = object_Enemy.position - object_shut.position;
 
        object_shut.position =  Vector2.MoveTowards(object_shut.position, object_Enemy.position, time);
        
        float rotateZ = Mathf.Atan2(defence.y,defence.x) * Mathf.Rad2Deg;
 
        object_shut.rotation = Quaternion.Euler(0f,0f,rotateZ);
    }
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
26.02.2021, 05:12
SpideCode,
А где здесь луч? Я вижу только код перемещения объекта object_shut к объекту object_Enemy. Тут никакого растягивания я не вижу.
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
26.02.2021, 12:11  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public void Rotate_and_Transform_func(Transform object_shut,Transform object_Enemy, float time)
    {
        speed += 1f;
 
       Vector3 defence = object_Enemy.position - object_shut.position;
        
            object_shut.localScale = new Vector2(speed * 0.05f,transform.localScale.y);
        
            Vector2.MoveTowards(Player.position,object_Enemy.position,1f);
    
            float rotateZ = Mathf.Atan2(defence.y,defence.x) * Mathf.Rad2Deg;
 
            transform.position = new Vector2(Player.position.x,Player.position.y);
         
            object_shut.rotation = Quaternion.Euler(0f,0f,rotateZ);
      
    }
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
26.02.2021, 12:12  [ТС]
Ronin_v,
Миниатюры
Разработка игры на телефон  
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
26.02.2021, 12:14  [ТС]
Ronin_v, Нужно чтобы от самого игрока луч увеличивался к шару, а он от середины растягивается... возможно формула какая то есть чтобы было соотношение позиции увеличение по оси х
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
26.02.2021, 18:58
SpideCode,
Так должно работать. Только нужно ещё определять попадание и потом так же уменьшать луч уже с другого конца.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public Transform shut;
    public Transform enemy;
 
    private void FixedUpdate()
    {
        Rotate_and_Transform_func(shut, enemy, 0.03f);
    }
    public void Rotate_and_Transform_func(Transform object_shut, Transform object_Enemy, float time)
    {
 
        Vector3 defence = object_Enemy.position - object_shut.position;
 
        object_shut.position = Vector2.MoveTowards(object_shut.position, object_Enemy.position, time);
 
        float rotateZ = Mathf.Atan2(defence.y, defence.x) * Mathf.Rad2Deg;
 
        object_shut.rotation = Quaternion.Euler(0f, 0f, rotateZ);
 
        object_shut.localScale = new Vector3(object_shut.localScale.x + time, object_shut.localScale.y, object_shut.localScale.z);
    }
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
27.02.2021, 01:24  [ТС]
Ronin_v, Да все работает, спасибо!)) Есть еще один момент... когда лазер появляется он не преследует объект который его испускает, то есть лазер остается в воздухе где то... как то нужно установить слежение за позицией игрока... пробовал в movetowards поставить начальную позицию самого player, но луч почему на месте стоит и не двигается к врагу...
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
27.02.2021, 01:27  [ТС]
Ronin_v,
Миниатюры
Разработка игры на телефон  
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
27.02.2021, 09:39
SpideCode,
Ну вот как то так получилось.

Сам скрипт
Кликните здесь для просмотра всего текста
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System.Collections;
using UnityEngine;
 
public class ShotManager : MonoBehaviour
{
    public Transform Shooter;   //Сюда положить стрелка
    public GameObject lazer;    //Сюда положить спрайт лазера.
    public Transform enemy; //Сюда положить цель
    public float LazerSpeed = 1.5f; //Скорость полета луча
 
    private bool shot = false;  
    private float timeForNextShot = 0.2f;   //Задержка перед следующим выстрелом.
    private float tempTimer;
    private GameObject tempLazer;
 
    private Vector2 posA, posB, posC;   //Переменные для рисования точек в Gizmos
 
    private AudioSource[] AS;   //Для воспроизведение звука
 
    public bool _LazerHit = false;  //Есть ли попадание. (Нужно, чтоб противник отлетал при попадании)
 
    private void Start()
    {
        AS = GetComponents<AudioSource>();
    }
 
    private void Update()
    {
        tempTimer += Time.deltaTime;
        if (Input.GetMouseButtonDown(0) && !shot && tempTimer > timeForNextShot)    //Если нажали кнопку мышки, выстрел не активен и время задержки прошло
        {
            shot = true;    //Делаем выстрел
            tempLazer = Instantiate(lazer, Shooter.position, Quaternion.identity);  //Создаем лазерный луч
            AS[0].Play();   //Проигрываем звук
            AS[1].Play();
            StartCoroutine(Rotate_and_Transform_func(tempLazer.transform, enemy, LazerSpeed));  //Стартуем карутину для расчета движения луча
        }
        if (Input.GetMouseButtonUp(0) && shot)  //Если кнопку мышки отпустили и выстрел продолжается 
        {
            AS[1].Stop();   //Останавливаем звук
            AS[2].Play();   //Проигрываем звук завершения стрельбы.
            shot = false;   //Выстрел закончен
            tempTimer = 0;  //Обнулили таймер задержки.
        }
    }
 
    //Метод для просчета поворота луча в сторону цели.
    private void RotateLazerSprite()
    {
                Vector3 defence = enemy.position - Shooter.position;
                float rotateZ = Mathf.Atan2(defence.y, defence.x) * Mathf.Rad2Deg;
                tempLazer.transform.rotation = Quaternion.Euler(0f, 0f, rotateZ);
    }
    
    //Метод для расчета движения луча.
    public IEnumerator Rotate_and_Transform_func(Transform object_shut, Transform object_Enemy, float time)
    {
        //Создаем две точки. Точка А = это начало луча, точка Б = это конец луча.
        Vector3 _lazerA = Shooter.position + Vector3.right * 0.1f;
        Vector3 _lazerB = Shooter.position;
        SpriteRenderer SR = object_shut.GetComponent<SpriteRenderer>(); //Кешируем рендер созданного луча
        //Запускаем движение луча.
        while (true)
        {
            //Этот цикл будет повторятся пока начало луча не дойдет до цели.
            while (_lazerA != enemy.position)   //Пока начало луча не достигло цели делать следующее
            {
                RotateLazerSprite();    //Повернуть луч в сторону цели
                _lazerA= Vector2.MoveTowards(_lazerA, enemy.position, time);    //Сдвигаем точку начала луча
                SpriteScale(_lazerA, _lazerB, object_shut.gameObject, SR);  //Вызываем метод для расчета растягивания спрайта
                posA = _lazerA; //Нужно для рисования точки в Gizmos. При желании можно удалить.
                yield return new WaitForEndOfFrame();   
            }
            if (_lazerA == enemy.position)  //Если есть попадание в цель
            {
                _LazerHit = true;   //То делаем переменную истиной. (Нужно в другом скрипте для просчета отскока противника от попадания. Можно удалить)
            }
            //Этот цикл будет повторятся пока конец луча не придет в точку попадания.
            //Тут мы двигаем конец луча к точке попадания после завершения выстрела.
            while (_lazerB != _lazerA && !shot)
            {
                RotateLazerSprite();
                _lazerB = Vector2.MoveTowards(_lazerB, _lazerA, time);
                SpriteScale(_lazerA, _lazerB, object_shut.gameObject, SR);
                posB = _lazerB;
                yield return new WaitForEndOfFrame();
            }
            yield return new WaitForEndOfFrame();
            if (_lazerA == _lazerB) //Когда конец луча пришел в точку куда попал луч
            {
                Destroy(tempLazer.gameObject);  //Тогда уничтожаем объект "Луч"
                break;  //Завершаем цикл.
            }
        }
 
    }
 
    //Метод для растягивания спрайта.
    private void SpriteScale(Vector2 Apoint, Vector2 Bpoint, GameObject _lazer, SpriteRenderer sr)
    {
        Vector2 centr = Vector2.Lerp(Apoint, Bpoint, 0.5f); //Вычисляем центральную точку между началом и концом луча.
        _lazer.transform.position = centr;  //Переносим спрайт в центральную точку.
        posC = _lazer.transform.position;   //Нужно для Gizmos
        float X = Vector2.Distance(Apoint, centr);  //Меряем дистанцию от точки А к центру.
        //Вычисляем на сколько нужно растянуть спрайт.
        float XspriteSize = _lazer.transform.localScale.x  / ((sr.bounds.extents + sr.bounds.extents ).magnitude);  
        _lazer.transform.localScale = new Vector2(X * (XspriteSize * 2), _lazer.transform.localScale.y);
 
    }
 
    //Этот метод нужен для рисования точек в едиторе. Можно удалить. 
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawSphere(posA, 0.1f);
        Gizmos.color = Color.green;
        Gizmos.DrawSphere(posB, 0.1f);
        Gizmos.color = Color.blue;
        Gizmos.DrawSphere(posC, 0.1f);
    }
}
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
27.02.2021, 11:27  [ТС]
Ronin_v,


Добавлено через 2 минуты
Ronin_v, классный скрипт, намного лучше чем у меня)) только вот как сделать, чтобы мой лазер своим началом следил за игроком... в принципе сейчас попробую с твоим кодом поиграть может что и получится)))
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
27.02.2021, 11:32
SpideCode,
Я так понимаю, что команду на стрельбу должен давать не игрок?
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
27.02.2021, 11:43  [ТС]
Ronin_v, Да, кнопка справа

Добавлено через 1 минуту
Ronin_v, на самом деле это не имеет значение... главное чтобы луч игрока преследовал тоже
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
27.02.2021, 11:47
SpideCode,
Обычная UI кнопка будет реагировать тогда, когда отпустить её. Если нужно, чтобы луч работал пока кнопка зажата, нужно немного по другому её настроить. В моем скрипте луч будет следить за целью пока кнопка мышки нажать. Тоже самое можно сделать и для UI кнопки.
0
1 / 1 / 0
Регистрация: 19.02.2021
Сообщений: 31
01.03.2021, 12:18  [ТС]
Ronin_v,
C#
1
2
3
4
5
6
7
 Vector2 centr = Vector2.Lerp(Apoint, Bpoint, 0.5f); //Вычисляем центральную точку между началом и концом луча.
        _lazer.transform.position = centr;  //Переносим спрайт в центральную точку.
        posC = _lazer.transform.position;   //Нужно для Gizmos
        float X = Vector2.Distance(Apoint, centr);  //Меряем дистанцию от точки А к центру.
        //Вычисляем на сколько нужно растянуть спрайт.
        float XspriteSize = _lazer.transform.localScale.x  / ((sr.bounds.extents + sr.bounds.extents ).magnitude);  
        _lazer.transform.localScale = new Vector2(X * (XspriteSize * 2), _lazer.transform.localScale.y);

Объясни пожалуйста как ты додумался до этого кода, я не понимаю как здесь все работает, зачем переносить спрайт в центральную точку? Зачем мерить дистанцию от точки А к центру? а последние две строки это вообще жесть как ты да них додумался??
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
02.03.2021, 01:26
Лучший ответ Сообщение было отмечено SpideCode как решение

Решение

SpideCode,
Цитата Сообщение от SpideCode Посмотреть сообщение
зачем переносить спрайт в центральную точку?
Когда ты скейлишь спрайт по оси X, то он растягивается в обе стороны.
Кликните здесь для просмотра всего текста

По этому и нужно переносить спрайт в центр, чтоб равномерно его растянуть. Центральная точка тоже двигается по мере того, как продвигается точка А(начало луча).
В принципе, можно было бы и изменить центровку спрайта в SpriteEditor в его начало. Тогда бы он скейлился из начальной точки и не нужно было бы переносить. Но, как говориться, умная мысля приходит опосля!
Кликните здесь для просмотра всего текста


Цитата Сообщение от SpideCode Посмотреть сообщение
Зачем мерить дистанцию от точки А к центру?
Для того, чтоб знать, на сколько нужно растянуть спрайт. Не обязательно мерить от точки Б к центру. Можно было бы и померить от точки А к точки Б. Потом и не нужно было бы умножать на 2 дальше.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
        float X = Vector2.Distance(Apoint, Bpoint);
        //Вычисляем на сколько нужно растянуть спрайт.
        float XspriteSize = _lazer.transform.localScale.x  / ((sr.bounds.extents + sr.bounds.extents ).magnitude);  
        _lazer.transform.localScale = new Vector2(X * XspriteSize, _lazer.transform.localScale.y);


Цитата Сообщение от SpideCode Посмотреть сообщение
а последние две строки это вообще жесть
Спрайты могут иметь разные размеры в пикселях. Для примера:
Кликните здесь для просмотра всего текста

Есть два спрайта. Один имеет размер 100х25 пикселей, а другой 300х25. Один длиннее второго, но у обоих у них Scale.x = 1. Можно специально делать спрайт строго с заданными пикселями и растягивать без этих заморочек, но вариант в коде более универсальный, потому, что может вычислять размер спрайта. А делается это при помощи "границ".
К примеру у куба в разном его положении сами размеры не будут меняться, но размеры его границ будут изменяться.
Кликните здесь для просмотра всего текста

Точно так же и у спрайта. при одном и том же Scale размер границ будет разным. Благодаря чему мы и можем рассчитать на сколько нужно растягивать спрайт.
Цитата Сообщение от SpideCode Посмотреть сообщение
как ты да них додумался??
Я не специально! Оно само так получилось.
Если подумать, можно было бы всё ещё проще сделать! Но, как уже писал, умная мысля...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2021, 01:26
Помогаю со студенческими работами здесь

Asp core Разработка под телефон (Интерфейс)
Добрый день. Разрабатываю приложение под телефон с небольшим экраном. Сейчас интерфейс смотрю в браузере, но хочется видеть пример...

Игры вдвоем через телефон
Привет! Поскажите плиз можно ли играть в игры через диалап. Короче у моего друга (живет в другом конце города)и у меня есть модем,...

Ищу программиста для создания игры на мобильный телефон
Всем привет! Почти сделал игру на компьютер жанра Tower Defense, теперь ишу программиста с которым можно будет сделать порт моей этой самой...

Помогите плиз,у меня проблема скинуть игры с компа на телефон
Помогите плиз,у меня проблема скинуть игры с компа на телефон

Разработка 2Д игры
Как думаете, как лучше реализовать передвижение персонажа в 2д игре на Java,передвижение фона, который надо зациклить или передвижение...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 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. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru