unity与Android 原生

Unity 打包成aar,作为一个view 在Android原生中引用,这个时候会发现设置不会透明。

UnityPlayer 作为暴露在外面的View 继承与 FrameLayout

public class UnityPlayer extends FrameLayout {
    public static Activity currentActivity = null;
    private boolean c = false;
    private boolean d = true;
    private h e = new h();
    private final ConcurrentLinkedQueue f = new ConcurrentLinkedQueue();
    private BroadcastReceiver g = null;
    UnityPlayer.c a = new UnityPlayer.c(0);


绘制是基于SufaceView 的,使用的native方法

this.l = new SurfaceView(var1);
this.l.getHolder().setFormat(2);
this.l.getHolder().addCallback(new Callback() {
    public final void surfaceCreated(SurfaceHolder var1) {
        UnityPlayer.a(UnityPlayer.this, var1.getSurface());
    }

    public final void surfaceChanged(SurfaceHolder var1, int var2, int var3, int var4) {
        UnityPlayer.a(UnityPlayer.this, var1.getSurface());
    }

    public final void surfaceDestroyed(SurfaceHolder var1) {
        UnityPlayer.a(UnityPlayer.this, (Surface)null);
    }
});
this.l.setFocusable(true);

一般的话如果需要SufaceView 透明只需设置 

mSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT); 
mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
但是 canvas 现在无法设置,unity的alpha通道不起作用,设置  PixelFormat.argb8888  也不起作用。

Unity本质上对于原生的Android app来说就是一个单纯的View级别,然后主要绘制在于surfaceview上的绘制,所以处理透明就是处理对于surfaceView 透明处理。但是设置完成之后会发现无法实现。是因为在unity的底层强制绘制了一层背景。

扫描二维码关注公众号,回复: 6746488 查看本文章

所以咱们曲线救国需要用TextureView 代替 SufaceView 利用反射机制 获取 sufaceview 的callback交给 texture 使用,然后把 sufaceview 宽高设置为0。更改unity的so文件  libunity.so 来去掉强制绘制的那一层背景(工具我用 Hopper Disassembler


猜你喜欢

转载自blog.csdn.net/longfei1986/article/details/78064232