Вторник, 25 Сентября 2018, 17:37

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

Меню сайта
Категории каталога
Создание игр [312]
Статьи об общих понятиях связанных с созданием игр.
Программирование [69]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [123]
Статьи о программах для создания игр, уроки и описания.
Софт [27]
Различные программы, в том числе в помощь игроделам.
2D-графика [11]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [10]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [91]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [68]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Типа какой из этих игр вы предпочитаете делать игры?
Всего ответов: 16388
Главная » Статьи » Создание игр

Unity3d. Использование Component. BroadcastMessage
На местном форуме наткнулся на вопрос от одного из пользователей о Component.BroadcastMessage. Из за плохого знания английского он не мог полностью понять выдержку из официальной справки. Я решил разобрать этот момент, думаю новичкам в Unity это пригодится, так как Component.BroadcastMessage очень часто целесообразно использовать в создании игр.

Собственно, вопрос его заключался в следующем. Есть префаб, скриптом создаем его экземпляры в сцене. На каждом экземпляре висит скрипт с его персональным значением. Нужно было по нажатию мыши изменять это значение.

Итак, приступим. Создадим к примеру куб. Create - Cube. Если на него автоматически не прикрепился коллайдер, прикрепим его вручную Component - Physics - BoxCollider (это понадобится для проверки нажатия на объект).
Создадим C# скрипт, назовем его CubeScript

Код

public class CubeScript : MonoBehaviour {

//создадим целочисленную переменную, это и будет то значение, которое будем менять нажатием мышки

  public int cubeValue = 10;

//далее - функция, вызов которой обеспечивает уменьшение переменной на еденицу, и вывод в лог имени экземпляра и его измененного
//значения

  public void ChangeCubeValue() {
  cubeValue -= 1 ;
  Debug.Log (gameObject.name + " Value = " + cubeValue);  
  }
}


Сохраним скрипт, повесим его на наш куб. В окне Project создадим префаб (Create - Prefab). Называть его не обязательно, так как имя мы позже будем менять. Перетащим на него наш куб и сцены. Удалим куб в сцене (оставим только mainCamera).

Создаем еще один C# скрипт, называем его BroadcastMessageLogic. Открываем его и пишем:

Код

public class BroadcastMessageLogic : MonoBehaviour {
  private Ray ray; // луч, выпущенный щелчком мыши
  private RaycastHit hit; // переменная для хранения объекта, с которым столкнется луч
  public GameObject cubePrefab; // публичная переменная для нашего префаба
   
  void Awake() { // загрузка сцены
  cubePrefab.name = "Cube1"; // задаем имя префаба Cube1
  Instantiate(cubePrefab,new Vector3(0,4f,0),Quaternion.identity); // создаем первый куб
  cubePrefab.name = "Cube2"; // задаем имя префаба Cube2
  Instantiate(cubePrefab,new Vector3(0,-4f,0),Quaternion.identity); // создаем второй куб
  cubePrefab.name = "Cube3"; // задаем имя префаба Cube3
  Instantiate(cubePrefab,new Vector3(4f,0,0),Quaternion.identity); // создаем третий куб
  cubePrefab.name = "Cube4"; // задаем имя префаба Cube4
  Instantiate(cubePrefab,new Vector3(-4f,0,0),Quaternion.identity); // создаем четвертый куб
  }
   
  void Update () {
  if(Input.GetMouseButtonDown(0)){ // при нажатии на левую кнопку мышки  
  ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition); // создаем луч
  if(Physics.Raycast (ray, out hit)){ // если он стулкнулся с физическим объектом
  // посылаем данному объекту сообщение - вызываем в нем функцию ChangeCubeValue
  hit.collider.BroadcastMessage("ChangeCubeValue",SendMessageOptions.DontRequireReceiver);  
  }  
  }  
  }
}


Сохраняем скрипт, вешаем его на камеру. В скрипте, в окно cubePrefab перетаскиваем наш префаб куба. Запускаем сцену.
При клике на куб, видим в логе сообщения о имени объекта, его измененном значении.

Ссылка на видео результат работы метода

Другой пример. На сцене есть куб, шар и конус. На каждом из них висят скрипты с персональной переменной объекта. Нужно по нажатию на куб менять переменные в шаре и конусе.

Создаем куб, шар и конус. У шара и конуса выключаем компонент Collider, если он на нем есть. На них мы нажимать не будем, поэтому этот компонент нам не нужен.
Создаем C# скрипт SphereScript. Заполняем его

Код

public class SphereScript : MonoBehaviour {
  public int sphereValue = 10;

  public void ChangeSphereValue() {
  sphereValue -= 1 ;
  Debug.Log (gameObject.name + " Value = " + sphereValue);  
  }
}


Сохраняем его, перетаскиваем на шар. Для конуса создадим почти такой же скрипт ConeScript

Код

public class ConeScript : MonoBehaviour {
  public int coneValue = 10;

  public void ChangeConeValue() {
  coneValue -= 3 ;
  Debug.Log (gameObject.name + " Value = " + coneValue);  
  }
}


Этот скрипт перетаскиваем на конус.

На камеру повесим главный скрипт BroadcastMessageLogic

Код

public class BroadcastMessageLogic : MonoBehaviour {
  private Ray ray;
  private RaycastHit hit;
  public GameObject cube;
  public GameObject sphere;  
  public GameObject cone;  

  void Update () {
  if(Input.GetMouseButtonDown(0)){
  ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
  if(Physics.Raycast (ray, out hit)){  
  sphere.BroadcastMessage("ChangeSphereValue",SendMessageOptions.DontRequireReceiver);
  cone.BroadcastMessage("ChangeConeValue",SendMessageOptions.DontRequireReceiver);
  }  
  }  
  }
}


Куб, шар и конус перетаскиваем из сцены в скрипт. Но не удаляем их со сцены.
Запустим сцену. Теперь при нажатии на куб, мы увидем в логе что переменная шара уменьшилась на 1, а переменная конуса - на 3.

Этот метод можно использовать очень часто в создании игр - например при изменении здоровья врага, его маны, прочих вещей. Фантазия его использования безгранична )

Источник: КЛИК»
Категория: Создание игр | Добавил: NEBR (27 Октября 2013) | Автор: Дмитрий NEBR Кичеев
Просмотров: 4481 | Комментарии: 3 | Рейтинг: 5.0/7 |
Теги: C#, BroadcastMessage, обмен сообщениями, Unity3D, prefab, GameObject.BroadcastMessage, Геймдев, Component.BroadcastMessage, Создание игр, U3D
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Unity3d. Использование Component. BroadcastMessage», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 3
+3-
3 NEBR   (31 Октября 2013 09:06)
NEBRрад слышать что мои очерки кому то полезны happy

+3-
2 beril   (31 Октября 2013 02:05)
berilDj наконец то. Спасибо за статью

+2-
1 inventrix   (28 Октября 2013 21:45)
Хорошая статья, спасибо за хорошее объяснение!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Torque 2D
  • Blitz3D
  • HoZ Engine
  • PGD Community Engine
  • Open Zelda
  • CopperCube 6
  • PICO-8
  • Frank Engine
  • Boom
  • ScoreDoom
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2018 Рейтинг