inversionhourglass / Rougamo

Compile-time AOP component. Works with any method, whether it is async or sync, instance or static. Uses an aspectj-like pattern to match methods.
MIT License
393 stars 47 forks source link

可以提供一个unity的例子吗? #46

Closed gaozhou closed 9 months ago

inversionhourglass commented 1 year ago

没做过unity开发,你按文档的步骤操作出现什么问题了?最简单的步骤就是:

  1. 安装Nuget
  2. 定义自己的MoAttribute
  3. 将自己定义的MoAttribute应用到方法上
gaozhou commented 1 year ago

没做过unity开发,你按文档的步骤操作出现什么问题了?最简单的步骤就是:

  1. 安装Nuget
  2. 定义自己的MoAttribute
  3. 将自己定义的MoAttribute应用到方法上

使用NuGet For Unity 安装rougamo.fody,没效果。

inversionhourglass commented 1 year ago

应用Attribute的项目有没有直接引用Rougamo.Fody,间接依赖是不行的。如果是直接引用的,你按你现在使用的方式,建一个unity的简单项目放在github上,然后把地址发我,我本地看看

gaozhou commented 1 year ago

应用Attribute的项目有没有直接引用Rougamo.Fody,间接依赖是不行的。如果是直接引用的,你按你现在使用的方式,建一个unity的简单项目放在github上,然后把地址发我,我本地看看

https://github.com/gaozhou/rougamo.unity.git unity 版本 2022.3.11f1 image image

inversionhourglass commented 1 year ago

我还以为unity使用visual studio开发的,好吧,这样的话我要研究一下怎么编译运行了

gaozhou commented 12 months ago

我还以为unity使用visual studio开发的,好吧,这样的话我要研究一下怎么编译运行了

要用UnityEditor 打开工程,然后就可以使用visual studio开发了,也可以使用rider 你可以参考这个工程,也是使用了 Fody,但是没有rougamo好用 git@github.com:ByronMayne/Weaver.git

inversionhourglass commented 12 months ago

我看了下你发的这个项目,他没有直接使用fody,他是使用Mono.Cecil的,他的意思应该是他的代码实现很大程度是参考fody的。

目前来看肉夹馍无法支持unity,fody是在msbuild中添加了一个任务,在编译后执行编织操作,但unity有自己的编译管道,无法与msbuild集成,所以导致fody无法生效,fody系列的组件,包括肉夹馍都无法在unity中使用。

我找到了一个unity集成msbuil的项目 https://github.com/microsoft/MSBuildForUnity ,但是在你给的项目中编译都不通过,这个项目更新比较少,不确定是不是你测试项目的unity版本太高不兼容。我对unity还是不熟,你可以按照这个项目的指示试一下,看能不能行,降低一下unity的版本再测试一下看看

gaozhou commented 12 months ago

https://github.com/vovgou/loxodon-framework 这个repo里面给unity接入了fody,你看看rougamo能不能接入进去呢? https://github.com/vovgou/loxodon-framework/blob/master/Loxodon.Framework.Fody/README_CN.md image

gaozhou commented 12 months ago

我接进去了,可以使用,但是每一帧都会产生344B的gc,能不能优化一下,内存分配,改成池化内存,或者改成struct

inversionhourglass commented 12 months ago

具体接入的方式方便写篇文章或出个文档吗,之前也有人问unity的接入方式

优化方面,后续我先改一般结构体的看看效果

gaozhou commented 11 months ago

具体接入的方式方便写篇文章或出个文档吗,之前也有人问unity的接入方式

优化方面,后续我先改一般结构体的看看效果

我还在测试,目前还有点问题,不过按照这个思路应该是ok的。

inversionhourglass commented 9 months ago

我接进去了,可以使用,但是每一帧都会产生344B的gc,能不能优化一下,内存分配,改成池化内存,或者改成struct

我这边进行了优化,有空的话可以更新到2.2.0最新试用版本测试一下,或者告知一下你使用的framework版本(不知道unity是否需要选择framework版本)以及观测GC的方式。

更新版本后还没有完成优化,需要进行以下操作:

// 1. 之前一般是直接继承MoAttribute,现在改定义结构体实现IMo接口
struct ValueMo : IMo
{
  // 实现接口,完成AOP操作
}

// 2. 之前直接应用Attribute到类或方法的方式改为使用RougamoAttribute+定义的结构体
[Rougamo(typeof(ValueMo))]
class Cls
{
}

// 3. 如果没有使用到MethodContext.Mos属性,在实现IMo接口时,MethodContextOmits属性可以指定为Omit.Mos
public Omit MethodContextOmits => Omit.Mos;

// 4. 如果没有使用到MethodContext.Arguments属性,在实现IMo接口时,MethodContextOmits属性可以指定为Omit.Arguments,同时Features属性需要排除0x10和0x200
public Omit MethodContextOmits => Omit.Arguments;
public Feature Features => (All ^ 0x210) & All;