Unity:数组中的几个gameObjects(?)

时间:2017-01-30 04:14:58

标签: c# unity3d gameobject

我正在使用以下机制在团结中打败这场比赛:当玩家的对手击中敌人的时候:

public GameObject obj;
...

void OnTriggerEnter(Collider collider){
obj=collider.gameObject;
}

然后,当玩家攻击时,如果它与物体的距离足够小,则敌人会受到伤害:

void hit(){
    if(kicked&&close){  //if he is kicking and is close enough
        obj.GetComponent<health>().DealDamage(damage); //this is inside a try/catch, just in case obj=null
(...)
}

问题是,如果2个敌人触碰到玩家,只有最后一个会被分配给变量obj,所以他会单独进行击中,这是我不想发生的。

有什么建议吗?我应该替换

GameObject obj;

有一个数组?那怎么样?

然后,在OnTriggerEnter方法上,将对象添加到数组中? (怎么做?)

3 个答案:

答案 0 :(得分:1)

一种简单的方法是让你的玩家拿着一个触发盒。当敌人进入触发器框时,它们会被添加到集合中并在退出时被删除:

public class PlayerAttack:MonoBehaviour
{
    private HashSet<Enemy> list = null;
    private void Awake(){ this.list = new HashSet<Enemy>(); }
    private void OnTriggerEnter(Collider col)
    {
         Enemy enemy = col.transform.GetComponent<Enemy>();
         if(enemy != null)
         {
             this.list.Add(enemy);  
         } 
    }
    private void OnTriggerExit(Collider col)
    {
         Enemy enemy = col.transform.GetComponent<Enemy>();
         if(enemy != null && this.list.Contains(enemy) == true)
         { 
             this.list.Remove(enemy);  
         } 
    }
    public void OnAttack()
    {
         foreach(Enemy enemy in this.list)
         { 
            enemy.GetComponent<Health>.DealDamage(damage); 
         }
    }
}

OnAttack是你的攻击方法,它会遍历所有近距离的敌人。 HashSet在这里是一个很好的候选者,因为它不会添加两次相同的项目,因此没有看到敌人获得多次点击的风险。

答案 1 :(得分:0)

我无法解决问题。永远不会分配伤害。

private HashSet<Enemy> list = null;

private void Awake(){this.list = new HashSet<Enemy>();}

void OnTriggerEnter(Collider col){

     Enemy enemy = col.transform.GetComponent<Enemy>();
     print(enemy); // this occurs
     if(enemy != null && this.list.Contains(enemy) == true)
     { 
        print(enemy); // this never occurs
         this.list.Remove(enemy);  
     } 
    }
    }


void hit(){      
    print("hit"); // this occurs

    foreach(Enemy enemy in this.list)
     {   // this never occurs
        enemy.GetComponent<health>().DealDamage(damage); 
     }

@Everts

答案 2 :(得分:-2)

屏幕上的所有对象列表都是敌人,树木,盒子等。
在无休止的循环中,您可以对所有对象执行一些操作:

while(true)
{
    // Here non combat characters do something.
    foreach(NonCombatCharacter character in NonCombatCharacters)
    {
        switch(character.Type)
        {
            case tinyBird: character.DoAction(Actions.Fly); break;
            case ...
            default:break;
        }
    }
    // Here your combat character aka enemies
    foreach(CombatCharacter character in CombatCharacters)
    {
        // Here you do your combat logic, cheks and etc.
    }
    // And then you player character change the world model, here you
    // process all player action such as changing position, losing hp.
    // And then world keep lifecycle again
}

编辑:所以有一个全局数组foreach对象。在团结中你也得到了它们,即使你没有创建阵列 你走了:
https://docs.unity3d.com/ScriptReference/Object.FindObjectsOfType.html
使用文档,大多数常见答案都在那里。