Пятница, 03 Мая 2024, 21:08

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Форум игроделов » Записи участника » Jlexa123 [47]
Результаты поиска
Jlexa123Дата: Суббота, 27 Апреля 2019, 16:34 | Сообщение # 41 | Тема: Объясните пожалуйста как сделать систему рассылки и слушаний
частый гость
Сейчас нет на сайте
http://s1.uploadpics.ru/images/WyS6BZ-Q9N.jpg
Jlexa123Дата: Суббота, 27 Апреля 2019, 16:12 | Сообщение # 42 | Тема: Объясните пожалуйста как сделать систему рассылки и слушаний
частый гость
Сейчас нет на сайте
Там очень простая сценка, скрипт висит на пустом объекте, который просто висит в воздухе, спавнеры расположены в трех местах сцены, все это постоянно присутствует в сцене и никогда не удаляется. Спавнеры такие же пустые объекты, они просто создают куб на своем месте.

Сообщение отредактировал Jlexa123 - Суббота, 27 Апреля 2019, 16:13
Jlexa123Дата: Суббота, 27 Апреля 2019, 14:25 | Сообщение # 43 | Тема: Объясните пожалуйста как сделать систему рассылки и слушаний
частый гость
Сейчас нет на сайте
Не, респавнеры всегда находятся в сцене, они спавнят кубы если spawn = true, и код-то тоже работает постоянно, постоянно показывает, что resp[0] = Respavner, но при этом выдает ошибку все время, что 0 вне границ массива.
Jlexa123Дата: Суббота, 27 Апреля 2019, 14:09 | Сообщение # 44 | Тема: Объясните пожалуйста как сделать систему рассылки и слушаний
частый гость
Сейчас нет на сайте
Вычитал где-то, что помогает проверка длинны массива, если написать if(0<resp.Length) Debug.Log(resp[0 или любой элемент массива]) то все работает, но это же баян какой-то. Почему так, кто знает?

Добавлено (27 Апреля 2019, 14:09)
---------------------------------------------
web_sstas уже пробовал, тоже самое выдает.


Сообщение отредактировал Jlexa123 - Суббота, 27 Апреля 2019, 14:10
Jlexa123Дата: Суббота, 27 Апреля 2019, 13:35 | Сообщение # 45 | Тема: Объясните пожалуйста как сделать систему рассылки и слушаний
частый гость
Сейчас нет на сайте
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SceneController : MonoBehaviour
{
---private int r;
---private bool spawn;
---[SerializeField] private Respavner[] resp; --- в инспекторе присоединено 3 объекта Respavner

---void Start()
---{
------for(int i = 0; i<resp.Length; i++)
------{
------r = Random.Range(0, 2);
------if(r == 0)
------{
----------spawn = false;
------}
------else
------{
----------spawn = true;
------}
------Debug.Log("i: " + i + " "+ "r: " + r + " " + "spawn: " + spawn);
------Debug.Log(resp[i]);
------resp[i].spawnStart(spawn);
------}
---}

---void Update()
---{
-------Debug.Log(resp[0]); ----- выдает ошибку
---}
}

Если брать любой стандартный тип: int, string или Sprite какой-нибудь, то все нормально, а если свой, то пишет индекс вне границ массива, при этом консоль отображает объект Respavner


Сообщение отредактировал Jlexa123 - Суббота, 27 Апреля 2019, 13:44
Jlexa123Дата: Пятница, 26 Апреля 2019, 19:09 | Сообщение # 46 | Тема: Объясните пожалуйста как сделать систему рассылки и слушаний
частый гость
Сейчас нет на сайте
На русском их всего штук 5, тем более в этой настолько все разжевано, что даже школьник все поймет.

Добавлено (26 Апреля 2019, 21:14)
---------------------------------------------
Все, я сам разобрался.

Добавлено (27 Апреля 2019, 10:59)
---------------------------------------------
Теперь другая проблема появилась ))) вот у нас есть сериализированный массив [SerializedField] private Respavn[] resp; в него мы добавляем в инспекторе 3 респавнера, которые спавнят мобов. далее пишем Debug.log(resp[0]);
------------ВОПРОС-------------

Почему во время игры выскакивает ошибка IndexOutOfRangeException: Index was outside the bounds of the array.
SceneController.Update () (at Assets/Scripts/SceneController.cs:38) индекс вне границ массива. Хотя консоль отображает что resp 0 = объекту? Ошибка выскакивает даже если инициализировать массив с 3 объектами.


Сообщение отредактировал Jlexa123 - Суббота, 27 Апреля 2019, 11:01
Jlexa123Дата: Пятница, 26 Апреля 2019, 18:44 | Сообщение # 47 | Тема: Объясните пожалуйста как сделать систему рассылки и слушаний
частый гость
Сейчас нет на сайте
Здравствуйте, я нуб в с# и в Unity, однако учусь по Unity в действии, Джозеф Хокинг. Книга написана для юнити 4+, однако в юнити 5 все изменилось и я не могу понять, как сделать тоже самое в юнити 5. Кому целиком лень читать, читайте с середины.
-------------задание из книги--------------

