2

В одном классе при конкретном действии проигрывается анимация атаки, а в другом классе проверяется столкновение 2-х коллайдеров. Когда они столкнулись, то у противника минусую жизнь. Проблема в том, что даже если не атаковал, а только столкнулся, то всё равно минусуется жизнь.

Как передать статус анимаций в другой класс, чтобы только при атаке работало?

Void
  • 75
  • Что за игра такая? файтинг? 2D или 3D? можно скрин? – Алексей Шиманский Mar 22 '17 at 16:48
  • Сделать в классе ссылку на противника. Когда они столкнулись записывать противника, а когда разошлись обнулять. Ну и отнимать жизнь через некое время – Valera Kvip Mar 22 '17 at 16:55
  • 1
    @ValeraKvip я подозреваю товарищ не может отличить когда они столкнулись, а когда просто сошлись. (причем я не уверен что там они сталкиваются вообще). Отсюда, вроде, и вопрос. ...и отсюда мой вопрошающий-уточняющий коммент тоже)) – Алексей Шиманский Mar 22 '17 at 16:57
  • Игра 3д, про космос персонаж на луне – Void Mar 23 '17 at 09:17
  • А тогда причём тут атака и столкновения? ведь сталкиваются корабли, а атакуют лазером или пулями и т.д. – Алексей Шиманский Mar 23 '17 at 12:19
  • Атака бывает 2 видов Range и Mele. В моей игре Mele, персонаж должен ударить противника что бы отнять жизнь Но! есть я не нажимаю кнопку атаки а убегаю и задеваю противника то ему всё равно отнимает жизнь потому что противник вошёл в триггер. Мне нужно проверить если была проиграна анимация атаки и противник вошёл в триггер то только в этом случае отнять жизнь, как мне проверить если была проиграна анимация ? и как мне передать статус анимаций в другой класс – Void Mar 23 '17 at 13:37

1 Answers1

1

Самое простое: при любом виде ближней атаки заноси значение в переменную, например isMeleeAttack, после окончания атаки - снимай значение.

Собственно, при вхождении в триггер проверяй значение этой переменной — если не null, значит сейчас идет атака, а значит надо произвести вычет жизней.

Саму анимацию можно разными путями отслеживать... Например если это Mecanim, то

if (this.animator.GetCurrentAnimatorStateInfo(0).IsName("YourAnimationName"))
{
    // значит происходит удар....
}

Проверить на вхождение хотя бы одной играющей анимации придется в цикле....


Если же анимация через Animation, то проверить можно через Animation.isPlaying

  • Пожалуйста скажите как передать значение анимаций в другой класс – Void Mar 23 '17 at 16:46
  • 1
    @Abs3akt так в событии уже всё будет. void OnTriggerEnter(Collider other) вот в этом other.gameObject лежит как раз тот самый объект, который вошёл в триггер, тобишь тот, кто ударил. То есть other.gameObject.isMeleeAttack и будет – Алексей Шиманский Mar 23 '17 at 16:58
  • @Abs3akt вообще зачем вам значение анимации в другом классе и какие именно значения хотите получить? – Алексей Шиманский Mar 23 '17 at 17:06
  • Смотрите есть триггер на player (GTAttack), есть противник Zombi когда я бегу от зомби,Врезался в него Но не атакую его Триггер всё равно срабатывает! Метод для урона наносяшего Player-ом находится в файле Zombi поэтому мне нужно при входе Playera в триггер проверить сработала ли анимация атаки Playera. просмотрите пожалуйста последний мой коментарий чуть выше который спрятан я там обьяснял. P.S прошу прошение за мою орфографию ( самоучка русского языка) – Void Mar 23 '17 at 17:43
  • кто то говорил про делегаты что они используются для передачи из одного класса в другой, но я не знаю точно Но всё равно вам большое спасибо за помошь – Void Mar 23 '17 at 17:47
  • 1
    @Abs3akt Так я написал в ответе что нужно делать. В самом классе Player следишь за анимацией и выставляешь флаг, что играет анимация атаки или нет.... А при входе в триггер проверяешь этот флаг......то есть зомби будет считывать только его....об анимации ему знать не обязательно – Алексей Шиманский Mar 23 '17 at 17:48
  • 1
    @Abs3akt делегаты..может быть...вообще есть GetComponent (чтоб найти компонент и взять у него что-то), есть SendMessage И BroadcastMessage для посылки сообщений, есть Events (ивенты активно используются)..... можешь что-то попробовать почерпнуть из книг – Алексей Шиманский Mar 23 '17 at 17:53
  • Огромное спасибо за сылку на книги! вопрос решил Большое спасибо! Вот как решил вопрос. public Animator PlayerAnimator; private float timerDamageGoat = 0.5f; private bool isAttackEnable = true;

    void OnTriggerStay (Collider target) { if (target.tag == "GTdamage") { if (isAttackEnable && goatAnimator.GetCurrentAnimatorStateInfo (0).IsName("flyAttack")) { isAttackEnable = false; Goatdamage = Random.Range (15, 18); hpStatusZom = hpStatusZom - Goatdamage; if (hpStatusZom <= 0) { deadZombie (); zombieIsReload = true; }} } }

    – Void Mar 23 '17 at 18:00
  • 1
    @Abs3akt как я описал в ответе: т.к. анимаций атак может много, то скорее желательно сделать функцию (например bool IsAnimationPlaying), в которой в цикле проверятся все эти анимации. и чтоб каждый раз не писать большие конструкции......................P.S. есть у меня большой список книг, но я стремаюсь пока в тот раздел их выкладывать....не проверены – Алексей Шиманский Mar 23 '17 at 18:10