Моя цель с кодом состоит в том, чтобы на экране появилось несколько черепов для сравнения.В зависимости от количества черепов на экране (1-6) они меняют положение и размер, я сделал это с помощью массива gameObjects (черепов) и списка, который может отслеживать, какой череп находится в какой «позиции».
Код работает, если вы добавляете, но сталкивается с проблемами при удалении объекта.Он работает на RemoveAt только в том случае, если вы удаляете объекты GameObject в том же порядке, в котором они были добавлены.IE: список всегда удаляет элемент 0 (первый элемент в списке), а не конкретный gameObject, вызывающий функцию RemoveAt .
Хотя я нашел многоответы о том, как удалить отдельные отдельные объекты GameObject. Они не работают, так как мои объекты GameObject находятся в массиве. Я не могу просто сказать удалить имя gameObject .Что приводит меня к моему вопросу о том, как удалить определенный gameObject [] из списка?
remove или removeAll , запустите эти две ошибки:
ошибка CS1502: Наилучшее совпадение перегруженного метода для System.Collections.Generic.List<UnityEngine.GameObject>.RemoveAll(System.Predicate<UnityEngine.GameObject>)' has some invalid arguments.<br>
Error CS1503: Argument
# 1 'не может преобразовать int' expression to type
System.Predicate'
Вот два моих сценария для всего этого:
Скрипт на каждом черепе птицы с именем birdController :
public int myBirdID;
public int orderInList;
//bool to keep track of object active or not
public bool whoAmIReally;
//potentially redundant; allows game object to see if hes on or not
public GameObject IAmMe;
// Use this for initialization
void Start () {
//fixingIntOrder();
}
public void OnEnable(){
//when object is on check bool
whoAmIReally = true;
Debug.Log("IM ON");
}
public void OnDisable(){
//when object is turned off uncheck bool, change list value to 0
//**this wont change actual list order or value in cubeplacement script- my hope is that it might have- likely missing a step somewhere
whoAmIReally = false;
orderInList = 0;
Debug.Log("IMOFF");
}
Скрипт на пустом месте со всеми данными моего массива и списка с именем cubePlacement :
public int numberSkullOnScreen;
public bool[] skullOn;
public GameObject[] allSkulls;
public GameObject listHolder;
public List<GameObject> birdsOnScreen = new List<GameObject>();
//declaring the script to avoid NullReferenceEcxeption where I reference it
public birdController _birdController;
// Use this for initialization
void Start () {
//only way I can get my list to work: have an object act as a placeholder onStart
birdsOnScreen.Add(listHolder);
}
//turning on and off the skulls
public void toggleBirdSkull(int mySkull){
if (skullOn[mySkull] == false){
//set specific gameObject active
allSkulls[mySkull].SetActive(true);
//make skull on bool true
skullOn[mySkull] = true;
//add one to the number on screen
numberSkullOnScreen++;
//reference int orderInList from Bird controller script
allSkulls[mySkull].gameObject.GetComponent<birdController>().orderInList = numberSkullOnScreen;
//add skull to list when turned on THIS WORKS YAY
birdsOnScreen.Add(allSkulls[mySkull]);
//Run function to place skulls
placementSkulls();
}
else{
allSkulls[mySkull].SetActive(false);
skullOn[mySkull] = false;
numberSkullOnScreen--;
//remove skull from list when turned off-- THIS DOESNT WORK...
birdsOnScreen.RemoveAt(allSkulls[mySkull].gameObject.GetComponent<birdController>().orderInList);
//Run function to place skulls based on the int number skulls on screen
placementSkulls();
}
}