7/24/2014

Global Define in Unity

Недавно наткнулся на весьма полезный скрипт и решил написать пост. Выложить ссылку было бы слишком просто для меня, поэтому я накидал здесь кучу буковок. Кому не интересно переходим сразу в конец поста и открываем ссылку. Для остальных продолжу, пожалуй!

Довольно часто у нас возникает необходимость  изменять код на этапе компиляции в зависимости от каких бы то ни было условий. Для этого можно использовать всем известную директиву препроцессора #define. А теперь для наглядности немного кода:
       
/*
 * DefineTest.cs
 */
#define DEV_MODE
#define TRACE_STEP
using UnityEngine;
using System.Collections;

public class DefineTest : MonoBehaviour 
{
 private void Start () 
 {
  #if DEV_MODE
  Test();
  #endif
 }
 
 private void Test()
 {
  #if TRACE_STEP
  Debug.Log( " - DefineTest::Test();");
  #endif
  Debug.Log ("Hello world!");
 }
}
Думаю всем понятно как все это дело работает. В противном случае закомментируйте первый или второй #define в начале кода, и проследите за работой скрипта. А теперь создадим еще один скрипт.
       
/*
 * OtherTest.cs
 */
 /* если здесь объявим те же Define, 
    что и в первом скрипте, то все будет работать,
    но представьте, что скриптов использующих их
    очень много и в каждый из них дублировать
    эти строки на мой взгляд неразумно
*/
using UnityEngine;
using System.Collections;

public class OtherTest : MonoBehaviour 
{
 private void Start () 
 {
  Test ();
 }

 private void Test()
 {
  #if (DEV_MODE || TRACE_STEP)
  Debug.Log("Define visible");
  #else
  Debug.Log("Defines invisible");
  #endif
 }
}
 Для того чтобы наши define'ы были видны во всем проекте будем использовать стандартные средства Unity редактора. В панели меню выбираем: File->Build Settings... -> Player Settings, далее на панели раздел Other Settings -> Configurations ниже поле ввода там и прописываем через запятую наши define'ы: DEV_MODE;TRACE_STEP. Но я все же  покажу еще один способ:
В следующих директориях создаем текстовый файл с расширением .rsp, имя даем в зависимости от языка.
C#-< Project Path>/Assets/smcs.rsp
C# Скрипты редактора-< Project Path>/Assets/gmcs.rsp
UnityScript -< Project Path>/Assets/us.rsp
Boo-< Project Path>/Assets/boo.rsp
В нем в одну единственную строчку прописываем наши define'ы, следующим образом:
       
    -define:DEV_MODE;TRACE_STEP
Пару раз проделав это вручную, мне захотелось упростить процесс и я начал писать свой скрипт который делал бы это за меня, но совершенно случайным образом наткнулся на уже готовое решение. Вот оно:
Вот и обещанная ссылочка.
А так он выглядит:
image
Вот и все, собственно говоря =)

Комментариев нет:

Отправить комментарий