C# 最大阵列范围限制

C# 最大阵列范围限制,c#,arrays,unity3d,unityscript,unity3d-2dtools,C#,Arrays,Unity3d,Unityscript,Unity3d 2dtools,我正在为一个2D游戏编写代码,玩家有3颗心 如果玩家与炸弹碰撞,他将失去1颗心脏。如果玩家与心脏预制件碰撞,他将赢得额外的心脏。如果他连续3次与炸弹碰撞,游戏结束 心脏纹理如下所示。阵列0(3颗心)阵列1(2颗心)阵列2(1颗心) 我在限制阵列时遇到问题!我想知道如何得到以下反应:如果玩家有3颗心脏,并且与一个心脏预制体碰撞,只有物体被破坏,玩家的心脏数量没有变化 下面的代码用于获取和提供额外的红心。但是当我与一个HeartPrefact冲突时,我已经有了3个hearts(最多),我得到了一个错

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

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

心脏纹理如下所示。阵列0(3颗心)阵列1(2颗心)阵列2(1颗心)

我在限制阵列时遇到问题!我想知道如何得到以下反应:如果玩家有3颗心脏,并且与一个心脏预制体碰撞,只有物体被破坏,玩家的心脏数量没有变化

下面的代码用于获取和提供额外的红心。但是当我与一个HeartPrefact冲突时,我已经有了3个hearts(最多),我得到了一个错误:索引超出了数组的范围

我应该如何进行?如果可能的话,回答

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;

        }   
    }
}
使用UnityEngine;
使用系统集合;
使用UnityEngine;
使用系统集合;
公共类心脏:单一行为
{
公共结构2d[]心脏;
私心;
私人私人住宅;
无效开始()
{
//游戏在0范围内以3颗红心开始
GetComponent().texture=initialHeart[0];
心脏=初始心脏。长度;
}
无效更新()
{
}
公共图书馆
{
如果(心脏<0){
返回false;
}
如果(多心脏<(心脏-1)){
多心+=1;
GetComponent().texture=initialHeart[manyHeart];
返回true;
}否则{
返回false;
}   
}
公共图书馆
{

if(heart您将if语句过度复杂化(除非有其他原因)…var manyHeart和heart始终是负相关的。只需使用:

public bool AddHearts ()
{
    if (manyHeart > 0) {
        manyHeart -= 1;
        GetComponent<GUITexture> ().texture = initialHeart [manyHeart];
        return true;
    } else {
        return false;
    }   
}
public bool AddHearts()
{
如果(多心脏>0){
多心-=1;
GetComponent().texture=initialHeart[manyHeart];
返回true;
}否则{
返回false;
}   
}

我们可以看到初始化
initialHeart
的代码吗?@Quantic我已经在Unity内部创建了GameObject(重命名为Hearts),添加了GuitTexture和Heart脚本,我可以通过inspector=]
if(manyHeart
设置数组,如果(manyHeart>0)
我认为。@GunnarB.不起作用,当玩家colide使用HeartPrefact时,什么都不会发生(没有输,就没有赢)。但是ty=]一定是这样的,因为当前您的代码可能会遇到负索引,当您尝试调用
initialHeart[-1]时会产生错误
。见马修斯的答案。非常感谢!但是现在,如果玩家有3颗心脏,我怎么能摧毁HeartPrefact?你可能有你的
OnColliderEnter
功能(或类似功能)为玩家遇到的实例化心脏调用销毁并同时调用
AddHearts
。如果是这样的话,应该可以正常工作,因为销毁GO和向玩家添加心脏是两个独立的任务。如果不是,你必须提供实际调用
Add/TakeHearts
@GunnarB的代码。是的,我有e:
void onCollisionInter2d(Collision2D colisor){if(colisor.gameObject.tag==“Bee”){Som();heart=gameObject.FindGameObjectWithTag(“heart”).GetComponent()作为心脏;if(vida.AddHearts())Destroy(gameObject);}if(colisor.gameObject.tag==“floor”){Destroy(gameObject,1.5f);}
但是,如果玩家有3个heart Hearts Prefact,为什么不销毁?因为你有
if(vida.AddHearts())销毁(gameObject);
。你可能只是把它们作为两个独立的调用:
vida.AddHearts();销毁(gameObject)
AddHearts
TakeHearts
都不需要返回类型,它们可以是
void
,至少是这样。看起来你是在说:if(vida.AddHearts()){Destroy(gameObject)};但是如果他们有3颗心,AddHearts返回false,对吗?因此,它不会破坏。我理解正确吗?