6.4.1. Интегрирование системы сообщений
Для оповещения UI о происходящем в сцене мы создадим систему широковещательной рассылки сообщений. Хотя в Unity нет подходящей для выполнения такой задачи встроенной функции, мы можем скачать нужный сценарий. Вики-сообщества Unify представляют собой репозиторий бесплатного кода от различных разработчиков. Их система для службы сообщений дает несвязанный способ взаимодействия с остальной частью программы посредством событий. Рассылающий сообщения код может ничего не знать о подписчиках, что позволяет легко менять или добавлять взаимодействующие объекты.
Создайте сценарий с именем Messenger и скопируйте в него одноименный код со страницы http://wiki.unity3d.com/index.php/CSharpMessenger_Extended.
Далее вам понадобится еще один сценарий, который называется GameEvent. Его код приведен в следующем листинге.
Листинг 6.7. Сценарий GameEvent, который будет использоваться вместе со сценарием Messenger
public static class GameEvent {
public const string ENEMY_HIT = "ENEMY_HIT";
public const string SPEED_CHANGED = "SPEED_CHANGED";
}
6.4. Обновление игры в ответ на события 157
Этот сценарий задает константу для пары сообщений о событиях, что позволяет систематизировать сообщения, одновременно избавляя вас от необходимости вводить строку сообщения в разных местах.
Система оповещений о событиях готова, давайте ею воспользуемся. Начнем мы с сообщений от сцены к проекционному дисплею, а затем запрограммируем взаимодействие в противоположном направлении.
6.4.2. Рассылка и слушание сообщений сцены
До текущего момента вместо набранных игроком очков отображались значения времени — мы использовали таймер для тестирования функциональности нашего текстового дисплея. Нам же нужно, чтобы там отображалось количество пораженных игроком врагов, поэтому давайте отредактируем код сценария UIController. Первым делом удалите метод Update(), так как именно там находился тестовый код. В момент своей смерти враг генерирует событие. Следующий листинг заставит сценарий UIController слушать это событие.
Листинг 6.8. Добавление подписчиков на событие в сценарий UIController
...
private int _score;
void Awake() {
Messenger.AddListener(GameEvent.ENEMY_HIT, OnEnemyHit); ¬
}
void OnDestroy() {
Messenger.RemoveListener(GameEvent.ENEMY_HIT, OnEnemyHit); ¬
}
void Start() {
_score = 0;
scoreLabel.text = _score.ToString(); ¬ Присвоение переменной score начального значения 0.
settingsPopup.Close();
}
private void OnEnemyHit() {
_score += 1; ¬ Увеличение переменной score на 1 в ответ на данное событие.
scoreLabel.text = _score.ToString();
}
...
Первым делом обратите внимание на методы Awake() и OnDestroy(). Как и методы Start() и Update(), все члены класса MonoBehaviour автоматически реагируют на активацию или удаление объекта. Подписчик добавляется в методе Awake() и удаляется в методе OnDestroy(). Будучи частью системы широковещательной рассылки сообщений, при получении данного сообщения он вызывает метод OnEnemyHit(), который увеличивает переменную score на 1 и выводит новое значение на текстовый дисплей.
Подписчик события задан в коде UI, поэтому каждое поражение врага должно сопровождаться рассылкой соответствующего сообщения. Реагирующий на смерть врага
Объявляем, какой метод отвечает на событие ENEMY_HIT.При разрушении объекта удаляйте подписчика, чтобы избежать ошибок.
158 Глава 6. Двухмерный GUI для трехмерной игры
код находится в сценарии RayShooter.cs, поэтому добавьте туда код отправки сообщения из следующего листинга.
Листинг 6.9. Рассылка сообщения о событии в сценарии RayShooter
...
if (target != null) {
target.ReactToHit();
Messenger.Broadcast(GameEvent.ENEMY_HIT); ¬ К реакции на попадания добавлена рассылка сообщения.
} else {
...
Запустите игру и убедитесь, что теперь текстовый дисплей отображает количество пораженных врагов.
--------------------------------------------------------------------------

Кому лень читать, смысл в том, что у нас есть один скрипт с двумя стринговыми переменными, которые содержат в себе название события, есть второй скрипт, который добавляет слушатель событий, который запускает некий метод, а после удаляет этот слушатель событий и есть третий скрипт, который отправляет сообщение с названием события из первого скрипта второму скрипту. А теперь вопрос, в котором мы все не много упростим:
------------------вопрос----------------------------
У нас есть движущаяся сфера, которая при timer = 5 отправляет сообщение кубу:

public class sphere : MonoBehaviour
{
---private int timer = 0;
---private bool controller = true;
---[SerializeField] private GameObject cubee;

---void Update()
---{

------if(controller == true)
------{
---------transform.Translate(0, 0, +0.1f);
---------if(transform.position.z >= 5)
---------{
------------timer++;
------------Debug.Log("Timer = " + timer);
------------controller = false;
---------}
------}
------else if (controller == false)
------{
---------transform.Translate(0, 0, -0.1f);
---------if(transform.position.z <= 0)
---------{
------------controller = true;
---------}
------}

------if (timer == 5 )
------{
---------timer = 0;
---------cubee.BroadcastMessage("Go", SendMessageOptions.DontRequireReceiver);
------}
---}
}

Как добавить к кубу слушателя событий, который услышит событие, запустит метод Go, который начнет двигать куб вперед и удалит этот слушатель, чтобы куб более не реагировал на сообщения сферы, но при этом продолжал двигаться вперед? В коде выше куб всегда реагирует на сообщение и запускает метод Go.


Сообщение отредактировал Jlexa123 - Пятница, 26 Апреля 2019, 18:55
Форум игроделов » Записи участника » Jlexa123 [47]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг