Столкновения единства прыжков - как противник получает урон

Я делаю платформер на Unity с помощью unityscript.

У меня есть родительский объект Player с контроллером персонажа и различными дочерними объектами. У меня есть похожий враг с коробочным коллайдером. Я изо всех сил пытаюсь различить столкновение, которое происходит, когда игрок идет на врага, и когда игрок прыгает и сталкивается с ним сверху.

Я пробовал пометить дочерние объекты, но у них нет коллайдеров. Если я добавлю коллайдеры к дочерним объектам, это испортит движения моего персонажа. Еще попробовал проверить позицию игрока:

if(col.transform.position.y >= transform.position.y){ killThyself(); }

Но это тоже не работает - добавить высоту врага? Если да, то как мне это сделать?

Любые предложения были приняты.


person Atkobeau    schedule 24.05.2013    source источник
comment
Я предлагаю вам добавить код к вопросу, иначе выполнение этой работы зависит от того, насколько высоки ваши враги; ).   -  person Teemu    schedule 24.05.2013
comment
Предполагая, что вы используете OnCollisionEnter, вы можете использовать переменную normal в каждом ContactPoint, чтобы увидеть, указывает ли она вверх (и, следовательно, вы попадаете в верхнюю часть поля столкновения)   -  person benui    schedule 24.05.2013


Ответы (2)


Мммм, я бы использовал логическую переменную. Сделайте это истинным, когда вы нажимаете кнопку прыжка, и ложным, когда прыжок закончился (когда игрок касается пола). Объявите логическое значение как общедоступную переменную. После этого в методе OnCollision проверьте значение переменной. Я рекомендую вам прочитать это, чтобы понять, как это сделать:

http://docs.unity3d.com/Documentation/ScriptReference/index.Accessing_Other_Game_Objects.html

Что ж, в вашем случае я бы назначил "otherScript" (сценарий игрока), выполняющий это в сценарии управления противником:

var player : GameObject;
var playerScript: PlayerScript; 
//I'm assuming "PlayerScript" is the name of the control script of your player, 
//where you defined the "jump" variable.

    function Start()
    {

    player = GameObject.FindGameObjectWithTag("Player");
    //You also can use GameObject.Find("PlayerName")
    playerScript = player.GetComponent(PlayerScript);
    //Get the script from the player

    }

    function OnCollisionEnter(col : Collision)
    {

    if (playerScript.jump == true)
    {
       killThyself();
    }

    }

Я нахожу игрока по функции Start, чтобы найти его только ОДИН РАЗ, в уровне загрузки. Теперь я назначаю сценарий игрока переменной, поэтому, когда игрок ударит врага, этот враг будет проверять, прыгает ли игрок, используя свой сценарий. Не забудьте объявить эту переменную как общедоступную, иначе это не сработает. Прокомментируйте, если у вас возникли проблемы с использованием этого метода =)

person VictorSeven    schedule 24.05.2013

Я бы использовал второй коллайдер в верхней части врага, назовем его headCollider. Установите isTrigger = true и, возможно, воспользуйтесь специальным физическим материалом. Если этот headCollider срабатывает первым, вы знаете, что персонаж игрока прыгает на врага или падает на него сверху.

В OnTriggerEnter (Collider other) вы можете подготовить некоторые переменные состояния (и, возможно, таймер для сброса состояния). Также текущий статус прыжка, как в предложенном ответе V_Programmer, должен быть полезен для оценки.

Поскольку Unity не позволяет вам прикреплять 2 коллайдера одного и того же типа, вы должны использовать прямоугольник и сферу или создать пустой дочерний элемент и использовать его.

person Kay    schedule 24.05.2013