@@ -18,44 +18,44 @@ Unity 里面要实现 sharedCanvas 的绘制,核心在于 hook Unity 的渲染
18
18
3 . 在需要绘制排行榜的时候,将原本要绘制的 WebGLObject 替换成通过 sharedCanvas 创建而来的 WebGLObject;
19
19
4 . 在关闭排行榜的时候,停止步骤 3 的 hook;
20
20
21
+ ** 重点更新:**
22
+ ** 我们在基础库3.5.5版本支持了 screenCanvas 类型的开放数据域**
23
+ * 区别:SharedCanvas变成了在屏类型(screenCanvas),不再需要依赖游戏域循环刷新渲染
24
+ * 好处:减少由于渲染离屏Canvas产生的干扰问题
25
+ * 如何实现:
26
+ ``` CSharp
27
+ WX .GetOpenDataContext (new OpenDataContextOption
28
+ {
29
+ sharedCanvasMode = CanvasType .ScreenCanvas
30
+ })
31
+ ```
32
+
21
33
## 详细步骤
22
34
### 1、设置占位纹理
23
35
在游戏需要展示的地方创建一个 RawImage,其中 Texture 属性自己选择透明的图片即可,后续展示时会被动态替换。因为unity纹理与 Web 的绘制存在倒立的差异,请将先将 rotation的x 设置为180,即让 ` UI控件延X轴旋转180度 ` 再调整到游戏中合适的位置,如下图
24
36
25
37
![ avatar] ( ../image/o2.png )
26
38
27
- ### 2、调用SDK的API
28
- #### 2.1 在需要展示的地方调用,` WX.ShowOpenData `
39
+ ### 2、调用SDK的API
40
+ #### 2.1 先初始化开放数据域类型
41
+ 初始化后canvas类型无法修改,只初始化一次并保存即可
29
42
``` CSharp
30
- WX .ShowOpenData (rawImage .texture , x , y , width , height );
31
- ```
32
- 其中 :
33
- * x : 占位区域对应屏幕左上角横坐标
34
- * y : 占位区域对应屏幕左上角纵坐标,注意左上角为(0,0)
35
- * width : 占位区域对应的宽度
36
- * height : 占位区域对应的高度
37
-
38
- WX.ShowOpenData 最终会调用 minigame/unity-sdk/open-data.js 内的 WXShowOpenData 方法,核心是三个作用:
39
- 1 . 调用 wx.getOpenDataContext,这会触发开放数据域的初始化,也就是 open-data 文件夹下的代码在开放数据域初始化之后才能够执行;
40
- 2 . 给开放数据域侧抛一个事件,告知开放域去执行数据拉取和渲染操作,对于 WXRender 的处理没有任何要求,开放数据域甚至可以忽略这个事件;
41
- ``` js
42
- openDataContext .postMessage ({
43
- type: " WXRender" ,
44
- x: x,
45
- y: y,
46
- width: width,
47
- height: height,
48
- devicePixelRatio: window .devicePixelRatio ,
49
- });
43
+ void InitOpenDataContext ()
44
+ {
45
+ if (openDataContext == null )
46
+ {
47
+ WXOpenDataContext openDataContext = WX .GetOpenDataContext (new OpenDataContextOption
48
+ {
49
+ sharedCanvasMode = selectedCanvasType
50
+ });
51
+ }
52
+ }
50
53
```
51
- 3 . 开始 hook Unity 的渲染,原本的 RawImage 就会被替换成 sharedCanvas 的纹理。
52
-
53
- #### 2.2 需要关闭时则调用,` WX.HideOpenData `
54
- 这一步非常重要,如果仅仅在 Unity 侧隐藏了 RawImage 而没有调用 WX.HideOpenData,很可能导致排行榜关闭之后文理错乱,比如有些地方的纹理变成了排行榜对应的纹理。
54
+ ` CanvasType ` 有` OffScreenCanvas ` 和` ScreenCanvas ` 两种类型,` OffScreenCanvas ` 为旧版本,优先推进使用` ScreenCanvas `
55
55
56
- #### 2.3 通过 PostMessage 向开放数据域传递消息
56
+ #### 2.2 通过 PostMessage 向开放数据域传递消息
57
57
58
- 如果需要在 Unity 中向开放域页面传递数据,可以调用` WX.GetOpenDataContext ` ,如下代码:
58
+ 如果需要在 Unity 中向开放域页面传递数据,可以调用` openDataContext.PostMessage ` ,如下代码:
59
59
``` CSharp
60
60
[System .Serializable ]
61
61
public class OpenDataMessage
@@ -67,9 +67,9 @@ public class OpenDataMessage
67
67
OpenDataMessage msgData = new OpenDataMessage ();
68
68
msgData .type = " showFriendsRank" ;
69
69
string msg = JsonUtility .ToJson (msgData );
70
- WX . GetOpenDataContext () .PostMessage (msg );
70
+ openDataContext .PostMessage (msg );
71
71
```
72
- 开放域JS代码可以通过 :
72
+ 开放数据域JS代码可以按照以下实现 :
73
73
``` js
74
74
wx .onMessage (data => {
75
75
console .log (" [WX OpenData] onMessage" , data);
@@ -88,6 +88,34 @@ wx.onMessage(data => {
88
88
}
89
89
});
90
90
```
91
+ #### 2.3 在需要展示的地方调用,` WX.ShowOpenData `
92
+ ``` CSharp
93
+ WX .ShowOpenData (rawImage .texture , x , y , width , height );
94
+ ```
95
+ 其中 :
96
+ * x : 占位区域对应屏幕左上角横坐标
97
+ * y : 占位区域对应屏幕左上角纵坐标,注意左上角为(0,0)
98
+ * width : 占位区域对应的宽度
99
+ * height : 占位区域对应的高度
100
+
101
+ WX.ShowOpenData 最终会调用 minigame/unity-sdk/open-data.js 内的 WXShowOpenData 方法,核心是三个作用:
102
+ 1 . 调用 wx.getOpenDataContext,这会触发开放数据域的初始化,也就是 open-data 文件夹下的代码在开放数据域初始化之后才能够执行;
103
+ 2 . 给开放数据域侧抛一个事件,告知开放域去执行数据拉取和渲染操作,对于 WXRender 的处理没有任何要求,开放数据域甚至可以忽略这个事件;
104
+ ``` js
105
+ // 注意,该代码是Unity模板中的代码,无需开发者实现
106
+ openDataContext .postMessage ({
107
+ type: " WXRender" ,
108
+ x: x,
109
+ y: y,
110
+ width: width,
111
+ height: height,
112
+ devicePixelRatio: window .devicePixelRatio ,
113
+ });
114
+ ```
115
+ 3 . 如果是` OffScreenCanvas ` 模式,则会开始 hook Unity 的渲染,原本的 RawImage 就会被替换成 sharedCanvas 的纹理。如果是` ScreenCanvas ` 模式,则会修改宽高并直接在屏渲染
116
+
117
+ #### 2.4 需要关闭开放数据域时则调用,` WX.HideOpenData `
118
+ 如果是` OffScreenCanvas ` 模式,这一步非常重要,如果仅仅在 Unity 侧隐藏了 RawImage 而没有调用 WX.HideOpenData,很可能导致排行榜关闭之后纹理错乱,比如有些地方的纹理变成了排行榜对应的纹理。
91
119
92
120
### 3、导出选项勾选使用好友关系链
93
121
这一步会做两个事情:
@@ -137,7 +165,7 @@ OpenDataMessage msgData = new OpenDataMessage();
137
165
msgData .type = " showFriendsRank" ;
138
166
139
167
string msg = JsonUtility .ToJson (msgData );
140
- WX . GetOpenDataContext () .PostMessage (msg );
168
+ openDataContext .PostMessage (msg );
141
169
```
142
170
143
171
3 . 开放数据域监听相应事件,展示群排行,详见 open-data。
@@ -146,6 +174,7 @@ WX.GetOpenDataContext().PostMessage(msg);
146
174
147
175
148
176
<img src =" ../image/opendata/demo1.jpeg " width =" 30% " /> <img src =" ../image/opendata/demo2.jpeg " width =" 30% " /> <img src =" ../image/opendata/demo3.jpeg " width =" 30% " />
177
+
149
178
#### 5.2 群好友排行榜
150
179
1 . 为了使用群排行榜,需要调用 WX.UpdateShareMenu 设置分享菜单
151
180
``` CSharp
@@ -179,14 +208,13 @@ WX.OnShow((OnShowCallbackResult res) =>
179
208
180
209
if (! string .IsNullOrEmpty (shareTicket ) && query != null && query [" minigame_action" ] == " show_group_list" )
181
210
{
211
+ InitOpenDataContext ();
212
+ ShowOpenData ();
182
213
OpenDataMessage msgData = new OpenDataMessage ();
183
214
msgData .type = " showGroupFriendsRank" ;
184
215
msgData .shareTicket = shareTicket ;
185
-
186
216
string msg = JsonUtility .ToJson (msgData );
187
-
188
- ShowOpenData ();
189
- WX .GetOpenDataContext ().PostMessage (msg );
217
+ openDataContext .PostMessage (msg );
190
218
}
191
219
});
192
220
```
@@ -195,22 +223,19 @@ WX.OnShow((OnShowCallbackResult res) =>
195
223
196
224
整体流程示意:
197
225
198
-
199
226
<img src =" ../image/opendata/demo6.jpeg " width =" 24% " /> <img src =" ../image/opendata/demo7.jpeg " width =" 24% " /> <img src =" ../image/opendata/demo4.jpeg " width =" 24% " /> <img src =" ../image/opendata/demo5.jpeg " width =" 24% " />
200
227
201
-
202
228
## 常见问题QA
203
229
** Q1. 为什么第一次调用 WX.ShowOpenData 之后画面先黑一下再展示排行榜?**
204
230
205
231
206
- A1. WX.ShowOpenData 在 openDataContext.postMessage WXRender 的事件之后立马就会开始 hook Unity 的渲染,如果开放数据域在监听到 WXRender 事件之后没有任何渲染行为,那么 sharedCanvas 纹理就还没有准备好,Unity 侧就可能出现黑一下的情况,解决办法是保证监听到 WXRender 事件之后有个同步的渲染行为,比如绘制个文案”好友数据加载中..."。
232
+ A1. ` WX.ShowOpenData ` 在 ` openDataContext.postMessage ` ` WXRender ` 的事件之后立马就会开始 hook Unity 的渲染,如果开放数据域在监听到 ` WXRender ` 事件之后没有任何渲染行为,那么 sharedCanvas 纹理就还没有准备好,Unity 侧就可能出现黑一下的情况,解决办法是保证监听到 ` WXRender ` 事件之后有个同步的渲染行为,比如绘制个文案”好友数据加载中..."。
207
233
208
234
** Q2. 为什么我关闭排行榜之后界面上有些问题错乱了?**
209
235
210
236
211
- A2. 基本上只可能是没调用 WX.HideOpenData,建议 WX.HideOpenData 打些日志来辅佐排查。
237
+ A2. 基本上只可能是没调用 ` WX.HideOpenData ` ,建议 ` WX.HideOpenData ` 打些日志来辅佐排查。
212
238
213
239
** Q3. 为什么开放数据域滚动事件不生效?**
214
240
215
-
216
241
A4. ` WX.ShowOpenData(rawImage.texture, x, y, width, height) ` 的后面四个参数,核心目的是告诉开放数据域 sharedCanvas 最终被绘制在了屏幕的位置和尺寸,开放数据域才能够正确处理事件监听,遇到事件不生效的问题,首先排查传进来的参数是否符合预期,比如 x / y 不应该是负数。
0 commit comments