【问题标题】:ArgumentOutOfRangeException: Specified argument was out of the range of valid values. c#ArgumentOutOfRangeException:指定的参数超出了有效值的范围。 C#
【发布时间】:2021-05-25 19:46:42
【问题描述】:

我正在创建游戏,当玩家击中敌人时,血条应该是-1 out of 3。当我点击播放时,游戏正在运行,但是 ArgumentOutOfRangeException: Specified argument is out of the range of valid 的错误价值观。 参数名称:layer2 超出范围。层数必须在 0 到 31 的范围内仍然存在。谁能帮帮我。

代码如下:

public class PlayerControl : MonoBehaviour
{
    public GameObject heart1, heart2, heart3;
    public int playerHealth = 3;
    int playerLayer, enemyLayer;
    bool coroutineAllowed = true;
    Color color;
    Renderer rend;

    // Start is called before the first frame update
    void Start()
    {
        playerLayer = this.gameObject.layer;
        enemyLayer = LayerMask.NameToLayer("Enemy");
        Physics2D.IgnoreLayerCollision(playerLayer, enemyLayer, false);
        heart1 = GameObject.Find("heart1");
        heart2 = GameObject.Find("heart2");
        heart3 = GameObject.Find("heart3");
        heart1.gameObject.SetActive(true);
        heart2.gameObject.SetActive(true);
        heart3.gameObject.SetActive(true);
        rend = GetComponent<Renderer>();
        color = rend.material.color;
    }

    private void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.tag.Equals("Enemy"))
        {
            playerHealth -= 1;
            switch (playerHealth)
            {
                case 2:
                    heart3.gameObject.SetActive(false);
                    if (coroutineAllowed)
                        StartCoroutine("Immortal");
                    break;

                case 1:
                    heart2.gameObject.SetActive(false);
                    if (coroutineAllowed)
                        StartCoroutine("Immortal");
                    break;

                case 0:
                    heart1.gameObject.SetActive(false);
                    if (coroutineAllowed) StartCoroutine("Immortal");
                    break;
            }
        }

        if (playerHealth < 1)
        {
            gameOverText.SetActive(true);
            restartButton.SetActive(true);
            restartBox.SetActive(true);
            Instantiate(blood, transform.position, Quaternion.identity);
            gameObject.SetActive(false);
        }
    }

    IEnumerator Immortal()
    {
        coroutineAllowed = false;
        Physics2D.IgnoreLayerCollision(playerLayer, enemyLayer, true);
        color.a = 0.5f;
        rend.material.color = color;
        yield return new WaitForSeconds(3f);
        Physics2D.IgnoreLayerCollision(playerLayer, enemyLayer, false);
        color.a = 1f;
        rend.material.color = color;
        coroutineAllowed = true;
    }
}

【问题讨论】:

  • 异常发生在哪一行?
  • 嗨,它显示为附件,一切正常。我不知道为什么。 [链接] (linkpicture.com/view.php?img=LPic6080054718f15547900204)
  • 目前我只是修复了 AnimationEvent has no function name specified 的错误。但我仍然得到 ArgumentOutOfRangeException: Specified argument was out of the range of valid values。参数名称:layer2 超出范围。层数必须在 0 到 31 的范围内。
  • 请使用正确的标签。请注意,unityscript 是或更好地曾经是一种 JavaScript 风格,例如使用早期 Unity 版本的自定义语言,并且现在很长已弃用!你的代码看起来像c#。同样,仅仅因为您使用的是某个 IDE (visual studio) 并不意味着您的问题实际上与该 IDE 有关。

标签: c# unity3d


【解决方案1】:

来自LayerMask.NameToLayer

给定图层名称,返回由 Tags and Layers manager 中的内置或用户图层定义的图层索引。

如果没有找到则返回 -1。

听起来您没有配置任何名为Enemy 的层,因此enemyLayer 将具有值-1,这不是Physics2D.IgnoreLayerCollision 的允许参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多