1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Tencent-InjectFix

Клонировать/Скачать
user_manual_en.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 02:20 f41209d

IFix Manual

[IFix.Patch]

Использование:

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

Применение:

Эту метку можно использовать только для функций, просто отметьте эту метку непосредственно на функции, которую нужно изменить.

Пример:

Эта функция изначально предназначалась для сложения двух значений, но теперь она работает неправильно, поэтому вы можете пометить функцию как [IFix.Patch] и изменить её.

public int Add(int a,int b)
{
    return a*b;
}
[IFix.Patch]
public int Add(int a,int b)
{
    return a+b;
}

[IFix.Interpret]

Использование:

Используется на этапе исправления, добавление кода. На этапе исправления у людей всё ещё есть новые требования. Если вы хотите добавить функцию или класс, вы можете использовать метку [IFix.Interpret] для реализации этого.

Применение:

Эту метку можно использовать в свойствах, функциях и классах. Просто отметьте эту метку прямо на добавляемом коде.

Пример:

Добавление нового свойства

private string name;//Поле name является собственным

public string Name
{
    [IFix.Interpret]
    set
    {
        name = value;    
    }
    [IFix.Interpret]
    get
    {
        return name;
    }
}

Добавление новой функции

[IFix.Interpret]
public int Sub(int a,int b)
{
    return a-b;
}

Добавление нового класса

[IFix.Interpret]
public class NewClass
{
    ...
}

[IFix.CustomBridge]

Использование:

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

Когда мне нужно его использовать?

  • Исправить код, чтобы назначить замыкание переменной делегата;
  • Корутина Unity, которая исправляет код, использует yield return;
  • Добавить функцию и назначить её переменной делегата;
  • Добавить новый класс и назначить его переменной собственного интерфейса;
  • Добавленная функция, использующая yield return;
Применение:

Эту метку можно использовать только в классе. Где-то в программе людей напишите статический класс со статическим полем, значение которого представляет собой тип коллекции интерфейса и делегата.

Пример:

Добавить новый класс, который реализует интерфейс.

public interface ISubSystem
{
    bool running { get; }
    void Print();
}

[IFix.Interpret]
public class SubSystem : ISubSystem
{
    public bool running { get { return true; } }
    public void Print()
    {
        UnityEngine.Debug.Log("SubSystem1.Print");
    }
}

Добавить новую функцию (или корутину Unity с фиксированным кодом [IFix.Patch]), используя yield return.

[IFix.Interpret]
public IEnumerator TestInterface()
{
    yield return new WaitForSeconds(1);
    UnityEngine.Debug.Log("wait one second");
}

Добавить новую функцию (или исправить код [IFix.Patch]) и назначить её переменной делегата.

public class Test 
{
    public delegate int MyDelegate(int a, int b);
    
    [IFix.Interpret]
    public MyDelegate TestDelegate()
    {
        return (a,b) => a + b;
    }
}
[IFix.CustomBridge]
public static class AdditionalBridge
{
    static List<Type> bridge = new List<Type>()
    {
        typeof(ISubSystem),
        typeof(IEnumerator),
        typeof(Test.MyDelegate)
    };
}

[Configure]

Использование:

Используется на этапе внедрения, класс конфигурации, в котором хранятся некоторые вещи, которые необходимо внедрить или отфильтровать во время внедрения.

Применение:

Метку можно использовать только в классах, класс должен находиться в папке Editor.

Пример:
[Configure]
public class TestCfg
{
    
}

[IFix]

Использование:

Используется на этапе внедрения, используется для хранения коллекции всех классов, которые, по вашему мнению, могут потребовать исправления в будущем. Эта метка связана с [IFix.Patch], потому что, если вы обнаружите, что функция нуждается в исправлении, просто пометьте метку [IFix.Patch], но предпосылка заключается в том, что класс функции, которая должна быть исправлена, должен находиться под [IFix].

Применение:

Эту метку можно использовать только в свойствах, статическом свойстве в классе Configure, get. Это коллекция всех классов функций, которые, возможно, потребуется исправить.

