首页 > 解决方案 > 无法在实例化的预制件上启动协程

问题描述

因此,当我单击一个按钮时,我正在我的播放器上的脚本上调用协程(一个实例化的预制件,我在实例化后立即重命名)并且他应该尝试攻击。

代码如下:

  public void AttackMonster()
  {
     StartCoroutine(TryAttack());
  }

  IEnumerator TryAttack()
  {
     var attacker = references.GetComponent<References>()
       .selectedPlayer.GetComponent<CharacterTemplate>();
     var enemyName = EventSystem.current.currentSelectedGameObject
       .GetComponentInChildren<Text>().text;
     var enemy = GameObject.Find(enemyName);
     var speed = attacker.speed;
     var accuracy = attacker.accuracy;
     var strength = attacker.strength;
     var enemyDefense = enemy.GetComponent<EnemyInfo>().defense;

     for (int i = 0; i < speed; i++) 
     {           
        yield return new WaitForSeconds(1);
        var accuracyTry = Random.Range(1, 11); 
        if (accuracyTry >= accuracy)
        {
           FloatingMessage("Hit");
          if (Hit(strength, enemyDefense))
          {
             Debug.Log("Wound");
          } 
          else 
          {
             Debug.Log("No wound");
          }
     } 
     else 
     {
        FloatingMessage("Miss");
     }
 }

我得到了错误:

无法启动协程,因为游戏对象“Player_prefab”处于非活动状态!

我做了一些 Debug.Break 来测试实例化的播放器是否处于非活动状态,但事实并非如此。似乎按钮 onClick() 正在从预制件中调用此函数,而不是实例或其他东西。

有任何想法吗?

标签: unity3d

解决方案


我想出了答案!这要感谢你们的问题,谢谢。:) 问题确实出在我的 onClick 上。我是通过检查器设置它的,所以它是从预制件而不是实例中调用的。

我所要做的就是在脚本中分配它并实际引用实例而不是预制件。十分简单。

enemyButton1.GetComponent<Button>().onClick.AddListener(selectedPlayer.GetComponent<PlayerAttack>().AttackMonster);

推荐阅读