Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/104: Рейтинг темы: голосов - 104, средняя оценка - 4.92
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
1

Touch управление в Unity3d

03.04.2016, 16:04. Показов 20410. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Очень прошу помочь с модификацией кода под мобильные устройства!
Имеется скрипт управления для ПК. Пытался переделать его под " touch управление", но не выходит.
Кто разбирается, помогите пожалуйста
Вложения
Тип файла: docx РЎРљР Р?РџРў МОЕГО ПРЫЖКА.docx (12.0 Кб, 31 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2016, 16:04
Ответы с готовыми решениями:

Unity3d - Как проверить нажатие кнопки через touch
Подскажите пожалуйста как проверить нажатие на кнопку через Touch в Android игре? Я создал кнопку...

Как настроить управление персонажем под Touch на смартфоне?
Всем доброго времени суток! using System.Collections; using System.Collections.Generic; using...

Unity3d управление персонажем
здравствуйте. подскажите пожалуйста, как сделать управление персонажем от первого лица в unity3d,...

Unity3d - Управление персонажем (C#)
Подскажите пожалуйста каким способом можно сделать управление выбранным персонажем (например...

12
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
03.04.2016, 16:15  [ТС] 2
Вот этот скрипт для ПК:

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
public Vector2 mouseVect;
    public Vector2 sumVect;
    public Vector3 forceVect;
    public bool needImpulse;
 
    void Start () {
      
    }
    
    
    void Update () {
        if (Input.GetMouseButton(0))
        {
            mouseVect = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
            sumVect += mouseVect;
        }
        if (Input.GetMouseButtonUp(0))
        {
            needImpulse = true;
        }
 
    }
 
 
         void FixedUpdate()
              {
    if (needImpulse)
    {
        forceVect = new Vector3(sumVect.x,  sumVect.y);
         
        GetComponent<Rigidbody2D>().AddForce(-forceVect, ForceMode2D.Impulse) ;
            
            sumVect = Vector3.zero;
        needImpulse = false;
            
        }
}
}
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
03.04.2016, 17:19 3
Лучший ответ Сообщение было отмечено Alex xs как решение

Решение

Alex xs,
Input.touches
Структура Touch
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
public Vector2 mouseVect;
    public Vector2 sumVect;
    public bool needImpulse;
    private Vector2 startPos;
 
    void Update () {
        if (Input.touchCount>0)
        {
            if (Input.touches[0].phase == TouchPhase.Began) // если тач только начался (палец коснулся экрана)
               startPos = Input.touches[0].position; // запоминаем позицию
            if (Input.touches[0].phase == TouchPhase.TouchPhase.Ended) { // если тач окончен (палец оторвался от экрана)
               sumVect = startPos - Input.touches[0].position; // вычисляем вектор сдвига
               needImpulse = true;
            }       
        }
    }
 
    void FixedUpdate()
    {
    if (needImpulse)
    {
        Vector3 forceVect = new Vector3(sumVect.x,  sumVect.y); // этот вектор только используется
        GetComponent<Rigidbody2D>().AddForce(-forceVect, ForceMode2D.Impulse);
        needImpulse = false;
        }
}
}
И конечно, обрабатывается только ПЕРВЫЙ тач, если во время тача вторым пальцем коснуться - он будет проигнорирован.
1
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
03.04.2016, 19:08  [ТС] 4
Спасибо вам огромное!
Правда вектор не корректно вычисляется(
получается что движение осуществляется только по "Y".
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
04.04.2016, 00:03 5
Alex xs, а если так?
C#
1
Vector3 forceVect = new Vector3(sumVect.x,  0f, sumVect.y);
1
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
04.04.2016, 19:48  [ТС] 6
А теперь только по "X")) не пойму, может что-то не так в вычислении вектора сдвига?

