Бозингар, тебе точно надо знать угол? Если управление через Input.GetAxis(), то легко определить одно из 8 направлений.
Если всё-таки надо угол, то можно вычислить с помощь Atan2:
Код
float a = Mathf.Atan2(velocity.z, velocity.x) * Mathf.Rad2Deg; // Преобразуем в положительный угол if (a < 0f) a += 360f; // По часовой стрелки a = 360f - a; // Поворачиваем на 180 a = Mathf.Repeat(a + 180f, 360f);
Где velocity скорость объекта (является также направлением) и предполагается, что угол на плоскости XZ, а 0 градусов это вектор Vector3.left. Замечу, что последние два действия не обязательны, так как это только для отсчёта как у тебя на картинке. Другой вариант вычисления через Vector3.Angle, там возвращается всегда положительный минимальный угол, следовательно тоже надо делать проверки для получения угла больше 180.
Скорость (velocity) можно получить сохраняя предыдующую позицию:
Код
using UnityEngine;
public class MyScript : MonoBehaviour { Vector3 prevPosition;
void Update() { Vector3 velocity = (transform.position - prevPosition) / Time.deltaTime; prevPosition = transform.position; // Возвращает для 0-180: [0, 180], для 180-360: [-180, 0] float a = Mathf.Atan2(velocity.z, velocity.x) * Mathf.Rad2Deg; // Преобразуем в положительный угол if (a < 0f) a += 360f; // По часовой стрелки a = 360f - a; // Поворачиваем на 180 a = Mathf.Repeat(a + 180f, 360f);
print(a + " " + velocity); } }
Деление на Time.deltaTime необязательно, тогда это будет просто направление движения. Ещё у Rigidbody есть свойство velocity, но оно изменяется только при движении с помощью физических сил.
Чтобы узнать направление, как константу (от 0 до 7), смещаем угол на 360f/8f/2f == 22.5f, делим на 360f/8f == 45f и округляем вниз:
Код
int index = (int)(Mathf.Repeat(a + 22.5f, 360f) / 45f);
Где a - наш угол. Для 10 градусов будет индекс 0, для 40 - 1, для 92 - 2 и так далее.
Atrek, напиши, что ответит, но вряд ли он будет палиться, хотя вряд ли в правилах Google Play это запрещено. Мотив: возможно рассчитывает, что больше людей скачает, названия ведь немного разные.
* Интерфейс нарисован плохо (кнопки назад, пауза, B и счётчик денег), градиенты с плохо подобранными цветами. Это относится и к графике, где похожие градиенты. Посмотрите как выглядит интерфейс у успешных стим-панк игр. Другая графика выглядит вполне нормально. * Геймплей однобокий: летишь выше и тыкаешь в других якорем или копьями. Для казуалки может сойдёт, но по мне стоило бы это как-то компенсировать.
После декомпиляции получаем только исходный код без каких либо текстур и прочего
Не знаю как с apk, у проектов Unity для винды текстуры выдираются.
Думаю это один и тот же разработчик, просто на разных аккаунтах, судя по качеству игр это возможно. Названия аккаунтов разработчиков похожи и шрифты на скриншотах, что намекает.
* Управление неудобное, лучше добавить управление мышью. * Местность скучная, стоит закрыть чёрную часть экрана тоже какой-нибудь местностью. * Баг: например, покупал HEAL, после использования, хотя написано Empty Inventory, внизу отображается информация о HEAL. Тоже самое с другими предметами.
На объекте есть коллайдер? Если да, то добавь rigidbody и поставь isKinematic = true. Это на всякий случай, но проблему не должно решить. Объект дёргается, когда игрок двигается от первого лица? UPD: Сейчас заметил, что говорится про 2D, тогда вопрос, камера движется?
Добавлено (09 июня 2016, 21:37) --------------------------------------------- Проверил, в общем, такого в билде нет, скорее всего связано с тем, что запускается в режиме отладки. Сделай Build и проверь.
Сообщение отредактировал Lertmind - Четверг, 09 Июня 2016, 21:37
Если ты имеешь в виду во время выполнения игры, то это невозможно, Animator Controller это asset. Если в редакторе, то вот класс BlendTree, а собирать аниматор с помощью AnimatorController.
Сообщение отредактировал Lertmind - Среда, 08 Июня 2016, 23:59
dreenline, точно, забыл что все расширения надо в статических классах определять. Создай ещё файл и туда добавь класс, например static class MyExtensions, в него перенеси, кажется так:
Код
using System; using System.Collections.Generic;
static class MyExtensions { private static System.Random rng = new System.Random();
public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } } }
OneKey, услышал рекламу игры Byte 2. Сначала поставил Byte первый, там конечно ужасный интерфейс, прогресс виден, после установки Byte 2. Косяки всё равно есть: * Кнопка для выхода в главное меню из паузы выглядит странно, как ускорение. * В меню паузы элементы интерфейса (сердце, стрелка, диалог) почему-то видны чётко, хотя это часть геймплея. * Сердце и стрелка с текстом плохо читаются, стоит добавить фон или рамки. * Читать текст из диалога неудобно, две строки и большой шрифт. * Настройки графики поставил минимальные, но всё ещё вижу ужасное мыло (bloom + blur) по экрану, стоило сделать отключение. * В главном меню при нажатии на Играть, список уровней прокручен вниз, приходится подниматься вверх, чтобы выбрать первый. * Если нажать в начале уровня кнопку Skip и чуть двинуться, то текст появиться, но пропустить его уже нельзя: кнопка исчезла. Кроме того, после первого пропуска, дальше по уровню кнопка не появляется.
Добавлено (08 июня 2016, 23:11) --------------------------------------------- * Ещё одно замечание: пока мотал видео урока, услышал произношение CG как эсджи. Думаю, догадался как правильно.
Banvok, видео не сильно отличается от гифки. Загрузка всё ещё недоступна по ссылке: http://banvok.xyz/source/quick-penguin/linux.tar.gz, пишет 404. Нафиг этот Linux, надо сразу сначала для Windows выкладывать.
Первая ошибка кажется из-за Random, там использует из System. Попробуй заменить Random на System.Random:
Код
private static System.Random rng = new System.Random();
public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } }
Добавлено (08 июня 2016, 22:22) --------------------------------------------- Заметь, что мой код не учитывает твою переменную, где сохраняется, что персонаж уже был. Потому что, тебе возможно она нужна в другом коде.
Сообщение отредактировал Lertmind - Среда, 08 Июня 2016, 22:22
Добавлено (08 июня 2016, 21:26) --------------------------------------------- Тогда смотри ссылку выше, что дал. После "фильтрации" используешь функцию из документации и отмечаешь тех, которые были.
Добавлено (08 июня 2016, 21:28) --------------------------------------------- Ещё вместо специальной переменной, можно просто из списка characters удалять персонажей, которые были, тогда не придётся фильтровать каждый раз.
Добавлено (08 июня 2016, 21:32) --------------------------------------------- На самом деле, можно просто один раз перемешать с помощью Shuffle в Awake() массив characters и без фильтра брать первые 3 элемента и удалять их (лучше characters сделать списком).
Добавлено (08 июня 2016, 21:42) --------------------------------------------- Как-то так:
Код
using UnityEngine; using System.Collections; using UnityStandardAssets.Characters.FirstPerson; using System.Collections.Generic;
public class LevelManagerScript : MonoBehaviour {
public UnityStandardAssets.Characters.FirstPerson.FirstPersonController controller; private Books playerReadings; private RayCastScript rayCast; public GameObject openBook; private OpenBook openBooks; private List<CharactersDie> characters; public GameObject deathBookCamera; public GameObject characterControll; public float loadDelay;
public void characterFilter() { int count = Mathf.Min(3, characters.Count); for (int i = 0; i < count; i++) { Instantiate(characters[i]); } characters.RemoveRange(0, count); }
public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } }
Shuffle надо перенести в отдельный класс хелперов, рандом заменить можно на тот, что у Unity. Код не компилировал.
Добавлено (08 июня 2016, 22:01) ---------------------------------------------
Цитатаdreenline ()
и на нем спустя n секунд появляются персонажи из списка, в количестве 3х штук. На каждого из персонажей можно нажать, и тогда появится его биография. После этого, можно убить одного из персонажей. Тогда все 3 удаляются и создаются 3 новых персонажа. Но не создаются те, которые уже были на столе.
Сейчас увидел дополнение. Проблем нет, можно поступить разными путями. Один из них, как ты фильтровал, а потом вместо твоего нерабочего кода делаешь "Выбор элементов из набора без повторений" и отмечаешь, которые были. Это я уже писал, только другими словами.
Сообщение отредактировал Lertmind - Среда, 08 Июня 2016, 22:03
* Не понял, что ты хочешь сделать. Что значит "рандомных неповторяющихся"? Объясни "что" тебе надо, а не "как". * Конечно это не работает:
Код
int prefabIndex = UnityEngine.Random.Range (0, C); // это не работает
нужно передавать два числа. * Возможно ты хочешь перемешать список FilteredData, чтобы потом создать в случайной последовательности? Реализация Shuffle здесь http://stackoverflow.com/questions/273313/randomize-a-listt. Только всё равно не понимаю, какая разница в какой последовательности создавать.