【问题标题】:Max array range limit最大数组范围限制
【发布时间】:2016-08-15 05:14:28
【问题描述】:

我正在编写一个玩家有 3 颗心的 2D 游戏的代码。

如果玩家与炸弹预制件发生碰撞,他会失去 1 颗心。如果玩家与 heartPrefab 碰撞,他会赢得额外的心。如果他连续 3 次与炸弹预制件发生碰撞,则游戏结束。

Hearts 纹理如下。阵列 0(3 颗心)阵列 1(2 颗心)阵列 2(1 颗心)。

我遇到了限制数组的问题!我想知道如何得到以下响应:如果玩家有 3 颗心并与一个 heartPrefab 碰撞,则只有对象被破坏,玩家拥有的心数没有变化。

下面的代码可以获取和给予额外的爱心。但是当我与一个 heartPrefab 发生碰撞,并且我已经有 3 个心(最大)时,我得到了错误:索引超出范围数组。

我应该如何进行?如果可能,C# 回答

using UnityEngine;
using System.Collections;
using UnityEngine;
using System.Collections;

public class Heart : MonoBehaviour
{


    public Texture2D[] initialHeart;
    private int heart;
    private int manyHeart;

    void Start ()
    {

        // The game start with 3 hearts at RANGE 0
        GetComponent<GUITexture> ().texture = initialHeart [0];
        heart = initialHeart.Length;

    }


    void Update ()
    {

    }

    public bool TakeHearts ()
    {
        if (heart < 0) {

            return false;

        }

        if (manyHeart < (heart - 1)) {

            manyHeart += 1;
            GetComponent<GUITexture> ().texture = initialHeart [manyHeart];
            return true;


        } else {

            return false;

        }   
    }

    public bool AddHearts ()
    {
        if (heart <= 2) {

            return false;

        }

        if (manyHeart < (heart + 1)) {

            manyHeart -= 1;
            GetComponent<GUITexture> ().texture = initialHeart [manyHeart];
            return true;


        } else {

            return false;

        }   
    }
}

【问题讨论】:

  • 我们能看到初始化initialHeart的代码吗?
  • @Quantic 我在 Unity 中创建了 GameObject(重命名为 Hearts),添加了 GuiTexture 和 Heart Script,我可以通过检查器设置数组 =]
  • if (manyHeart &lt; (heart + 1)) 应该是if (manyHeart &gt; 0) 我认为。
  • @GunnarB。不起作用,当玩家与 heartPrefab 碰撞时,什么也没有发生(不输,不赢)。但是 ty =]
  • 它必须与此有关,因为当前您的代码可能会遇到负索引,当您尝试调用 initialHeart[-1] 时会产生错误。见 MatthewS 的回答。

标签: c# arrays unity3d unityscript unity3d-2dtools


【解决方案1】:

您使 if 语句过于复杂(除非有其他原因)... var manyHeart 和 heart 总是成反比的。只需使用:

public bool AddHearts ()
{
    if (manyHeart > 0) {
        manyHeart -= 1;
        GetComponent<GUITexture> ().texture = initialHeart [manyHeart];
        return true;
    } else {
        return false;
    }   
}

【讨论】:

  • 非常感谢!但是现在,如果玩家有 3 颗心,我如何摧毁 heartPrefab?
  • 你可能在某个地方有你的OnColliderEnter 函数(或类似函数),它为玩家遇到的实例化心脏调用销毁并调用AddHearts。如果是这样,那实际上应该可以正常工作,因为摧毁该 GO 并为玩家添加红心是两个单独的任务。如果不是,您将必须提供实际调用Add/TakeHearts 的代码。
  • @GunnarB.yes 我有:void OnCollisionEnter2D (Collision2D colisor) { if (colisor.gameObject.tag == "Bee") { Som (); heart= GameObject.FindGameObjectWithTag ("Heart").GetComponent&lt;Heart&gt; () as Heart; if (vida.AddHearts ()) Destroy (gameObject); } if (colisor.gameObject.tag == "floor") { Destroy (gameObject, 1.5f); } } 但是,如果玩家有 3 颗心的 heartprefab 不要破坏,为什么?
  • 因为你有if (vida.AddHearts ()) Destroy (gameObject); 。您可能只是将它们作为两个单独的调用:vida.AddHearts(); Destroy(gameObject);AddHeartsTakeHearts 都不需要返回类型,它们可能只是 void,至少对于这个而言。
  • 看起来你在说: if (vida.AddHearts()) { Destroy (gameObject)};但是如果他们有 3 颗心,AddHearts 会返回 false,对吗?因此,它不会破坏。我理解正确吗?
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多