Добавлено через 34 минуты
Ведь в void FixedUpdate() практически ничего не изменено со скрипта на ПК, а на ПК всё работало идеально. Можете помочь разобраться с этим?
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
04.04.2016, 19:52 7
Alex xs, в лог выведите из фикседа sumVect
1
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
05.04.2016, 20:42  [ТС] 8
Всё равно не выходит(
Всё таки мне кажется что-то не так с вектором в Update , а что, понять не могу - он как бы вычисляется только по "Х". пытался сделать вот так, но это то же самое:
C#
1
2
3
4
5
6
7
8
9
 void Update () {
        if (Input.touchCount>0) Debug.Log("Global touch!");
        {
            if (Input.touches[0].phase == TouchPhase.Began)  // если тач только начался (палец коснулся экрана)
            startPos = new Vector2 (Input.touches[0].position.x,Input.touches[0].position.y); // запоминаем позицию
            if (Input.touches[0].phase == TouchPhase.Ended) { // если тач окончен (палец оторвался от экрана)
               sumVect =  startPos - Input.touches[0].position; // вычисляем вектор сдвига
                
                needImpulse = true;
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
05.04.2016, 21:52 9
Лучший ответ Сообщение было отмечено Alex xs как решение

Решение

Сейчас у себя проверю

Добавлено через 21 минуту
Работает всё. Проверил на Explay Fresh. Единственное что я напутал, так это
C#
1
sumVect =  Input.touches[0].position - startPos; // вычисляем вектор сдвига
так должно быть, иначе в обратную сторону смотрит.
Вот полный скрипт (arrow - это го со скриптом стрелки, чтобы визуализировать):
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
using UnityEngine;
using System.Collections;
 
public class SwipeTest : MonoBehaviour {
 
    public Vector2 sumVect;
    public bool needImpulse;
    public Vector2 startPos;
    public GameObject arrow;
 
    void Update()
    {
        if (Input.touchCount > 0)
        {
            if (Input.touches[0].phase == TouchPhase.Began) // если тач только начался (палец коснулся экрана)
                startPos = Input.touches[0].position; // запоминаем позицию
            if (Input.touches[0].phase == TouchPhase.Ended)
            { // если тач окончен (палец оторвался от экрана)
                sumVect = (Input.touches[0].position - startPos); // вычисляем вектор сдвига
                needImpulse = true;
            }
            if (Input.touches[0].phase == TouchPhase.Moved)
            {
                sumVect = (Input.touches[0].position - startPos).normalized; // вычисляем вектор сдвига
                arrow.transform.up = sumVect;
            }
        }
    }
 
    void FixedUpdate()
    {
        if (needImpulse)
        {
            needImpulse = false;
        }
    }
}
1
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
06.04.2016, 17:36  [ТС] 10
И действительно всё работает! я сам не допетрил сразу) Огромнейшее вам спасибо за помощь!!!
0
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
10.04.2016, 14:05  [ТС] 11
Отдельное спасибо за arrow)
Можно ещё вопросик? сейчас arrow постоянно висит GameObject'том. Я хотел сделать чтобы arrow вызывался Префабом при таче. Получается что arrow вызывается тачем, но плодит клонов каждый кадр. Как этого избежать, и чтобы префаб arrow вёл себя так же как и GameObject arrow?
Вот что у меня получилось:
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
 public Vector2 sumVect;
    public bool needImpulse;
    public Vector2 startPos;
    public Transform arrow;
 
    void Update()
    {
        if (Input.touchCount > 0)
        {
            if (Input.touches[0].phase == TouchPhase.Began) // если тач только начался (палец коснулся экрана)
                startPos = Input.touches[0].position; // запоминаем позицию
            if (Input.touches[0].phase == TouchPhase.Ended)
            { // если тач окончен (палец оторвался от экрана)
                sumVect = (Input.touches[0].position - startPos); // вычисляем вектор сдвига
                needImpulse = true;
            }
            if (Input.touches[0].phase == TouchPhase.Moved)
            {
                sumVect = (Input.touches[0].position - startPos).normalized; // вычисляем вектор сдвига
                arrow.transform.up = sumVect;
           arrow = Instantiate(arrow) as Transform;
           arrow.position = transform.position;
            }
        }
    }
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
10.04.2016, 14:18 12
Да просто при таче arrow.SetActive(true) и при окончании arrow.SetActive(false)
Нечего плодить ненужные сущности без необходимости.

Добавлено через 8 минут
И позицию задавать лучше при начале тача, а не при сдвиге.
1
 Аватар для Alex xs
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 14
10.04.2016, 15:54  [ТС] 13
Всё работает, спасибо большое!
0
10.04.2016, 15:54
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2016, 15:54
Помогаю со студенческими работами здесь

Андроид управление unity3d
Всем привет!!! Помогите мне, пожалуйста, перевести скрипт с ПК на Андроид управление. Вот скрипт ...

Управление на андроид (кнопками) unity3d
Всем доброго времени суток! хочу сделать управление с помощью кнопок для 2d платформера на...

Андроид управление для игры в Unity3D
Здравствуйте! сделал код по видео для пк по клавишам,а вот как сделать для кнопок не знаю(ходить...

[Unity3D] Управление персонажем на телефоне так называемой каплей(джойстиком)
Добрый день, еще давно видел где то в интернете такой красивый &quot;джойстик&quot; в виде капли.. и недавно...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru