#c# #unity3d #events
#c# #unity3d #Мероприятия
Вопрос:
В этой проблеме взаимодействуют два класса. Я хотел бы отметить, что я использую Unity:
- Обработчик задач
public class TaskHandler{
public event Action<GameObject> TaskResponses;
private void Update(){
if (someCondition){
TaskResponses?.Invoke(taskObj);
}
}
}
- База задач
public class TaskBase: MonoBehaviour{
private TaskHandler taskHandler;
private void Start(){
taskHandler = gameObject.GetComponent<TaskHandler>();
taskHandler.TaskResponses = TaskResponse;
}
private void TaskResponse(GameObject taskObj){
//if check so that only specific TaskResponses run.
if (taskObj == gameObject){
//functions
}
}
}
Проблема, с которой я сталкиваюсь, связана с методами, которые расширяются TaskResponse()
.
public class SpecificTask{
public override void TaskResponse(GameObject taskObj)
{
base.TaskResponse(taskObj);
//another if check
if (taskObj == thisTaskObj){
//some other functionality
}
}
}
Я не хочу делать еще if
одну проверку. Я попробовал следующее:
public class TaskBase: MonoBehaviour{
//Start() method omitted
private void TaskResponse(GameObject taskObj){
//if check so that only specific TaskResponses run.
if (taskObj == gameObject){
//functions
}
else{
//Effectively stops code from SpecificTask to continue running,
//But other Actions are no longer called.
return;
}
}
}
Но return
оператор останавливается TaskReponses()
из других классов для запуска. Под этим я подразумеваю, что если бы у меня был класс Task1
and Task2
, и Task1
‘s TaskResponse()
запускается первым, но он запускает оператор else , он останавливается и не запускает Task2
‘s TaskResponse()
.
Как я могу улучшить свой код, чтобы прекратить писать повторяющиеся if
проверки, в то время как мой код проверяет все Action
так, как я хочу? Должен ли я вообще не использовать event
этот сценарий?
Спасибо!
Ответ №1:
Вы могли бы сделать это не void
так, а скорее bool
, что указывает, был ли метод успешно завершен или прерван, например,
public class TaskBase
{
public virtual bool TaskResponse(GameObject taskObj)
{
if(taskObj != thisObj) return false;
// Default stuff to happen
return true;
}
}
Тогда вы можете сделать
public class MyTask
{
public override bool TaskResponse (GameObject taskObj)
{
if(!base.TaskResponse(taskObj)) return false;
// Default stuff already happened
// Now you can add additional stuff here
return true;
}
}
В качестве альтернативы, если вы хотите полностью избежать этой if
проверки, я также часто использую отдельные методы, такие как
public class TaskBase
{
public void TaskResponse (GameObject taskObj)
{
if(taskObj != thisObj) return;
TaskResponseInternal();
}
protected virtual void TaskResponseInternal()
{
// Default stuff to happen
}
}
А затем просто переопределите это вместо этого
public class MyTask
{
protected override void TaskResponseInternal ()
{
// If you want also the default stuff
base.TaskResponseInternal();
// Additional stuff to happen
}
}
Комментарии:
1. Я плохо сформулировал свой вопрос и объяснил его. Я обновил вопрос, чтобы предоставить более подробную информацию. Проблема, с которой я столкнулся, заключается в том, что я попробовал
return;
это утверждение, но оно останавливает запуск otherTaskResponse()
in the event.