24 / 18 / 6
Регистрация: 23.10.2017
Сообщений: 136
1

Поворот игрока в TDS игре на андройд

11.06.2019, 02:13. Показов 3258. Ответов 7
Метки нет (Все метки)

Чтобы не подключать каждый раз смарт для теста, тестировал на компе и управление было кнопки + мышь. Ходил на WASD, а персонаж поворачивался за курсором. Ну вот разработка подходит к концу и начал постепенно работать над управлением. Добавил стик из Asset Store для ходьбы и вот предо мной встала задача. Мне же еще нужно стрелять и поворачивать персонажа, допустим если для того, чтобы стрелять я добавил авто стрельбу по нажатию кнопки. Но с поворотом так и не смог сообразить как сделать. Уже решил, что поворот будет так же стиком, но не хватает знаний, чтобы это реализовать

Добавлено через 26 минут
Ещё хотел сделать авто наведение на ближайший объект с тегом "enemy". Например получаю массив всех enemy на карте
C#
1
Gameobject[] GO = FindGameObjectsWidthTeg("enemy");
Но вот как отслеживать того кто ближе всех к игроку?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2019, 02:13
Ответы с готовыми решениями:

Наведения врага на игрока оружием в TDS ( игра с видом сверху) в Unity2D
Я хочу сделать чтобы враг наводился на игрока за которого я управляю и начинал стрелять! Но не знаю...

Подсветка выстрела в TDS игре на Unity2D
Я хочу сделать подсветку выстрела и вспышки в игре, но только не знаю как это сделать. Чтобы игра...

Свечение объекта в TDS игре на Unity2D
Я хочу сделать свечение объекта (Glow), но не знаю как это сделать! Есть ассет один в юнити MK...

Движение камеры за курсором в TDS игре на Unity2D
Я хочу сделать так чтобы когда персонаж отводил в сторону курсор то камера немного следовала за...

7
104 / 77 / 36
Регистрация: 13.01.2016
Сообщений: 393
11.06.2019, 09:13 2
Например, можно через цикл foreach. Он проходится по всему массиву по порядку ну и обычная сортировка, чтобы найти наименьшее расстояние

C#
1
2
3
4
5
6
7
float dist = Vector3.Distance(transform.position, GO[0].transform.position);
 
foreach(GameObject obj in GO)
{
   if(Vector3.Distance(transform.position, obj.transform.position) < dist)
dist = Vector3.Distance(transform.position, obj.transform.position);
}
Добавлено через 3 минуты
Для поворота можно отслеживать вектор между стиком и его начальной позицией, затем этот вектор нормализовать и использовать для поворота персонажа. Если никто не ответит, то вечером распишу, как это сделать
0
24 / 18 / 6
Регистрация: 23.10.2017
Сообщений: 136
11.06.2019, 09:54  [ТС] 3
Хорошо, буду очень благодарен
0
104 / 77 / 36
Регистрация: 13.01.2016
Сообщений: 393
11.06.2019, 21:30 4
Лучший ответ Сообщение было отмечено gamdjin как решение

Решение

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
public class Joystic : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler {
 
    private Image bgImg, joystic;
    private Vector3 inputVector;
 
    private void Start()// тут получаем заднюю основу и стик
    {
        bgImg = GetComponent<Image>();
        joystic = transform.GetChild(0).GetComponent<Image>();
    }
 
