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的底层强制绘制了一层背景。

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值