Делаем Тунца - два!
Ну что же, после некоторого перерыва - продолжаем.
Начало здесь: http://pikabu.ru/story/delaem_tuntsa__raz_4489410
Мы остановились на том, что у нас есть тюлень и есть море. А сегодня будем делать так, чтобы тюлень по этому морю не просто плыл, но мог и нырять.
Для удобства я создал пустой объект и собрал в него все элементы моря. А теперь создаем в этом нашем общем море еще один элемент - тоже пустой объект и в нем добавляем один очень интересный компонент:
И еще один компонент:
Теперь настраиваем в Buoyancy Effector параметр Surface Level так, чтобы поверхность воды примерно совпадало с нижней линией волн. А в Box Collider 2D настраиваем его размеры так, чтобы всё море до дна было "водой", которая будет выталкивать нашего тюленя к своей поверхности.
Однако, пришло время добавить кое-что и к нашему персонажу, чтобы вода его действительно выталкивала и чтобы он покачивался на волнах:
После добавления компонента Rigidbody2D добавляем еще один - Circle Collider 2D:
И настраиваем размер коллайдера:
Теперь пришло время добавить нашему тюленю управление. Покуда мы работаем только с компьютером и пока еще не собираемся устанавливать игру на телефон, обойдемся управлением клавиатурой, тачскрин будем добавлять позже. Добавим нашему тюленю новый скрипт:
И вот что будет в том скрипте:
Настройки Buoyancy Effector, массу тюленя в его Rigidbody2D, а так же нижнюю и верхнюю границу для ныряния в скрипте, в методе FixedUpdate() попробуйте менять, чтобы получить наиболее (на ваш взгляд) реалистичное движение персонажа. На сегодня всё, в следующий раз будем делать первых врагов и пищу тюленя.
Напоминаю, что установить готовую игру, чтобы увидеть результат можно здесь для Андроида: https://play.google.com/store/apps/details?id=com.FRN.tuna
и здесь для Windows Phone: https://www.microsoft.com/ru-ru/store/p/tuna/9nblggh4td3k
Реклама ?
Зачем IsJump имеет доступ public? Если вы хотите что бы другие классы могли знать о значение перемененной? Но думаю другие части кода не будут заставлять "подпрыгнуть" лучше создать поле:
public bool IsJump { get; private set; }
Потом почему ввод игрока и сам прыжок в разных функциях? Вы в курсе, что FixUpdate() и Update() вызываются независимо друг, от друга и при высоких фпс FixUpdate() может вызваться один раз на несколько кадров, а при низких фпс несколько раз за один кадр, а Update() один раз за кадр из-за этого при разных фпс игра может себя вести по разному.
И зачем столько памяти жрать?
Так же зачем проверять находится ли он в прыжке, таким странным способом. Лучше IsJump блокировала рекцию на нажития пробела.
Foo()
{
if(Input.GetKeyDowm(KeyCode.Space) & !IsJump)
{
IsJump = true;
Jump()
}
}
И где-то отслеживать, когда прыжок пройдет и поставить IsJump = fallse;
Хотя в данной ситуации это как из пушки по воробьям.