Люди, подскажите, пожалуйста, как реализовать отнятие жизней у главного героя при падении с большой высоты, например: бежал, прыгнул с горы, упал, умер. Или так: спрыгнул с крыши, отнялось такое-то количество жизней. Пытался найти где-нибудь ответ, но нигде на подобные темы не натыкался.
Можно проверять, коллизии FPC с объектами. Если нет коллизий с ландшафтом и нет коллизий с какими либо объектами, т.е. Collider висит в воздухе - то начинать отсчет координат. (Но тут возможен баг, т.к. Collider игрока может зацепиться за какой-либо объект который находится сбоку а не под ногами. Т.е. появится коллизия с объектом, допустим, при падении с крыши здания и касании-рикошете от какой-то стены. Чтобы такого небыло, можно расположить в самом низу FPC Collider так, чтобы не выступал за габариты FPC по бокам и сверху, а только снизу. Тогда будет возможность столкновения этого Collider только с объектами которые расположены под FPC). Занести в переменную координату высоты и проверять коллизии. При появлении коллизии с окружающим миром, занести новое значение оси координат в другую переменную и сравнить результат, насколько изменились координаты. Если координаты по вертикальной оси изменились больше чем на 2м - отнять хитпоинты в зависимости от величины значения. Можно пропорционально высоте отнимать хитпоинты. В диапазоне от 3м до 12м распределить хитпоинты так, что-бы при падении с 3м отнималосьь ~10% а при падении с 10..12м все 100%. Т.е. по 10% на метр высоты, выше допустимой. Поиск | Правила | Новые сообщения
Левша, мне тоже такая идея в голову пришла, точнее замерять разницу, между скоростью свободного падения и скоростью свободного падения за секунду до первой. Когда игрок приземляется, то она обнуляется и разница резко возрастает. Может что нить получится. Блог.
Вертикальную, отрицательную скорость (когда вниз летит).
А почему бы не отнимать здоровье, когда игрок разгоняется и сталкивается со стеной. Я пока таких шутеров невидел. Но ведь в реальности же ... Попробуйте так сделать...
Хотя можно даже не отнимать здоровье, а просдо делать эффект (ай, больно).
Добавлено (28.05.2012, 23:09) --------------------------------------------- Кстати, в кооперативном режиме portal 2, когда робот приземляется с любой высоты, то ничего не происходить, но если робот сталкивается со стеной или потолком - его бъёт током и очень весело скрючивает.
Значит необходимо расчитать вертикальную скорость, а затем умножать её на урон от падения.
Да, с расстоянием падения скорость будет нарастать, отсюда: текущая скорость = гравитация + ускорение (каждый кадр). После столкновения: урон = текущая скорость - гравитация. (применяем урон). текущая скорость = гравитация. (обнуляем ускорение). X.cor.R (Prologue)
В общем возникла проблема во время написания скрипта.
Code
var health = 100; var damage = 10;
function FixedUpdate () { health = 100 - (damage * rigidbody.velocity); }
Unity не хочет приравнивать velocity к int и float. И даже если оставить переменную helath пустой. То он всё-равно отказывается отнимать от ста произведение урона на скорость.
Добавлено (31.05.2012, 16:55) --------------------------------------------- Или возможно я указал не тот velocity?
На сколько я помню, velocity - это переменная Vector3 (хранит значения скорости по 3 осям). Использовать её можно так: velosity.x , velosity.y , velosity.z - эти переменные float.
Добавлено (31.05.2012, 19:15) --------------------------------------------- Буду краток: Открываем CharacterMotor (Standard Assets/Character Controllers/Sources/Scripts/CharacterMotor) и пишем:
Code
static var speed : Vector3; //Переменная "шпион", которая будет принимать значения скорости. function Update () { speed = velocity; //Присваиваем нашему шпиону значение скорости. }
Далее открываем скрипт, висящий на игроке и хранящий в себе значение здоровья:
Code
var health = 100; // Это здоровье var speed1 = 0.0; var speed2 = 0.0; var speedA = true;
function Update () { if (speedA == true) { Speed (); } // Включение функции определения удара if (speed2 > 20) { health -= 100; } else { //Смертельное падение if (speed2 > 15) { health -= 50; } else { //Опасное падение if (speed2 > 10) { health -= 20; } } } // Лёгкое падение }
function Speed () { // Сама функция определения падения speedA = false; // Ставим функцию на паузу speed1 = CharacterMotor.speed.y; // Записываем значение скорости движения по оси Y от нашего шпиона yield WaitForSeconds (0.05); // Ждём 0.05 с speed2 = speed - CharacterMotor.speed.y; //Находим разницу, между настоящей скоростью и скоростью 0.05 секундами ранее speedA = true; //Включаем функцию. Она повторяется. }
Что-то тема зависла, так и не решили вопрос? Я вот думаю в гонках тоже сделать, если упал в пропасть, тоже жизни в ноль... Игры не делают людей злыми. Лаги делают!