    public virtual void OnDrag(PointerEventData ped)  //В этой функции создаём движение стика за пальцем и ограничиваем, чтобы не вылазил за определённые рамки
    {
        Vector2 pos;
        if(RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos))
        {
            pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);
            pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);
 
            inputVector = new Vector3(pos.x * 2, 0, pos.y *2);
 
            inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
 
            joystic.rectTransform.anchoredPosition = new Vector3(inputVector.x * (bgImg.rectTransform.sizeDelta.x / 3), inputVector.z * (bgImg.rectTransform.sizeDelta.y / 3));
        }
    }
 
    public virtual void OnPointerDown(PointerEventData ped) //нажатие на стик
    {
        OnDrag(ped);
    }
 
    public virtual void OnPointerUp(PointerEventData ped) // отпускаем стик - он возвращается в центр основания
    {
        inputVector = Vector3.zero;
        joystic.rectTransform.anchoredPosition = Vector3.zero;
    }
 
    public float Horizontal() // стандартный ввод для получения координат вектора, если он не нулевой
    {
        if (inputVector.x != 0)
            return inputVector.x;
        else
            return Input.GetAxis("Horizontal");
    }
 
    public float Vertical() //тоже самое, по другим координатам
    {
        if (inputVector.z != 0)
            return inputVector.z;
        else
            return Input.GetAxis("Vertical");
    }
}
Это скрипт джойстика. Если на нём был клик и после этого движение, то стик движется за курсором, при отжатии - возвращается в центр. Так же сделаны ограничения, чтобы он не выходил за определённую область.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class PlayerController : MonoBehaviour {
 
    public Player Value = new Player();
    float time = 2;
 
    public Vector3 MoveVector { set; get; }
    public Vector3 RotateVector { set; get; }
 
    public Joystic joystic;
    public RotationJoystic rotJoystic;
 
 
    private void Update()
    {
        MoveVector = PoolInput(); // функция возвращает вектор для перемещения
        RotateVector = RotInput(); // функция вернёт вектор для поворота
 
        Move(); // тут используем полученные вектора 
    }
 
    private void Move()
    {
        transform.position += (MoveVector * Value.speed * Time.deltaTime);
        transform.rotation = Quaternion.LookRotation(RotateVector);
    }
 
    private Vector3 RotInput()  //получение у джойстика вектора для поворота и его нормализация(приравнивание к 1)
    {
        Vector3 dir = Vector3.zero;
 
        dir.x = rotJoystic.Horizontal();
        dir.z = rotJoystic.Vertical();
 
        if (dir.magnitude > 1)
            dir.Normalize();
 
        return dir;
    }
 
    private Vector3 PoolInput()  // получение у джойстика вектора для перемещения и его нормализация
    {
        Vector3 dir = Vector3.zero;
 
        dir.x = joystic.Horizontal();
        dir.z = joystic.Vertical();
 
        if (dir.magnitude > 1)
            dir.Normalize();
 
        return dir;
    }
Второй скрипт получает из первого необходимые вектора
1
24 / 18 / 6
Регистрация: 23.10.2017
Сообщений: 136
13.06.2019, 13:36  [ТС] 5
Я использовал только
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
transform.rotation = Quaternion.LookRotation(RotateVector);
 
private Vector3 RotInput()  //получение у джойстика вектора для поворота и его нормализация(приравнивание к 1)
    {
        Vector3 dir = Vector3.zero;
 
        dir.x = rotJoystic.Horizontal();
        dir.z = rotJoystic.Vertical();
 
        if (dir.magnitude > 1)
            dir.Normalize();
 
        return dir;
    }
Т.к. у меня "свои" стики. Что поменять, чтобы вращение было по оси z, а то у меня tds игра, а вращение идет по оси у
0
104 / 77 / 36
Регистрация: 13.01.2016
Сообщений: 393
13.06.2019, 14:26 6
Короче, джойстик в плоскости XY находится, ты получаешь вектор. Персонаж в плоскости XZ. Тебе надо координату Y полученного вектора от джойстика передаться в координату Z персонажа. Ну, вернее менять координату Z при отклонении джойстика по координате Y
0
248 / 185 / 67
Регистрация: 04.03.2019
Сообщений: 1,010
13.06.2019, 15:08 7
Цитата Сообщение от gamdjin Посмотреть сообщение
"свои" стики
а что за стики?
виртуальный джойстик видел. а стик нет еще
0
104 / 77 / 36
Регистрация: 13.01.2016
Сообщений: 393
13.06.2019, 15:36 8
MuaddibFremen,
Я хз как это назвать, у джойстика есть соски, стики, как угодно. Мы вот про них
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2019, 15:36

Дистанция стрельбы в TDS игре на unity2D (вид сверху)
Я хочу сделать так, чтобы когда игрок приближался на определенную дистанцию к врагу, то он начинал...

Реагирование персонажей на звук выстрела в TDS игре на Unity2D
Я хочу чтобы враги когда я стрелял реагировали на звук выстрела и потом начали стрелять в меня. Не...

Не получается сделать камеру как в TDS игре Hotline Miami
Я хочу сделать камеру как в игре Хотлайн Миами. Только вот нихера не получается!! Я не понимаю...

Вспышка после выстрела в TDS игре на Unity2D (игра с видом сверху)
Я хочу сделать вспышку после выстрела в игре. Но не знаю как это реализовать и не знаю где брать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru