Четверг, 28 Марта 2024, 17:14

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Непонятки с анимацией[Решено]
Непонятки с анимацией[Решено]
МаоДзедунДата: Четверг, 07 Августа 2014, 01:09 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Столкнулся с такой проблемой, моб должен атаковать игрока и должна проигрываться анимация атаки, после того как проигралась анимация атаки моб должен переходить в другую анимацию AttackStand и ждать некоторое время(скорость атаки) и потом заново проигрывать анимацию атаки и обратно переходить в AttackStand.
Но вот в чем прикол. Анимация Attack проигрывается постоянно и не переходит в анимацию AttackStand, хотя урон наносится, как и положено через определенное время

Смотрим метод begiAttack(). Я уже не знаю, что делать, вроде скрипт правильно написан, может свежим взглядом кто то посмотрит и скажет

Код

using UnityEngine;
using System.Collections;

public class EnemyAttack : MonoBehaviour {
      public float Radius;
      public float AttackSpeed;
      public int Damage;

      public AnimationClip Attack;
      public AnimationClip AttackStand;

      [SerializeField]
      bool attack;
      GameObject player;
      Transform localTransform;
      float attackTimer; //вспомогательная переменная
      GeneralPlayer playerGeneral;
      Vector3 targetAngel = new Vector3();

      /// attack
      /// attackStand
      ///   
      ///   

      void Awake()
      {
          localTransform = transform;

          player = GameObject.FindGameObjectWithTag(ManagerTag.PLAYER);

          playerGeneral = GameObject.FindGameObjectWithTag(ManagerTag.PLAYER).GetComponent<GeneralPlayer>();

          Attack.wrapMode = WrapMode.Once;

          //добавляем анимации
            
            
      }

      // Update is called once per frame
      void Update()
      {

          attackCondition();

          //таймер
          if (attackTimer > 0) attackTimer -= Time.deltaTime;
          if (attackTimer < 0) attackTimer = 0;

          begiAttack();

          print(attackTimer);
      }

      void attackCondition()
      {
          if (EnemyAI._CanAttack && !EnemyAI._Died)
          {
              attack = true;
          }
          else
          {
              attack = false;
          }
      }

      /// Атака и условия для нанесения урона
      void begiAttack()
      {
          if (attack && attackTimer == 0)
          {
              //атакуем
              print("атакуем");

              animation.CrossFade(Attack.name, 0.1f);

              targetAngel = player.transform.position - localTransform.position;//

              float direction = Vector3.Angle(targetAngel, localTransform.forward);

              if (direction <= Radius)
              {
                  takeDamage();
                  print("damage angel");
              }

              attackTimer = AttackSpeed;//приравниваем таймер к скорости атаки

              animation.CrossFadeQueued(AttackStand.name, 0.5f);

          }
          else
          {
              //animation.CrossFadeQueued(AttackStand.name, 1f);
          }
      }

      /// нанесение урона
      void takeDamage()
      {
          if (playerGeneral != null)
          {
              playerGeneral.CurHp -= Damage;
          }
          else
          {
              return;
          }
      }

     
}



Знакомая попросила переустановить Windows, взял дистрибутив Ubuntu
Интеллигенция — самая необразованная часть общества.©Мао Дзэдун
Кто не побывал на Великой китайской стене, тот не может считаться китайцем.©Мао Дзэдун


Сообщение отредактировал МаоДзедун - Четверг, 07 Августа 2014, 01:35
allodsДата: Четверг, 07 Августа 2014, 01:14 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
анимация Attack у вас не loop случаем ?
МаоДзедунДата: Четверг, 07 Августа 2014, 01:35 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Цитата allods ()
Attack у вас не loop случаем

в том то и дело, что нет. я даже в скрипте явно указал, что WrapMode.Once

Добавлено (07.08.2014, 01:35)
---------------------------------------------
В общем решил эту проблему через зад )

Код

using UnityEngine;
using System.Collections;

public class EnemyAttack : MonoBehaviour {
     public float Radius;
     public float AttackSpeed;
     public int Damage;

     public AnimationClip Attack;
     public AnimationClip AttackStand;

     [SerializeField]
     bool attack;
     GameObject player;
     Transform localTransform;
     float attackTimer; //вспомогательная переменная
     GeneralPlayer playerGeneral;
     Vector3 targetAngel = new Vector3();

     /// attack
     /// attackStand
     ///  
     ///  

     void Awake()
     {
         localTransform = transform;

         player = GameObject.FindGameObjectWithTag(ManagerTag.PLAYER);

         playerGeneral = GameObject.FindGameObjectWithTag(ManagerTag.PLAYER).GetComponent<GeneralPlayer>();

         Attack.wrapMode = WrapMode.Once;

         //добавляем анимации
          
          
     }

     // Update is called once per frame
     void Update()
     {

         attackCondition();

         //таймер
         if (attackTimer > 0) attackTimer -= Time.deltaTime;
         if (attackTimer < 0) attackTimer = 0;

         begiAttack();

         print(attackTimer);
     }

     void attackCondition()
     {
         if (EnemyAI._CanAttack && !EnemyAI._Died)
         {
             attack = true;
         }
         else
         {
             attack = false;
         }
     }

     /// Атака и условия для нанесения урона
     void begiAttack()
     {
         if (attack && attackTimer == 0)
         {
             //атакуем
             print("атакуем");

             animation.CrossFade(Attack.name);

             if (!IsInvoking("animStand"))
                 Invoke("animStand", Attack.length);

             targetAngel = player.transform.position - localTransform.position;//

             float direction = Vector3.Angle(targetAngel, localTransform.forward);

             if (direction <= Radius)
             {
                 takeDamage();
                 print("damage angel");
             }
            
             attackTimer = AttackSpeed;//приравниваем таймер к скорости атаки

              
         }      
     }

     void animStand()
     {
         animation.CrossFade(AttackStand.name);
     }

     /// нанесение урона
     void takeDamage()
     {
         if (playerGeneral != null)
         {
             playerGeneral.CurHp -= Damage;
         }
         else
         {
             return;
         }
     }

   
}




Знакомая попросила переустановить Windows, взял дистрибутив Ubuntu
Интеллигенция — самая необразованная часть общества.©Мао Дзэдун
Кто не побывал на Великой китайской стене, тот не может считаться китайцем.©Мао Дзэдун
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Непонятки с анимацией[Решено]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг