C# 最大阵列范围限制
我正在为一个2D游戏编写代码,玩家有3颗心 如果玩家与炸弹碰撞,他将失去1颗心脏。如果玩家与心脏预制件碰撞,他将赢得额外的心脏。如果他连续3次与炸弹碰撞,游戏结束 心脏纹理如下所示。阵列0(3颗心)阵列1(2颗心)阵列2(1颗心) 我在限制阵列时遇到问题!我想知道如何得到以下反应:如果玩家有3颗心脏,并且与一个心脏预制体碰撞,只有物体被破坏,玩家的心脏数量没有变化 下面的代码用于获取和提供额外的红心。但是当我与一个HeartPrefact冲突时,我已经有了3个hearts(最多),我得到了一个错误:索引超出了数组的范围 我应该如何进行?如果可能的话,回答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(最多),我得到了一个错
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,对吗?因此,它不会破坏。我理解正确吗?