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;
    
    	}
    });
    

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

  • 相关阅读:
    CentOS6、CentOS7配置Base源和epel源
    谢孟媛_初级英文文法_讲义!全!!
    java动态代理实现与原理详细分析
    聊聊spring的那些扩展机制
    springboot+druid+mybatis plus的多数据源配置
    基于CAS实现SSO单点登录
    mybatisPlus整理
    Python实现1-100之和
    python接口自动化--get请求
    使用fiddler进行接口测试
  • 原文地址:https://www.cnblogs.com/zouqiang/p/10241378.html
Copyright © 2011-2022 走看看