Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 14.09.2010, 10:51   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Работа с тэгами

В Unity есть средство для маркировки объектов с помощью тэгов. Тэг это текстовое имя, по которому можно искать и работать с объектами сцены. Пользователь может создать сколько угодно тэгов, но так же есть встроенные по умолчанию:
  • Respawn
  • Finish
  • EditorOnly
  • MainCamera
  • Player
  • GameConroller

Создать или выбрать теги можно выбрав любой GameObject и в инспекторе используя поле Tag:




Теперь пример использования.

Нам понадобится тэг "Menu", на скриншотах выше он уже создан, так что с его созданием Вы справитесь.

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

MainMenu.cs
using UnityEngine;

public class 
MainMenu MonoBehaviour
{
    public 
void OnGUI()
    {
        
// позиция меню
        
Rect areaPos = new Rect(Screen.width 2f 60fScreen.height 2f 100f120200);

        
// создаем стиль с выравниванием по центру
        
GUIStyle label = new GUIStyle(GUI.skin.label);
        
label.alignment TextAnchor.MiddleCenter;

        
// область со стилем window
        
GUILayout.BeginArea(areaPosGUI.skin.window);
        {
            
GUILayout.Space(-20);

            
// рисуем название меню
            
GUILayout.Label("Main Menu"label);

            
GUILayout.Space(10);

            
// кнопка "Start Game"
            
if (GUILayout.Button("Start Game"GUILayout.Height(25)))
            {
                
// активируем меню StartGame
                
ActivateMenu("StartGame");
            }

            
GUILayout.Space(8);

            
// кнопка "Options"
            
if (GUILayout.Button("Options"GUILayout.Height(25)))
            {
                
// активируем меню Options
                
ActivateMenu("Options");
            }

            
GUILayout.Space(8);

            
// кнопка выхода
            
if (GUILayout.Button("Quit"GUILayout.Height(25)))
            {
                
Application.Quit();
            }
        }
        
GUILayout.EndArea();

    }


    
// с помощью этой функции будем активировать меню
    
public static void ActivateMenu(string menuName)
    {
        
// получаем все объекты сцены, комеченные тэгом Menu
        
GameObject[] menus GameObject.FindGameObjectsWithTag("Menu");

        
// перебираем
        
foreach (GameObject menu in menus)
        {
            
// если имя совпадает с указанным, то активируем компоненты объекта, если нет - деактивируем
            
bool active menu.name == menuName;
            foreach (
MonoBehaviour behaviour in menu.GetComponents<MonoBehaviour>())
            {
                
behaviour.enabled active;
            }
        }
    }

OptionsMenu.cs
using System;
using UnityEngine;

public class 
OptionsMenu MonoBehaviour
{
 
    public 
void OnGUI()
    {
        
Rect areaPos = new Rect(Screen.width 2f 60fScreen.height 2f 125f120250);

        
// создаем стиль с выравниванием по центру
        
GUIStyle label = new GUIStyle(GUI.skin.label);
        
label.alignment TextAnchor.MiddleCenter;


        
GUILayout.BeginArea(areaPosGUI.skin.window);
        {
            
GUILayout.Space(-20);

            
// название меню
            
GUILayout.Label("Options"label);

            
GUILayout.Space(5);
            
GUILayout.Label("Graphics Level:"label);
            
GUILayout.Space(8);

            
// кнопки выбора качества
            
foreach (QualityLevel qualityLevel in Enum.GetValues(typeof (QualityLevel)))
            {
                
// цвет кнопки в зависимости что выбрано
                
GUI.color = (QualitySettings.currentLevel == qualityLevel) ? Color.red Color.white;

                
// кадая кнопка выбирает качество
                
if (GUILayout.Button(qualityLevel.ToString()))
                {
                    
QualitySettings.currentLevel qualityLevel;
                }
            }
            
GUI.color Color.white;
            
GUILayout.Space(12);

            
// кнопка Back
            
if (GUILayout.Button("Back"GUILayout.Height(25)))
            {
                
MainMenu.ActivateMenu("MainMenu");
            }

        }
        
GUILayout.EndArea();

    }

LoadingGameMenu.cs
using UnityEngine;
using System.Collections;

public class 
LoadingGameMenu MonoBehaviour
{
    
// строка с прогрессом
    
private string _progress "Loading";
    
// флаг загрузки
    
private bool _loaded;

    
// при активации компонента
    
public void OnEnable()
    {
        
StartCoroutine(ProgressBarUpdater());
    }

    
// сопрограмма загрузки
    
public IEnumerator ProgressBarUpdater()
    {
        for (
int i 09i++)
        {
            
_progress += ".";
            
yield return new WaitForSeconds(1);
        }
        
_loaded true;
    }

    
// вывод GUI части
    
public void OnGUI()
    {
        
Rect pos = new Rect(Screen.width 2f 60fScreen.height 2f 10f12020);
        if (!
_loaded)
        {
            
// отображаем процесс загрузки
            
GUI.Label(pos_progress);
        }
        else
        {
            if(
GUI.Button(pos"Play"))
            {
                
// старт игры 
            
}
        }
    }

Обратите внимание на статическую функцию ActivateMenu первого скрипта. Эта функция принимает имя объекта сцены на который происходит переключение. Из остальных скриптов так же используется эта функция. Она ведет себя следующим образом: 1) находит все объекты помеченные тэгом "Menu"; 2) по имени объекта определяет что нужно сделать с компонентами объекта - включить или выключить; 3) собственно включает и выключает компоненты.

Для того чтобы активировать например меню Options мы передаем этой функции его имя и она оставляет включенными компоненты только на объекте с именем Options.

Попробуем собрать сцену:
  1. Создайте следующую иерархию объектов их пустых GameObject'ов:
  2. Назначьте соответствующие скрипты объектам меню и так же назначьте им тэг "Menu".

    Заметьте что, включенным должен быть только один скрипт меню (в нащем случае MainMenu).
  3. Можно протестировать сцену.

Я не буду описывать работу скриптов, т.к. там хватает комментариев, а остальное должно быть понятно

Иногда одного тэга на объекте не хватает, но в стандартных средствах юнити нет поддержки назначения нескольких тэгов на один объект. Данная проблема решена в проекте Antares, о котором Вы уже наверное много раз слышали. Скачать его можно здесь.

Удачи!
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
EvilOkta (12.03.2013), Illidan (14.09.2010), Nex (14.09.2010), Nuprahtor (14.09.2010), Stanis1av (25.10.2010)
Старый 14.09.2010, 11:01   #2
Illidan
Разработчик
 
Регистрация: 06.08.2007
Сообщений: 473
Написано 131 полезных сообщений
(для 257 пользователей)
Ответ: Работа с тэгами

Это то что я хотел!) спасибо
(Offline)
 
Ответить с цитированием
Старый 12.03.2013, 06:36   #3
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 305
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Работа с тэгами

а есть возможность через скрипт назначать тег на объект? ну и менять его на другой соответственно?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 12.03.2013, 07:40   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: Работа с тэгами

Можно http://docs.unity3d.com/Documentatio...bject-tag.html
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (12.03.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 13:53.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com