我想在列表中的游戏对象消失的同时删除列表元素

Posted

技术标签:

【中文标题】我想在列表中的游戏对象消失的同时删除列表元素【英文标题】:I want to delete the list element at the same time that the game object in the list disappears 【发布时间】:2021-10-06 13:40:06 【问题描述】:

我们正在尝试添加在被特定武器攻击时同时失去三个儿童史莱姆的能力。

儿童史莱姆由 List 管理。

列表脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChildSlimeList : MonoBehaviour

[SerializeField]
private List<GameObject> SlimeChild=new    List<GameObject>();

public void ChildSlimeRandomOff()

    for (int i = 0; i < 2; i++)
    
        var SlimeNum = Random.Range(0, SlimeChild.Count);
        GameObject SlimeChildList = SlimeChild[SlimeNum];
        SlimeChildList.SetActive(false);

        SlimeChild.RemoveAt(SlimeNum);
    
 

儿童史莱姆脚本

using System;
using System.Collections.Generic;
using _SlimeCatch.Stage;
using UnityEngine;
using Random = System.Random;

public class ChildrenSlimeWeaponCollider : MonoBehaviour

[SerializeField] private GameObject MolotovCocktail;
public GameObject GameManager;
ChildSlimeList _childSlimeList;
void Start()

    //_childSlimeList = GetComponent<ChildSlimeList>().SlimeChild();


public void OnCollisionEnter2D(Collision2D other)

    //if (!other.gameObject.CompareTag("Weapon")) return;
    
    //_childSlimeList.SlimeChild.RemoveAt(this.gameObject);
    
    if (other.gameObject.CompareTag("MolotovCocktail")) 
    
        GameManager.GetComponent<ChildSlimeList>().ChildSlimeRandomOff();
    

    Destroy(gameObject);//or SetActive(false)
    Destroy(other.gameObject);//or SetActive(false)
    

按照这个速度,被特定武器攻击的孩子的史莱姆列表中的元素不会被直接删除。帮帮我。

游戏状态enter image description here

【问题讨论】:

控制台中有任何错误¿?还要考虑到使用Destroy(gameObject),您正在破坏ChildSlimeList 单体行为所在的游戏对象。因此,如果任何不是 MolotovCocktail 的东西发生碰撞,都会使游戏对象被销毁,因此触发器将不再监听 抱歉没有解释。 List脚本附加到一个空对象,Child slime脚本附加到每个子slime。总之,如何访问List并删除OnCollisionEnter2D()中包含被直接攻击的对象的元素?我知道我可以删除用RemoveAt()从List中取出来,但是不知道怎么指定。 @eichan114:你为什么写GameManager.GetComponent&lt;ChildSlimeList&gt;().ChildSlimeRandomOff();,为什么不写other.gameObject.GetComponent &lt; ChildSlimeList &gt; ().ChildSlimeRandomOff ()?对我来说,这似乎更像是一个参考问题,您提到或由GameManager 持有并且实际上发生了冲突。 @nIcEcOw 我要做的是让三对敌人同时消失。其中一个会是被直接攻击的那个,另外两个会随机选择。**GetComponent().ChildSlimeRandomOff();**调用随机选择两个body的函数。这完美地工作。问题是当被直接攻击的史莱姆消失时,列表中的元素数量并没有减少。 【参考方案1】:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChildSlimeList : MonoBehaviour 

    [SerializeField]
    private List<GameObject> SlimeChild=new List<GameObject>();
    
    public void ChildSlimeRandomOff()
    
        for (int i = 0; i < 2; i++)
        
            var SlimeNum = Random.Range(0, SlimeChild.Count);
            GameObject SlimeChildList = SlimeChild[SlimeNum];
            SlimeChildList.SetActive(false);

            SlimeChild.RemoveAt(SlimeNum);
        
    

    public void SlimeColliderDecision(GameObject gameObject)
    
        SlimeChild.Remove(gameObject);
    



using System;
using System.Collections.Generic;
using _SlimeCatch.Stage;
using UnityEngine;
using Random = System.Random;

public class ChildrenSlimeWeaponCollider : MonoBehaviour

    [SerializeField] private GameObject MolotovCocktail;
    public GameObject GameManager;
    ChildSlimeList _childSlimeList;
    void Start()
    
        //_childSlimeList = GetComponent<ChildSlimeList>().SlimeChild();
    
    
    public void OnCollisionEnter2D(Collision2D other)
    
        //if (!other.gameObject.CompareTag("Weapon")) return;
        
        if (other.gameObject.CompareTag("MolotovCocktail")) 
        
            GameManager.GetComponent<ChildSlimeList>().SlimeColliderDecision(this.gameObject);
            
            GameManager.GetComponent<ChildSlimeList>().ChildSlimeRandomOff();
        
        
        gameObject.SetActive(false);
        other.gameObject.SetActive(false);
    

通过进行此更改,我们能够隐藏三个对象,同时减少列表中包含它们的元素数量。

非常感谢那些给我提示的人。

【讨论】:

以上是关于我想在列表中的游戏对象消失的同时删除列表元素的主要内容,如果未能解决你的问题,请参考以下文章

列表元素彼此依赖

list.remove(x) 删除超过此列表中的对象[重复]

根据Angular 6中的类删除元素

比较列表中的元素并删除

R - 如何从函数列表中删除元素

如何删除列表中列表中的第一个元素?