Среда, 27 Ноября 2024, 11:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Расскажите пожалуйста сделать на подобии этого?
dzrone3488Дата: Пятница, 01 Декабря 2017, 23:50 | Сообщение # 1
участник
Сейчас нет на сайте
Я не знаю как объяснить, а если и попробую вы всё равно нечего не поймёте :) . Так что просто покажу пример:




Мне нужно сделать тоже самое для отдельных игроков, но я не знаю как сделать проверку, чтобы Sprite менялся в зависимости от того в какую сторону повёрнут первый игрок, и где расположен другой по отношению к первому. У меня всего 8 сторон (45 градусов). Я пока что только практикуюсь в этом плане.Огромное спасибо заранее. Буду рад любой помощи! lovegcup

P.S Игра от первого лица, управление как в Moirai. Игроки должны выглядеть как в Doom 1 или 2


Я делаю игры, а вы в них играете! :)
Моя группа по созданию игр - www.vk.com/dzrone

SkySupraДата: Понедельник, 04 Декабря 2017, 14:11 | Сообщение # 2
частый гость
Сейчас нет на сайте
Я бы реализовал следующим образом. Создаем класс контейнер с полями: угол взгляда, анимации (стоять, бег...) и др.
Формируем набор контейнеров для каждого угла (0 градусов - смотрим в спину, 90 в бок и тд.
На сцене имеем два юнита. Каждый имеет вектор взгляда. Для отрисовки юнита находим угол между взглядом этого юнита и самого игрока. Полученный угол округляем до ближайшего угла кратного 45. После выбираем нужный контейнер с анимациями.
Последний этап, нужно определить в какой области находится найденный угол для зеркалирования спрайтов, чтобы не задавать 2 разных набора для поворота в сторону.
dzrone3488Дата: Понедельник, 04 Декабря 2017, 17:17 | Сообщение # 3
участник
Сейчас нет на сайте
Цитата SkySupra ()
Я бы реализовал следующим образом. Создаем класс контейнер с полями: угол взгляда, анимации (стоять, бег...) и др.
Формируем набор контейнеров для каждого угла (0 градусов - смотрим в спину, 90 в бок и тд.
На сцене имеем два юнита. Каждый имеет вектор взгляда. Для отрисовки юнита находим угол между взглядом этого юнита и самого игрока. Полученный угол округляем до ближайшего угла кратного 45. После выбираем нужный контейнер с анимациями.
Последний этап, нужно определить в какой области находится найденный угол для зеркалирования спрайтов, чтобы не задавать 2 разных набора для поворота в сторону.


Спасибо за ответ! Хоть кто-то. Но для меня это чёрный лес и я в принципе работаю с такими вещами в первый раз. Я бы был бы очень благодарен, если бы ты рассказал бы это поподробнее (если с иллюстрациями то вообще эталон)! Я бы с радостью потом поделился своим скриптом, потому что не я первый, не я последний. Или если существуют хоть какие-нибудь статьи на эту тему?


Я делаю игры, а вы в них играете! :)
Моя группа по созданию игр - www.vk.com/dzrone

SkySupraДата: Вторник, 05 Декабря 2017, 17:45 | Сообщение # 4
частый гость
Сейчас нет на сайте
Подробнее могу сегодня вечером написать, когда буду за компом.
По статьям не знаю, возможно есть, надо смотреть. Также как вариант можно в ассет сторе проверить аналогичные задачи.

Добавлено (05 декабря 2017, 17:45)
---------------------------------------------
Набросал систему поворота, ссылка на GitHub. Основные моменты.
Находим угол между взглядом юнита и камерой. После отдаём этот угол в GetAvatarByAngle. Чтобы определить нужно ли поворачивать спрайт (т.е. смотрим на бок юнита с левой стороны или с правой), производим векторное произведение.
Код

private void Update()
{
    float angleCamUnit = Vector3.Angle(trCamera.forward, trUnit.forward);
    AvatarDirection avatar = avatarConfig.GetAvatarByAngle(angleCamUnit);

    bool isFlip = false;
    if(avatar.IsCanFlip)
    {
        Vector3 cross = Vector3.Cross(trCamera.forward, trUnit.forward);
        isFlip = cross.y < 0;
    }

    rendererModel.sprite = avatar.Idle;
    rendererModel.flipX = isFlip;
}

Здесь производим поиск ближайшего угла из заданных avatarDirections. После возвращаем AvatarDirection.
Код

public AvatarDirection GetAvatarByAngle(float directionAngleDeg)
{
    float smallestLengVel = float.MaxValue;
    AvatarDirection best = avatarDirections[0];
    foreach(var item in avatarDirections)
    {
        float angleDiff = Mathf.Abs(Mathf.DeltaAngle(directionAngleDeg, item.AngleDeg));

        if(angleDiff < smallestLengVel)
        {
            best = item;
            smallestLengVel = angleDiff;
        }
    }

    return best;
}

AvatarDirection это контейнер набор графики (например анимация: стоять, бежать, атаковать) и др. настройки. Так же в нём задаём угол (про котором нужно выбирать этот набор).
Далее делаем из UnitController машину состояний и скармливаем ему выбранный AvatarDirection. Например, если юнит находится в состоянии бега, то в зависимости от угла мы видим тот или иной набор анимации бега.
Также можно поправить билдборд, но это уже зависит от конкретных задач, как мы хотим поворачивать спрайт на камеру.



Сообщение отредактировал SkySupra - Вторник, 05 Декабря 2017, 17:47
dzrone3488Дата: Воскресенье, 10 Декабря 2017, 16:33 | Сообщение # 5
участник
Сейчас нет на сайте
Цитата SkySupra ()
Подробнее могу сегодня вечером написать, когда буду за компом.
По статьям не знаю, возможно есть, надо смотреть. Также как вариант можно в ассет сторе проверить аналогичные задачи.

Добавлено (05 декабря 2017, 17:45)
---------------------------------------------
Набросал систему поворота, ссылка на GitHub. Основные моменты.
Находим угол между взглядом юнита и камерой. После отдаём этот угол в GetAvatarByAngle. Чтобы определить нужно ли поворачивать спрайт (т.е. смотрим на бок юнита с левой стороны или с правой), производим векторное произведение.
Код

private void Update()
{
    float angleCamUnit = Vector3.Angle(trCamera.forward, trUnit.forward);
    AvatarDirection avatar = avatarConfig.GetAvatarByAngle(angleCamUnit);

    bool isFlip = false;
    if(avatar.IsCanFlip)
    {
        Vector3 cross = Vector3.Cross(trCamera.forward, trUnit.forward);
        isFlip = cross.y < 0;
    }

    rendererModel.sprite = avatar.Idle;
    rendererModel.flipX = isFlip;
}

Здесь производим поиск ближайшего угла из заданных avatarDirections. После возвращаем AvatarDirection.
Код

public AvatarDirection GetAvatarByAngle(float directionAngleDeg)
{
    float smallestLengVel = float.MaxValue;
    AvatarDirection best = avatarDirections[0];
    foreach(var item in avatarDirections)
    {
        float angleDiff = Mathf.Abs(Mathf.DeltaAngle(directionAngleDeg, item.AngleDeg));

        if(angleDiff < smallestLengVel)
        {
            best = item;
            smallestLengVel = angleDiff;
        }
    }

    return best;
}

AvatarDirection это контейнер набор графики (например анимация: стоять, бежать, атаковать) и др. настройки. Так же в нём задаём угол (про котором нужно выбирать этот набор).
Далее делаем из UnitController машину состояний и скармливаем ему выбранный AvatarDirection. Например, если юнит находится в состоянии бега, то в зависимости от угла мы видим тот или иной набор анимации бега.
Также можно поправить билдборд, но это уже зависит от конкретных задач, как мы хотим поворачивать спрайт на камеру.



Спасибо большое! Будем разбираться... Отпишусь когда будут результаты


Я делаю игры, а вы в них играете! :)
Моя группа по созданию игр - www.vk.com/dzrone

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг