zoukankan      html  css  js  c++  java
  • Unity项目接入应用宝SDK实现截图功能

    Unity项目接入应用宝SDK实现截图功能


    问题由来

    • 点击应用宝悬浮窗

    • 如图所示 左下角有一个截图按钮

    需要解决那些问题

    • 截图信息需要由游戏引擎提供

    • SDK获取截图信息为同步 但是Unity引擎没有提供同步接口

    • 如何防止测试同学和智障不停的点击截图按钮

    点击截图按钮程序流程

    • SDK调用caputureImage方法获取截图信息

    • 在caputureImage方法中通知Unity截图

    • 在caputureImage方法中等待截图信息

    • Unity截图完成后发送给安卓层

    • 返回数据给SDK

    • 实现一个缓存5秒截图信息功能

    unity代码

    • 安卓层通知Unity截图接口
    public void CaputureImage()
    {
        StartCoroutine(Caputure());
    }
    
    • Unity获取截图信息返回给安卓层
    IEnumerator Caputure()
    {
    	//等待当前帧渲染完成
        yield return new WaitForEndOfFrame();
    
        // 先创建一个的空纹理,大小可根据实现需要来设置
        Texture2D screenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
    
        // 读取屏幕像素信息并存储为纹理数据,
        screenShot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        screenShot.Apply();
    
        // 然后将这些纹理数据,成一个png图片文件
        byte[] bytes = screenShot.EncodeToPNG();
    
    	//把数据返回给安卓层
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("SendScreenshotData", bytes);
        }
    }
    

    Android代码

    • 定义Bitmap变量
    • 定义Timer定时
    Bitmap bitmap = null;
    Timer timer = null;
    
    • 接受Unity发送过来的截图信息并转换为Bitmap类型
    public void SendScreenshotData(byte[] bytes)
    {
        bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }
    
    • SDK截图回调
    // 游戏助手内截屏分享功能
    YSDKApi.setScreenCapturer(new IScreenImageCapturer() {
    	@Override
    	public Bitmap caputureImage() {
    		
    		//如果没有缓存则通知Unity截图
    		if (bitmap == null) {
    
    			UnityPlayer.UnitySendMessage("Directional Light", "CaputureImage", "");
    		}
    
    	    //强行延迟等待截图数据
    		while (bitmap == null) {
    
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    
    		//开始一个5秒定时器
    		if (timer == null) {
    
    			timer = new Timer();
    
    			timer.schedule(new TimerTask() {
    				@Override
    				public void run() {
    					
    					//删除缓存和定时器
    					bitmap = null;
    
    					timer = null;
    				}
    			}, 5000);
    		}
    
    		return bitmap;
    
    	}
    });
    

    如果你有更好的思路和解决方法,也请多多指教

  • 相关阅读:
    模板 无源汇上下界可行流 loj115
    ICPC2018JiaozuoE Resistors in Parallel 高精度 数论
    hdu 2255 奔小康赚大钱 最佳匹配 KM算法
    ICPC2018Beijing 现场赛D Frog and Portal 构造
    codeforce 1175E Minimal Segment Cover ST表 倍增思想
    ICPC2018Jiaozuo 现场赛H Can You Solve the Harder Problem? 后缀数组 树上差分 ST表 口胡题解
    luogu P1966 火柴排队 树状数组 逆序对 离散化
    luogu P1970 花匠 贪心
    luogu P1967 货车运输 最大生成树 倍增LCA
    luogu P1315 观光公交 贪心
  • 原文地址:https://www.cnblogs.com/zouqiang/p/10241378.html
Copyright © 2011-2022 走看看