【问题标题】:C# (Unity 4.3) Cannot implicitly convert type `ShotScript[]' to `ShotScript'C# (Unity 4.3) 无法将类型“ShotScript[]”隐式转换为“ShotScript”
【发布时间】:2014-01-19 03:00:53
【问题描述】:

谢谢大家!问题是我使用的是 GetComponents 而不是 GetComponent,谢谢!

我对编程很陌生,我正在尝试在 Unity 中制作 2D 游戏。我在网上找到了一个非常好的教程,直到某一点(Tut 可以在这里找到http://pixelnest.io/tutorials/2d-game-unity/shooting-1/)。我遇到了一个错误,不知道为什么。当我尝试在当前脚本中使用另一个脚本时会发生错误(如果这对任何人都有意义的话)。有问题的两个脚本的名称为 ShotScript 和 HealthScript,它们在下面

ShotScript:

using UnityEngine;
using System.Collections;

public class ShotScript : MonoBehaviour {


public int damage = 1;

public bool isEnemyShot = false;

void Start () {

    Destroy (gameObject, 20);
}



}

健康脚本:

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {


public int hp = 2;

public bool isEnemy = true;

void OnTriggerEnter2D(Collider2D Collider) {

        ShotScript shot = collider.gameObject.GetComponents<ShotScript>();
            if (shot != null) {
                    if (shot.isEnemyShot != isEnemy) {
                            hp -= shot.damage;
                            Destroy (shot.gameObject);

                            if (hp <= 0) {
                                    Destroy(gameObject);
                            }
                    }
            }
    }


}

我得到的错误是: "Assets/Scripts/HealthScript.cs(13,36):错误 CS0029:无法隐式转换类型 ShotScript[]' toShotScript'"

我有点卡住了,所以如果有人能指出我正确的方向,那就太好了 =)

P.S 我是新手,所以如果你需要任何额外的信息,我会尽力提供它

【问题讨论】:

  • 这就是它所说的意思。我假设问题出在ShotScript shot = collider.gameObject.GetComponents&lt;ShotScript&gt;();GetComponents 方法是否返回数组?
  • 是的,我应该输入 GetComponent =P

标签: c# unity3d


【解决方案1】:

这就是问题所在:

ShotScript shot = collider.gameObject.GetComponents<ShotScript>();

听起来GetComponents&lt;ShotScript&gt; 正在返回一个包含ShotScript 引用的数组,即它的返回类型是ShotScript

您想对每个ShotScript 执行相同的操作吗?如果是这样,您可能只想使用 foreach 循环......尽管您可能只想检查 hp 最后是否变为负数。我希望您也能够删除对无效性的检查,假设GetComponents 如果没有任何此类组件,则只会返回一个空数组:

ShotScript[] shots = collider.gameObject.GetComponents<ShotScript>();
foreach (ShotScript shot in shots)
{
    if (shot.isEnemyShot != isEnemy)
    {
        hp -= shot.damage;
        Destroy(shot.gameObject);
    }
}
if (hp <= 0)
{
    Destroy(gameObject);
}

(我已将其重新格式化为更传统的 C#,但当然你可以使用任何你想要的缩进。)

【讨论】:

    【解决方案2】:

    您正在调用GetComponents(注意复数形式),它返回一个数组(即ShotScript[]),该数组包含该特定GameObject 上类型的所有匹配组件。

    所以这是试图将 ShotScript[] 数组分配到单个 ShotScript 实例中,这是不可能的。

    如果您只想检索一个 ShotScript(因为您打算在一个对象上只有 1 个),请改用 GetComponent(注意单数)方法,它将只返回一个实例,如果没有则返回 null已分配。

    所以将一行改成这样:

    ShotScript shot = collider.gameObject.GetComponent<ShotScript>();
    

    如果您的意图是在同一个GameObject 上处理多个ShotScript 实例/组件,请使用Jon Skeet's answer 中提供的修复/代码。

    【讨论】:

      【解决方案3】:

      错误信息说第 13 行有错误:

      ShotScript shot = collider.gameObject.GetComponents<ShotScript>();
      

      看起来GetComponents 方法正在返回一个数组ShotScript[],但您试图将其隐式转换为单个ShotScript 实例。试试:

      ShotScript[] shots = collider.gameObject.GetComponents<ShotScript>();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多