List <t>查找GameObject的索引</t>

时间:2014-02-22 16:05:49

标签: c# unity3d

我正在制作一款基于回合制战斗的游戏。

对于战斗,我在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);
    }

我不知道我做错了什么,希望你能帮助我,或者至少让我指向更好的方向。

2 个答案:

答案 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.")
    }