Wizard-генератор кода для RPC (юнити сеть)

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

Wizard-генератор кода для RPC (юнити сеть)

Сообщение gnoblin 30 июл 2011, 20:40

Я давно мечтал о том чтобы юнити сама писала за меня код...

1. Натыркиваем визард из меню "RPC/RPC Wizard (OwnerEventRPCWithoutParameters)".
2. Вводим имя метода (например, KickAss), тыркаем Create.
3. Жмякаем Ctrl+V в нужном скрипте,
получаем:
#region KickAss
/// <summary>
/// KickAss
/// </summary>
//это событие инициируется с оунера (не по сети)
void Owner_KickAss()
{
networkView.RPC("CreatorRPC_KickAss", RPCMode.Server);
}
[RPC]
void CreatorRPC_KickAss()
{
networkView.RPC("OthersRPC_KickAss", RPCMode.Others);
}
[RPC]
void OthersRPC_KickAss()
{
Debug.Log("OthersRPC_KickAss");
}
#endregion


Эдитор скрипт вот:
Синтаксис:
Используется csharp
using UnityEditor;
using UnityEngine;

//пока рпц без параметров!
public class RPCWizard : ScriptableWizard
{
    public string method_name = "GenericMethod";

    [MenuItem("RPC/RPC Wizard (OwnerEventRPCWithoutParameters)")]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard<RPCWizard>("Create RPC Code", "Create");
    }
    void OnWizardCreate()
    {
        string result = Get_OwnerEventRPCWithoutParameters_FromTemplate(method_name);
        //Debug.Log(result);
        EditorGUIUtility.systemCopyBuffer = result;
    }

    void OnWizardUpdate()
    {
        helpString = "Please set the name of the RPC!";
    }

    static string Get_OwnerEventRPCWithoutParameters_FromTemplate(string name)
    {
        char w = '"';
        string str = "";
        str += @"
                #region "
+name+@"
                /// <summary>
                /// "
+name+@"
                /// </summary>
                //это событие инициируется с оунера (не по сети)
                void Owner_"
+name+@"()
                {
                    networkView.RPC("
+w+"CreatorRPC_"+name+w+@", RPCMode.Server);
                }
                [RPC]
                void CreatorRPC_"
+name+@"()
                {
                    networkView.RPC("
+w+"OthersRPC_"+name+w+@", RPCMode.Others);
                }
                [RPC]
                void OthersRPC_"
+name+@"()
                {
                    Debug.Log("
+w+"OthersRPC_"+name+w+@");
                }
                #endregion"
;
        return str;
    }
}


Визард достаточно специфический :).

Хочу еще добавить параметров и сделать кнопочку которая будет генерить чуть другой код (без первого метода).
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Wizard-генератор кода для RPC (юнити сеть)

Сообщение gnoblin 30 июл 2011, 21:23

Вариант визарда для рпц с задаваемыми параметрами выдает вот что:

#region GenericMethod
/// <summary>
/// GenericMethod
/// </summary>
//это событие инициируется с оунера (не по сети)
void Owner_GenericMethod(bool on, int num, string label)
{
networkView.RPC("CreatorRPC_GenericMethod", RPCMode.Server, on, num, label);
}
[RPC]
void CreatorRPC_GenericMethod(bool on, int num, string label)
{
networkView.RPC("OthersRPC_GenericMethod", RPCMode.Others, on, num, label);
}
[RPC]
void OthersRPC_GenericMethod(bool on, int num, string label)
{
Debug.Log("OthersRPC_GenericMethod*** , on, num, label");
}
#endregion


Сам эдитор скрипт вот:
Синтаксис:
Используется csharp
using UnityEditor;
using UnityEngine;

public class RPCWizard_OwnerEventRPCWithParameters : ScriptableWizard
{
    public string method_name = "GenericMethod";
    public ParamItem[] parameters = new ParamItem[1];

    [System.Serializable]
    public class ParamItem
    {
        public string type = "bool";
        public string name = "on";
    }

    [MenuItem("RPC/RPC Wizard (OwnerEventRPCWithParameters)")]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard<RPCWizard_OwnerEventRPCWithParameters>("Create RPC Code", "Create");
    }
    void OnWizardCreate()
    {
        string result = Get_OwnerEventRPCWithParameters_FromTemplate(method_name, parameters);
        //Debug.Log(result);
        EditorGUIUtility.systemCopyBuffer = result;
    }

    void OnWizardUpdate()
    {
        helpString = "Please set the name of the RPC and parameters!";
    }

    static string Get_OwnerEventRPCWithParameters_FromTemplate(string name, ParamItem[] p)
    {
        char w = '"';
        string str = "";

        string params_for_method = "";
        for (int i = 0; i < p.Length; i++)
        {
            string item = p[i].type + " " + p[i].name;
            params_for_method += item;
            if (i != p.Length - 1)
            {
                params_for_method += ", ";
            }
        }

        string params_for_call = ", ";
        for (int i = 0; i < p.Length; i++)
        {
            params_for_call += p[i].name;
            if (i != p.Length - 1)
            {
                params_for_call += ", ";
            }
        }

        str += @"
                #region "
+ name + @"
                /// <summary>
                /// "
+ name + @"
                /// </summary>
                //это событие инициируется с оунера (не по сети)
                void Owner_"
+ name + "(" + params_for_method + ")" + @"
                {
                    networkView.RPC("
+ w + "CreatorRPC_" + name + w + @", RPCMode.Server" + params_for_call + @");
                }
                [RPC]
                void CreatorRPC_"
+ name + "(" + params_for_method + ")" + @"
                {
                    networkView.RPC("
+ w + "OthersRPC_" + name + w + @", RPCMode.Others" + params_for_call + @");
                }
                [RPC]
                void OthersRPC_"
+ name + "(" + params_for_method + ")" + @"
                {
                    Debug.Log("
+ w + "OthersRPC_" + name + "*** " + params_for_call + w + @");
                }
                #endregion"
;
        return str;
    }
}
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2