Пример:

Я думаю, что функции в классе Test могут быть неправильными, поэтому поместите их под метку [IFix]. Когда нужно будет исправить функцию Add в классе Test, просто пометьте её и модифицируйте.

[Configure]
public class TestCfg
{
    [IFix]
    static IEnumerable<Type> hotfix
    {
        get
        {
            return new List<Type>()
            {
                typeof(Test)
            };
        }
    }
}

public class Test
{
    [IFix.Patch]
    public int Add(int a,int b)
    {
        return a+b;
    }
}

[Filter]

Используется на этапе внедрения для хранения того, что вы хотите отфильтровать. На этапе внедрения все значения свойств под меткой [IFix] будут внедрены в код адаптации, но если вы не хотите внедрять функцию, вы можете использовать эту метку для фильтрации.

Метка [Filter] может использоваться только для функций — статической функции в классе Configure.

Пример:

Я думаю, что функции в классе Test могут быть неправильными, так что поместите их под метку [IFix]. Когда нужно будет исправить функцию Add в классе Test, просто пометьте её и модифицируйте.

public class Test
{
    [IFix.Patch]
    public int Add(int a,int b)
    {
        return a+b;
    }
    public int Sub(int a,int b)
    {
        return a-b;
    }    
    public int Div(int a,int b)
    {
        return a/b;
    }
    public int Mult(int a,int b)
    {
        return a*b;
    }
}

[Configure]
public class TestCfg
{
    [IFix]
    static IEnumerable<Type> hotfix
    {
        get
        {
            return new List<Type>()
            {
                typeof(Test)
            };
        }
    }
    [Filter]
    static bool Filter(System.Reflection.MethodInfo methodInfo)
    {
        return methodInfo.DeclaringType.FullName == "Test" 
            && (methodInfo.Name == "Div" || methodInfo.Name == "Mult");
    }
}

Меры предосторожности:

  • Если вы считаете, что функция определённого класса может потребовать исправления, вы должны поместить класс в статическое поле [IFix] класса [Configure] в каталоге Editor, после чего вы сможете выполнить [IFix.Patch] для определённой функции.
  • Когда речь идёт об интерфейсе и делегате, если вы адаптируете класс виртуальной машины к собственному интерфейсу или адаптируете функцию виртуальной машины к собственному делегату, вы должны поместить его в статическое поле класса [IFix.CustomBridge].
  • Класс, помеченный как [Configure], должен быть размещён в каталоге Editor.
  • Метки [IFix], [Filter] должны быть размещены в классе, помеченном как [Configure].
  • В [IFix.Patch] не поддерживается исправление универсальных функций, восстановление конструкторов или добавление полей в собственные классы.
  • В [IFix.Interpret] новые классы не поддерживаются для наследования собственных классов, а также новые классы не поддерживаются как универсальные классы.

Заключение:

Метка Этап использования Использование Применение
[IFix.Patch] Исправление Исправить функцию Может быть размещена только на функциях
[IFix.Interpret] Исправление Новые свойства, функции, типы Может быть размещено на свойствах, функциях, типах
[IFix.CustomBridge] Внедрение Мост интерфейса и делегата Может быть размещен только в отдельном статическом классе. Класс хранилища виртуальной машины адаптируется к собственному интерфейсу, или функция виртуальной машины адаптируется к собственному делегату
[Configure] Внедрение Конфигурационный класс Может быть размещён только в классе, который написан отдельно и хранится в каталоге Editor
[IFix] Внедрение Коллекция классов, которые могут потребовать исправления Функция Можно разместить только в статическом свойстве класса [Configure]
:-- :--:
[Filter] inject Функции, которые не должны быть внедрены Можно разместить только в статической функции класса [Configure]

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Tencent-InjectFix.git
git@api.gitlife.ru:oschina-mirror/Tencent-InjectFix.git
oschina-mirror
Tencent-InjectFix
Tencent-InjectFix
master