我正在制作一款基于回合制战斗的游戏。
对于战斗,我在1-3个怪物之间拉动然后放置它们。怪物是游戏对象。
然后我把怪物放在一个列表中,这样我就可以从左到右检查它们的位置。 (左边是索引0,右边是索引2,如果有3个怪物ofc)
我唯一的问题是获取GameObject的索引..
这段代码在我的CombatMainController.cs
上void createMonster(){
float numberOfMobs = Random.Range (1, 4);
print (numberOfMobs);
if (numberOfMobs > 2) {
monsterStartpointX = -4f;
}
else if (numberOfMobs > 1) {
monsterStartpointX = -2f;
}
else {
monsterStartpointX = 0f;
}
for (int i = 0; i < numberOfMobs; i++) {
randomMonster = Random.Range(0, monsters.Count);
GameObject monster = Instantiate(monsters[randomMonster], Vector3.up, Quaternion.identity) as GameObject;
aliveMonsters.Add(monster);
Vector3 temp = monster.transform.position;
temp.x = monsterStartpointX;
temp.y = monsterStartpointY;
monster.transform.position = temp;
monsterStartpointX += 4f;
}
}
public void removeMonster(GameObject gameObject){
print (gameObject);
aliveMonsters.Remove(gameObject);
}
print (gameObject)
返回:Goblin(Clone) (UnityEngine.GameObject)
UnityEngine.MonoBehaviour:print(Object)
- 这是点击的GameObject
。
但aliveMonsters.Remove(gameObject);
未删除GameObject
。
这是附加到怪物的代码
void OnMouseUp(){
OnClickGUI = !OnClickGUI;
//Destroy (gameObject);
}
void OnGUI(){
if (OnClickGUI) {
Vector3 V = Camera.main.WorldToScreenPoint(transform.position);
if (GUI.Button(new Rect(V.x - 50,Screen.height - V.y,100,30),"Attack")){
takenDamage();
}
}
}
void takenDamage(){
combatController.removeMonster (gameObject);
}
我不知道我做错了什么,希望你能帮助我,或者至少让我指向更好的方向。
答案 0 :(得分:2)
在MSDN上,您可以阅读有关List.Remove Method:
的信息如果类型
T
实现IEquatable<T>
通用接口,则相等比较器是该接口的Equals
方法;否则,默认的相等比较器为Object.Equals
。
如果游戏对象既未实现IEquatable<T>
也未覆盖Object.Equals
,则使用引用相等进行比较,如果给定对象确实在列表中,则该引用相等。这是Object.Equals
的默认行为。
我可以想象存在错误的Object.Equals
覆盖或IEquatable<T>
实现会导致Remove方法失败。
另一种可能性是您尝试删除游戏对象的克隆。在那种情况下,引用相等不起作用!您可以通过覆盖Object.Equals
方法并使其比较对象ID来修复它。或者你可以这样删除:
int index = aliveMonsters.FindIndex(m => m.ID == monster.ID);
if (index >= 0 ) {
aliveMonsters.RemoveAt(index);
}
但无论如何,请确保列表确实存在问题,而不仅仅是游戏逻辑。该对象可能会从列表中删除,但不会从游戏中删除。
答案 1 :(得分:1)
你可以这样做:
public void removeMonster(GameObject gameObject){
print (gameObject);
GameObject objToRemove = allMonsters.DefaultIfEmpty(null)
.FirstOrDefault(f=>f.obj.ID=gameObject.ID);
if (objToRemove!=null)
aliveMonsters.Remove(objToRemove);
else
throw new Exception("That monster isn't in the list.")
}