2017-02-21 61 views
-1

Я сделал некоторые исследования по резьбу и caroutines, и я не знаю, как «укусить» проблема программирования у меня есть:C#, единство - caroutines, нить, логика, программка структура

мне нужно запустить simultainously характера AI в простой игре - и мне нужно иметь возможность заморозить/приостановить их выполнение в течение определенного времени, а также thraw/unpause. Мне также нужно запустить функцию foreach, которая возьмет символы из списка и создаст управляемый AI для каждого из них, а также beign, способный создавать новый AI по запросу (путем передачи конструкторов).

Возможно, это простая вещь, но у меня нет опыта, пожалуйста, помогите.

+0

Какова ваша проблема? Покажите нам какой-то Кодекс. Ваш Awnser не прилагает никаких усилий для выполнения чего-либо. Кроме того, Unity3D - это «Архитектура на основе компонентов», поэтому создание сценария, который одновременно перемещает GameObjects, не является проблемой. – Smartis

ответ

2

В Unity вам не нужно слишком много думать о потоках и т. Д., Чтобы создать одновременное поведение. Например; вы создаете GameObject, Enemy, со скриптом, чтобы следовать за другим GameObject; Игрок, у которого есть сценарий, который движется от вас. Каждый объект в сценах со сценарием будет работать одновременно, без необходимости в Threads и т. Д. Может быть, например, 5 GameObjects «Enemy» с тем же сценарием EnemyFollowPlayer.cs, и он будет работать как 5 разных EnemyFollowPlayer одновременно. Coroutines - это если вы хотите, чтобы потоковое поведение в одном одиночном скрипте могло быть очень полезным, но не нужно для самых простых вещей.

I made a quick GIF to illustrate how Unity handles simuntaneous execution Если это не ясно из моего описания. Поскольку вы, похоже, ошибаетесь, думая о единстве компонентной архитектуры.

В этом GIF вы видите Test.cs, который вызывает привязку GameObject для перемещения x + 0.001 при запуске void Update(), который Unity запускает для нас каждый кадр. Мы видим, как он работает с 1 GameObject, и когда мы копируем этот GameObject, мы видим, что он работает одновременно с 2 GameObjects без необходимости в Coroutines, Threads или что-нибудь подобное.

Coroutines отлично подходят для запуска кода async! Unity поставляется с некоторыми удобными функциями в них. Проверьте этот пример:

void SomeNormalMethod() { 
    StartCoroutine(AsyncMethod()); 
    Debug.Log("I will Log first"); 
} 

IEnumerator AsyncMethod() { 
    yield return new WaitForSeconds(3f); 
    Debug.Log("Then after 3 seconds, I will Log!"); 
} 

сопрограмму должен быть метод типа IEnumerator, который дает нам доступ к yield функциональности. С этим мы можем использовать функциональность Unity WaitForSeconds (между прочим), чтобы этот асинхронный код подождал несколько секунд, прежде чем что-то делать, не прерывая работу SomeNormalMethod(). Не забудьте инициализировать их StartCoroutine(), иначе ничего не произойдет!

+0

Спасибо - я думал о запуске кода, инициализированного кодом, не имел большого опыта работы с GameObjects и что они уже созданы для сценариев для одновременного запуска при необходимости. Я попытаюсь основываться на структуре кода при взаимодействии с GameObjects. – Bronsoner

+0

Хорошо! Запуск кода, инициализированный кодом, является большим использованием для Coroutines, я обновил свой ответ на примере и как он работает! – Maakep

+0

Спасибо за вашу огромную помощь в понимании этого. Я бы дал вам больше очков, если бы мог :) – Bronsoner