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.
Этот метод можно использовать очень часто в создании игр - например при изменении здоровья врага, его маны, прочих вещей. Фантазия его использования безгранична )
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Unity3d. Использование Component. BroadcastMessage», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.