Я делаю что-то вроде объективного списка с С#. Я получил его работу и все, способный нарисовать объективный список внутри Unity и сделать с ними новые задачи. У меня была идея о том, как удалить что-то, я использовал System.Linq
и функцию List.First для ее поиска. Но, похоже, это не работает.
Это код "Окончание и создание целей".
public void NewObjective(string objectiveText, string objName)
{
objectives.Add(new Objective(objectiveText, objName)); //Add to the list Objective.
middleText("New Objective: " + objectiveText); //Display text on screen.
}
public void FinishObjective(string shortObj)
{
var value = objectives.First(x => x.ObjectiveName.Contains( shortObj ));
string completedTask = value.objectiveDescription;
middleText("Completed Objective: " + completedTask); //Display text on screen.
objectives.Remove(value); //Remove value. (Which doesn't find anything for some reason, so it can't delete anything from the list.)
}
И затем в другом классе у меня есть новая цель, вот так.
GameController.gameController
.GetComponent<GameController>()
.NewObjective("Foobar.", "foo"); //First is the Quest description,
and the second is the name for easy deletion.
(Я также включал objectiveID
метод, но я опущен для простоты.)
В том же классе, когда игрок что-то завершает, у меня это есть.
GameController.gameController
.GetComponent<GameController>()
.FinishObjective("foo"); //This has two possible methods,
the object ID (if defined) or the name of the objective.
Что происходит, что я делаю неправильно, и что я могу сделать, чтобы исправить это? Спасибо за помощь.
Изменить: фактической ошибки нет. Просто он ничего не найдет, а есть что-то. Цели легко определяются как Цели списка = новый List(); внутри класса.
Это класс целей:
public class Objective : MonoBehaviour
{
public string objectiveDescription;
public string ObjectiveName;
public int ObjectiveID;
public Objective(string objective, string objectiveName)
{
objectiveDescription = objective;
ObjectiveName = objectiveName;
}
public Objective(string objective, string objectiveName, int objectiveID)
{
objectiveDescription = objective;
ObjectiveName = objectiveName;
ObjectiveID = objectiveID;
}
}
Возможно, вам понадобится реализовать что-то вроде IEquatable внутри вашего класса Objective. Вы просите компьютер проверить, содержит ли ObjectiveName shortObj, но он не знает, как сделать это сравнение. ObjectiveName строка? Список строк? a (n) Объективный класс? Если это список строк, которые мы называем "объективными именами", то ожидаемым элементом будет строка (что-то вроде shortObj.ObjectiveName, предполагающее, что строка). Если ObjectiveName - это список классов Objective, и вы спрашиваете, содержит ли этот список определенный объект Objective, называемый shortObj, тогда вам нужно реализовать IEquatable в своем классе Objective.
EDIT В свете последних комментариев попробуйте что-то вроде:
var value = objectives.AsEnumerable().Where(x => x.ObjectiveName == shortObj).FirstOrDefault();
List<Objective> objectives = new List<Objective>();
внутри класса.