-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1264 lines (896 loc) · 96.5 KB
/
index.html
File metadata and controls
1264 lines (896 loc) · 96.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
<link rel="mask-icon" href="/images/logo.svg" color="#222">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.15.4/css/all.min.css" integrity="sha256-mUZM63G8m73Mcidfrv5E+Y61y7a12O5mW4ezU3bxqW4=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
<script class="next-config" data-name="main" type="application/json">{"hostname":"example.com","root":"/","images":"/images","scheme":"Muse","version":"8.7.1","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":false,"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"Searching...","empty":"We didn't find any results for the search: ${query}","hits_time":"${hits} results found in ${time} ms","hits":"${hits} results found"}}</script><script src="/js/config.js"></script>
<meta property="og:type" content="website">
<meta property="og:title" content="OK">
<meta property="og:url" content="http://example.com/index.html">
<meta property="og:site_name" content="OK">
<meta property="og:locale" content="en_US">
<meta property="article:author" content="冲击波">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="http://example.com/">
<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":true,"isPost":false,"lang":"en","comments":"","permalink":"","path":"index.html","title":""}</script>
<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>OK</title>
<noscript>
<link rel="stylesheet" href="/css/noscript.css">
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
<div class="headband"></div>
<main class="main">
<header class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-container">
<div class="site-nav-toggle">
<div class="toggle" aria-label="Toggle navigation bar" role="button">
</div>
</div>
<div class="site-meta">
<a href="/" class="brand" rel="start">
<i class="logo-line"></i>
<h1 class="site-title">OK</h1>
<i class="logo-line"></i>
</a>
</div>
<div class="site-nav-right">
<div class="toggle popup-trigger">
</div>
</div>
</div>
</div>
<div class="toggle sidebar-toggle" role="button">
<span class="toggle-line"></span>
<span class="toggle-line"></span>
<span class="toggle-line"></span>
</div>
<aside class="sidebar">
<div class="sidebar-inner sidebar-overview-active">
<ul class="sidebar-nav">
<li class="sidebar-nav-toc">
Table of Contents
</li>
<li class="sidebar-nav-overview">
Overview
</li>
</ul>
<div class="sidebar-panel-container">
<!--noindex-->
<div class="post-toc-wrap sidebar-panel">
</div>
<!--/noindex-->
<div class="site-overview-wrap sidebar-panel">
<div class="site-overview">
<div class="site-author site-overview-item animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
<p class="site-author-name" itemprop="name">冲击波</p>
<div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap site-overview-item animated">
<nav class="site-state">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">203</span>
<span class="site-state-item-name">posts</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">10</span>
<span class="site-state-item-name">tags</span></a>
</div>
</nav>
</div>
</div>
</div>
</div>
</div>
</aside>
<div class="sidebar-dimmer"></div>
</header>
<div class="back-to-top" role="button" aria-label="Back to top">
<i class="fa fa-arrow-up"></i>
<span>0%</span>
</div>
<noscript>
<div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>
<div class="main-inner index posts-expand">
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/03/25/%E9%A6%96%E9%A1%B5/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/03/25/%E9%A6%96%E9%A1%B5/" class="post-title-link" itemprop="url">首页</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-03-25 20:58:22 / Modified: 21:02:55" itemprop="dateCreated datePublished" datetime="2024-03-25T20:58:22+08:00">2024-03-25</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<img src="/2024/03/25/%E9%A6%96%E9%A1%B5/1.jpg" class>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/07/01/Shader/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/07/01/Shader/" class="post-title-link" itemprop="url">Shader</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-07-01 23:12:40 / Modified: 23:14:15" itemprop="dateCreated datePublished" datetime="2024-07-01T23:12:40+08:00">2024-07-01</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="glsl-语法">GLSL 语法</h1>
<p>用来在 <strong>OpenGL</strong> 中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的 <strong>GPU</strong>上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。</p>
<p><strong>GLSL</strong> 其使用 <strong>C</strong> 语言作为基础高阶着色语言,避免了使用汇编语言或硬件规格语言的复杂性。</p>
<h2 id="变量命名">变量命名</h2>
<p>变量名不能以 <strong>gl_</strong> 作为前缀,这个是<strong>GLSL</strong> 保留的前缀,用于<strong>GLSL</strong> 的内部变量。</p>
<h2 id="变量类型">变量类型</h2>
<h3 id="纹理采样类型"><strong>纹理采样类型</strong></h3>
<table>
<thead>
<tr class="header">
<th>类型</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>sampler1D</strong></td>
<td>用于内建的纹理函数中引用指定的<strong>1D纹理的句柄</strong> 。只可以作为一致变量或者函数参数使用</td>
</tr>
<tr class="even">
<td><strong>sampler2D</strong></td>
<td><strong>二维纹理句柄</strong></td>
</tr>
<tr class="odd">
<td><strong>sampler3D</strong></td>
<td><strong>三维纹理句柄</strong></td>
</tr>
<tr class="even">
<td><strong>samplerCube</strong></td>
<td><strong>cube map 纹理句柄</strong></td>
</tr>
<tr class="odd">
<td><strong>sampler1DShadow</strong></td>
<td><strong>一维深度纹理句柄</strong></td>
</tr>
<tr class="even">
<td><strong>sampler2DShadow</strong></td>
<td><strong>二维深度纹理句柄</strong></td>
</tr>
</tbody>
</table>
<h3 id="向量类型">向量类型</h3>
<table>
<thead>
<tr class="header">
<th>类型</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>vec2,vec3,vec4</td>
<td>2分量、3分量和4分量浮点向量</td>
</tr>
<tr class="even">
<td>ivec2,ivec3,ivec4</td>
<td>2分量、3分量和4分量整数向量</td>
</tr>
<tr class="odd">
<td>uvec2,uvec3,uvec4</td>
<td>2分量、3分量和4分量无符号整数向量</td>
</tr>
<tr class="even">
<td>bvec2,vbec3,bvec4</td>
<td>2分量、3分量和4分量布尔向量</td>
</tr>
</tbody>
</table>
<p><strong>向量定义、运算</strong></p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">vec4 v;</span><br><span class="line">vec4 vOldPos = vec4(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line">vec4 vOffset = vec4(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line">v = vOldPos + vOffset;</span><br><span class="line">v += vec4(<span class="number">10</span>, <span class="number">10</span>, <span class="number">10</span>, <span class="number">10</span>);</span><br><span class="line">v = vOldPos * vOffset;</span><br><span class="line">v *= <span class="number">5</span>;</span><br></pre></td></tr></table></figure>
<p><strong>向量元素的获取(成分选择)</strong></p>
<p>向量中单独的成分可以通过 <strong>{x,y,z,w}, {r,g,b,a}</strong> 或者 <strong>{s,t,p,q}</strong> 的记法来表示。这些不同的记法用于 <strong>顶点</strong> , <strong>颜色</strong> , <strong>纹理坐标</strong> 。在成分选择中,不可以混合使用这些记法。其中 <strong>{s,t,p,q}</strong> 中的 <strong>p</strong> 替换了<strong>纹理</strong>的 <strong>r</strong> 坐标,因为与颜色 <strong>r</strong> 重复了。下面是用法举例:</p>
<p>例如有向量 <strong>v1</strong> 和 <strong>v2</strong> :</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vec3 v1 = {<span class="number">0.5</span>, <span class="number">0.35</span>, <span class="number">0.7</span>};</span><br><span class="line">vec4 v2 = {<span class="number">0.1</span>, <span class="number">0.2</span>, <span class="number">0.3</span>, <span class="number">0.4</span>};</span><br></pre></td></tr></table></figure>
<p>可以通过 <strong>{x,y,z,w}, {r,g,b,a}</strong> 或者 <strong>{s,t,p,q}</strong> 来取出向量中的元素值。</p>
<p>通过 <strong>x,y,z,w</strong> :</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">v2.x = <span class="number">3.0f</span>;</span><br><span class="line">v2.xy = vec2(<span class="number">3.0f</span>,<span class="number">4.0f</span>);</span><br><span class="line">v2.xyz = vec3(<span class="number">3</span>,<span class="number">0f</span>,<span class="number">4</span>,<span class="number">0f</span>,<span class="number">5.0f</span>);</span><br></pre></td></tr></table></figure>
<p>通过 <strong>r,g,b,a</strong> :</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">v2.r = 3.0f;</span><br><span class="line">v2.rgba = vec4(1.0f,1.0f,1.0f,1.0f);</span><br></pre></td></tr></table></figure>
<h3 id="矩阵类型">矩阵类型</h3>
<table>
<thead>
<tr class="header">
<th>类型</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>mat4 或 mat4x4</td>
<td>4x4的浮点数矩阵类型</td>
</tr>
<tr class="even">
<td>mat2x3</td>
<td>2列3行的浮点矩阵(OpenGL的矩阵是列主顺序的)</td>
</tr>
<tr class="odd">
<td>mat2x4</td>
<td>2列4行的浮点矩阵</td>
</tr>
</tbody>
</table>
<p><strong>创建矩阵:</strong></p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mat4 m1,m2,m3;</span><br></pre></td></tr></table></figure>
<p><strong>构造单元矩阵:</strong></p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mat4 m2 = mat4( <span class="number">1.0f</span>,<span class="number">0.0f</span>,<span class="number">0.0f</span>,<span class="number">0.0f</span>,</span><br><span class="line"> <span class="number">0.0f</span>,<span class="number">1.0f</span>,<span class="number">0.0f</span>,<span class="number">0.0f</span>,</span><br><span class="line"> <span class="number">0.0f</span>,<span class="number">0.0f</span>,<span class="number">1.0f</span>,<span class="number">0.0f</span>,</span><br><span class="line"> <span class="number">0.0f</span>,<span class="number">0.0f</span>,<span class="number">0.0f</span>,<span class="number">1.0f</span>);</span><br></pre></td></tr></table></figure>
<p>数学上等同于</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mat4 m4 = mat4(1.0f);</span><br></pre></td></tr></table></figure>
<h3 id="数组">数组</h3>
<p><strong>GLSL</strong> 中只可以使用一维的数组。数组的类型可以是一切基本类型或者结构体。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">float</span> floatArray[<span class="number">4</span>];</span><br><span class="line">vec4 vecArray[<span class="number">2</span>];</span><br><span class="line"><span class="keyword">float</span> a[<span class="number">4</span>] = <span class="keyword">float</span>[](<span class="number">1.0</span>,<span class="number">2.0</span>,<span class="number">3.0</span>,<span class="number">4.0</span>);</span><br><span class="line">vec2 c[<span class="number">2</span>] = vec2[<span class="number">2</span>](vec2(<span class="number">1.0</span>,<span class="number">2.0</span>),vec2(<span class="number">3.0</span>,<span class="number">4.0</span>));</span><br></pre></td></tr></table></figure>
<p>数组类型内建了一个 <code>length()</code>函数,可以返回数组的长度。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a.length() // 返回数组的长度</span><br></pre></td></tr></table></figure>
<h3 id="结构体">结构体</h3>
<p>与C的差别不大</p>
<h2 id="限定符">限定符</h2>
<table>
<colgroup>
<col style="width: 25%">
<col style="width: 75%">
</colgroup>
<thead>
<tr class="header">
<th>限定符</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>const</strong></td>
<td>常量值必须在声明时初始化,只读不可修改</td>
</tr>
<tr class="even">
<td><strong>varying</strong></td>
<td>顶点着色器的输出,主要负责在<strong>vertex</strong>和<strong>fragment</strong>之间传递变量。<br>例如颜色或者纹理坐标,(插值后的数据)作为片段着色器的只读输入数据。<br>必须是全局范围声明的全局变量。<br>可以是浮点数类型的标量,向量,矩阵。不能是数组或者结构体。</td>
</tr>
<tr class="odd">
<td><strong>uniform</strong></td>
<td>一致变量。在着色器执行期间一致变量的值是不变的。<br>与<strong>const</strong>常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的。<br>一致变量在顶点着色器和片段着色器之间是共享的。它也只能在全局范围进行声明。</td>
</tr>
<tr class="even">
<td><strong>attribute</strong></td>
<td>表示只读的顶点数据,只用在顶点着色器中。数据来自当前的顶点状态或者顶点数组。<br>它必须是全局范围声明的,不能再函数内部。<br>一个<strong>attribute</strong>可以是浮点数类型的标量,向量,或者矩阵。不可以是数组或则结构体</td>
</tr>
<tr class="odd">
<td><strong>centorid varying</strong></td>
<td>在没有多重采样的情况下,与<strong>varying</strong>是一样的意思。<br>在多重采样时,<strong>centorid varying</strong>在光栅化的图形内部进行求值而不是在片段中心的固定位置求值。</td>
</tr>
</tbody>
</table>
<h2 id="运算">运算</h2>
<p><strong>注意 GLSL 中没有隐式转换,即便在多维向量中也没有</strong></p>
<pre><code>**逐分量运算**
**vec,mat** 这些类型其实是由 **float** 复合而成的,当它们与**float** 运算时,其实就是在每一个分量上分别与 **float** 进行运算,这就是所谓的 **逐分量运算** 。**GLSL** 里,大部分涉及 **vec,mat** 的运算都是逐分量运算,但也并不全是。下文中就会讲到特例。
**逐分量运算** 是线性的,这就是说 vec 与 float 的运算结果是还是 **vec** 。</code></pre>
<h4 id="不同类型-float-与-int-间的运算">1、不同类型 float 与 int 间的运算:</h4>
<p><strong>float</strong> 与 <strong>int</strong> 之间进行运算,需要进行一次显示转换</p>
<h4 id="float-与-vec向量mat矩阵-的运算">2、float 与 vec(向量)、mat(矩阵) 的运算:</h4>
<p><strong>int</strong> 与 <strong>vec,mat</strong> 之间是不可运算的,因为 <strong>vec</strong> 和 <strong>mat</strong> 中的每一个分量都是 <strong>float</strong> 类型的,无法与 <strong>int</strong> 进行逐分量计算。</p>
<h4 id="vec向量-与-vec向量运算">3、vec(向量) 与 vec(向量)运算:</h4>
<p>两向量间的运算首先要保证操作数的阶数都相同,否则不能计算。</p>
<h4 id="vec向量-与-mat矩阵">4、vec(向量) 与 mat(矩阵):</h4>
<p>要保证操作数的阶数相同,且 <strong>vec</strong> 与 <strong>mat</strong> 间只存在乘法运算。 它们的计算方式和线性代数中的矩阵乘法相同, <strong>不是逐分量运算</strong> 。</p>
<h4 id="mat矩阵-与-mat矩阵">5、mat(矩阵) 与 mat(矩阵):</h4>
<p>⚠️要保证操作数的阶数相同。</p>
<p>在 <strong>mat</strong> 与 <strong>mat</strong> 的运算中,除了乘法是线性代数中的矩阵乘法外,其余的运算仍为 <strong>逐分量运算</strong> 。简单说就是只有乘法是特殊的,其余都和 <strong>vec</strong> 与 <strong>vec</strong> 运算类似。</p>
<h2 id="精度限定">精度限定</h2>
<p><strong>GLSL</strong> 在进行光栅化着色的时候,会产生大量的浮点数运算,这些运算可能是当前设备所不能承受的,所以 <strong>GLSL</strong> 提供了 <strong>3</strong> 种浮点数精度,我们可以根据不同的设备来使用合适的精度。</p>
<p>在变量前面加上 <strong><code>highp</code>、<code>mediump</code>、<code>lowp</code></strong> 即可完成对该变量的精度声明:</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">lowp <span class="keyword">float</span> color;</span><br><span class="line">varying mediump vec2 Coord;</span><br><span class="line"><span class="function">lowp ivec2 <span class="title">foo</span><span class="params">(lowp mat3)</span></span>;</span><br><span class="line">highp mat4 m;</span><br></pre></td></tr></table></figure>
<p>我们一般在 <strong>片元着色器(fragment shader)</strong> 最开始的地方加上 <code>precision mediump float;</code> 便设定了默认的精度,这样所有没有显式表明精度的变量都会按照设定好的默认精度来处理。</p>
<p>⚠️注意 <strong>GLSL</strong> 函数中没有递归!</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/07/01/Fisher-Yates%E6%B4%97%E7%89%8C%E7%AE%97%E6%B3%95/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/07/01/Fisher-Yates%E6%B4%97%E7%89%8C%E7%AE%97%E6%B3%95/" class="post-title-link" itemprop="url">Fisher-Yates洗牌算法</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-07-01 23:08:13 / Modified: 23:10:44" itemprop="dateCreated datePublished" datetime="2024-07-01T23:08:13+08:00">2024-07-01</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>Fisher-Yates洗牌算法的步骤:</p>
<ol type="1">
<li><strong>从最后一个元素开始</strong> :从数组的最后一个元素开始,依次向前处理每一个元素。</li>
<li><strong>随机选择一个元素</strong> :对于当前处理的元素,从数组的开始到当前元素之间(包括当前元素)随机选择一个元素。</li>
<li><strong>交换元素</strong> :将当前元素与随机选择的元素进行交换。</li>
<li><strong>重复步骤2和3</strong> :重复上述步骤,直到数组的第一个元素。</li>
</ol>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">local</span> <span class="function"><span class="keyword">function</span> <span class="title">shuffle</span><span class="params">(tab)</span></span></span><br><span class="line"> <span class="keyword">for</span> i = #tab, <span class="number">2</span>, <span class="number">-1</span> <span class="keyword">do</span></span><br><span class="line"> <span class="keyword">local</span> j = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">1</span>, i)</span><br><span class="line"> tab[i], tab[j] = tab[j], tab[i]</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p>这个过程保证了每个元素都有同等的概率出现在任何位置,从而实现了真正的随机洗牌。</p>
<p>Fisher-Yates洗牌算法的时间复杂度是O(n),空间复杂度是O(1)。其余洗牌算法在公平性或者效率上不如FY</p>
<p>框架中的洗牌算法</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tab = T.shuffle(tab)</span><br></pre></td></tr></table></figure>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/04/22/CS-HttpClient/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/04/22/CS-HttpClient/" class="post-title-link" itemprop="url">CS_HttpClient</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-04-22 20:29:26 / Modified: 21:30:01" itemprop="dateCreated datePublished" datetime="2024-04-22T20:29:26+08:00">2024-04-22</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>System.Net.Http</p>
<p>提供一个类,用于从 URI 标识的资源发送 HTTP 请求和接收 HTTP 响应。</p>
<p>HttpClient client = new HttpClient();</p>
<h2 id="属性">属性</h2>
<table>
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>BaseAddress</th>
<th>获取或设置发送请求时使用的 Internet 资源的统一资源标识符 (URI) 的基址。</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>DefaultProxy</td>
<td>获取或设置全局 HTTP 代理。</td>
</tr>
<tr class="even">
<td>DefaultRequestHeaders</td>
<td>获取与每个请求一起发送的标题。</td>
</tr>
<tr class="odd">
<td>DefaultRequestVersion</td>
<td>获取或设置对此 HttpClient 实例发出的后续请求使用的默认 HTTP 版本。</td>
</tr>
<tr class="even">
<td>DefaultVersionPolicy</td>
<td>获取或设置便捷方法中隐式创建的请求的默认版本策略,例如 GetAsync(String)和 PostAsync(String, HttpContent)。</td>
</tr>
<tr class="odd">
<td>MaxResponseContentBufferSize</td>
<td>获取或设置读取响应内容时要缓冲的最大字节数。</td>
</tr>
<tr class="even">
<td>Timeout</td>
<td>获取或设置请求超时前等待的时间跨度。</td>
</tr>
</tbody>
</table>
<h2 id="方法">方法</h2>
<p>展开表</p>
<table>
<colgroup>
<col style="width: 48%">
<col style="width: 51%">
</colgroup>
<tbody>
<tr class="odd">
<td>Dispose()</td>
<td>释放由 HttpMessageInvoker使用的非托管资源和托管资源。(继承自 HttpMessageInvoker)</td>
</tr>
<tr class="even">
<td>GetAsync(String)</td>
<td>以异步操作将 GET 请求发送给指定 URI。</td>
</tr>
<tr class="odd">
<td>GetAsync(String, CancellationToken)</td>
<td>用以异步操作的取消标记发送 GET 请求到指定的 URI。</td>
</tr>
<tr class="even">
<td>GetAsync(String, HttpCompletionOption)</td>
<td>用以异步操作的 HTTP 完成选项发送 GET 请求到指定的 URI。</td>
</tr>
<tr class="odd">
<td>GetAsync(String, HttpCompletionOption, CancellationToken)</td>
<td>用以异步操作的 HTTP 完成选项和取消标记发送 GET 请求到指定的 URI。</td>
</tr>
<tr class="even">
<td>PostAsync(String, HttpContent)</td>
<td>以异步操作将 POST 请求发送给指定 URI。</td>
</tr>
<tr class="odd">
<td>PostAsync(String, HttpContent, CancellationToken)</td>
<td>用以异步操作的取消标记发送 POST 请求。</td>
</tr>
<tr class="even">
<td>PostAsync(Uri, HttpContent)</td>
<td>以异步操作将 POST 请求发送给指定 URI。</td>
</tr>
<tr class="odd">
<td>PostAsync(Uri, HttpContent, CancellationToken)</td>
<td>用以异步操作的取消标记发送 POST 请求。</td>
</tr>
<tr class="even">
<td>PutAsync(String, HttpContent)</td>
<td>以异步操作将 PUT 请求发送给指定 URI。</td>
</tr>
<tr class="odd">
<td>PutAsync(Uri, HttpContent, CancellationToken)</td>
<td>用以异步操作的取消标记发送 PUT 请求。</td>
</tr>
<tr class="even">
<td>Send(HttpRequestMessage)</td>
<td>发送带有指定请求的 HTTP 请求。</td>
</tr>
<tr class="odd">
<td>Send(HttpRequestMessage, CancellationToken)</td>
<td>发送带有指定请求和取消标记的 HTTP 请求。</td>
</tr>
<tr class="even">
<td>SendAsync(HttpRequestMessage)</td>
<td>以异步操作发送 HTTP 请求。</td>
</tr>
<tr class="odd">
<td>SendAsync(HttpRequestMessage, CancellationToken)</td>
<td>以异步操作发送 HTTP 请求。</td>
</tr>
</tbody>
</table>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/04/22/CS-JSON%E5%BA%8F%E5%88%97%E5%8C%96/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/04/22/CS-JSON%E5%BA%8F%E5%88%97%E5%8C%96/" class="post-title-link" itemprop="url">CS_JSON序列化</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-04-22 19:18:05 / Modified: 19:27:48" itemprop="dateCreated datePublished" datetime="2024-04-22T19:18:05+08:00">2024-04-22</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p><code>System.Text.Json</code>命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能。</p>
<p>序列化是将对象状态(即其属性的值)转换为可存储或传输的形式的过程。 序列化形式不包含有关对象的关联方法的任何信息。 反序列化从序列化形式重新构造对象。</p>
<p>https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/</p>
<p>对应JSON格式,最外层为类,类中使用字典</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> public class Data</span><br><span class="line"> {</span><br><span class="line"> public string companyName { get; set; }</span><br><span class="line"> public int used { get; set; }</span><br><span class="line"> public int balance { get; set; }</span><br><span class="line"> public int taskLimitCount { get; set; }</span><br><span class="line"> }</span><br><span class="line"> public class ClientData</span><br><span class="line"> {</span><br><span class="line"> public Dictionary<string, object> data { get; set; }//这里不加{ get; set; }就无法反序列化进来,会为null</span><br><span class="line"> public int code { get; set; }</span><br><span class="line"> public bool success { get; set; }</span><br><span class="line"> public string msg { get; set; }</span><br><span class="line"> }</span><br><span class="line">ClientData clientData = JsonSerializer.Deserialize<ClientData>(responseBody);//反序列化,指定类型</span><br></pre></td></tr></table></figure>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/04/03/EUI-%E5%BE%AA%E7%8E%AF%E5%88%97%E8%A1%A8%E9%A1%B9/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/04/03/EUI-%E5%BE%AA%E7%8E%AF%E5%88%97%E8%A1%A8%E9%A1%B9/" class="post-title-link" itemprop="url">EUI 循环列表项</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-04-03 10:03:06 / Modified: 11:47:16" itemprop="dateCreated datePublished" datetime="2024-04-03T10:03:06+08:00">2024-04-03</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="创建循环列表eloopscrolllist_test">创建循环列表ELoopScrollList_Test</h1>
<p>在DlgRank窗口下添加循环列表ELoopScrollList_Test</p>
<p>DlgRank节点,右键EUI/循环列表,重命名,SpwanEUICode</p>
<img src="/2024/04/03/EUI-%E5%BE%AA%E7%8E%AF%E5%88%97%E8%A1%A8%E9%A1%B9/1.png" class>
<p>ELoopScrollList_Test节点的Loop Vertical Scroll Rect组件规定 列表项 的预制体、数量、滑动速度和方式</p>
<img src="/2024/04/03/EUI-%E5%BE%AA%E7%8E%AF%E5%88%97%E8%A1%A8%E9%A1%B9/2.png" class>
<p>Content节点下将会自动创建 列表项 作为子节点,通过组件LayoutGroup规矩子节点静态排列方式</p>
<img src="/2024/04/03/EUI-%E5%BE%AA%E7%8E%AF%E5%88%97%E8%A1%A8%E9%A1%B9/3.png" class>
<p>列表项 预制体命名必须以Item开头,例如Item_Test 或 Item_Rank。<br>
列表项 预制体的需要添加Layout Element组件,用于配合其父节点Content的LayoutGroup组件使用。</p>
<h1 id="在dlgrank中添加">在DlgRank中添加</h1>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">public Dictionary<int, Scroll_Item_Test> TestDic = new Dictionary<int, Scroll_Item_Test>();</span><br><span class="line">//创建字典格式</span><br><span class="line">//其中Scroll_Item_Test类型在SpawnEUICode中自动生成</span><br></pre></td></tr></table></figure>
<h1 id="在dlgranksystem中添加">在DlgRankSystem中添加</h1>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">public static async void ShowWindow(this DlgRank self, Entity contextData = null)//一般在ShowWindow中添加监听</span><br><span class="line">{</span><br><span class="line"> self.AddUIScrollItems(ref self.TestDic, numCount);</span><br><span class="line"> //添加字典,numCount是列表项数量</span><br><span class="line"> self.View.ELoopScrollList_TestLoopVerticalScrollRect.AddItemRefreshListener(self.OnTestItem);</span><br><span class="line"> //为 LoopScrollList_Test变化事件 添加 监听响应</span><br><span class="line"> self.View.ELoopScrollList_RankLoopVerticalScrollRect.SetVisible(true, numCount);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">public static void HideWindow(this DlgRank self)</span><br><span class="line">{</span><br><span class="line"> self.RemoveUIScrollItems(ref self.TestDic);//清空</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">public static void OnTestItem(this DlgRank self, Transform trans, int index)</span><br><span class="line">{</span><br><span class="line"> var testItem = self.TestDic[index].BindTrans(trans);</span><br><span class="line"> //字典与列表项绑定,并返回Scroll_Item_Test类的变量用于后续显示操作</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h1 id="进阶">进阶</h1>
<p>一个EUI循环列表项需要:</p>
<p>在数据层添加字典<br>
在创建/显示/刷新时添加字典、监听,并显示<br>
在隐藏/销毁时清空字典<br>
需要一个列表项响应函数</p>
<p>只要满足上述条件,则不一定在ShowWindow和HideWindow中书写相关代码</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/04/02/unity-%E4%BF%AE%E6%94%B9%E7%BC%96%E8%BE%91%E5%99%A8%E7%AA%97%E5%8F%A3%E6%A0%87%E9%A2%98/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/04/02/unity-%E4%BF%AE%E6%94%B9%E7%BC%96%E8%BE%91%E5%99%A8%E7%AA%97%E5%8F%A3%E6%A0%87%E9%A2%98/" class="post-title-link" itemprop="url">unity 修改编辑器窗口标题</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-04-02 17:15:38 / Modified: 17:18:07" itemprop="dateCreated datePublished" datetime="2024-04-02T17:15:38+08:00">2024-04-02</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>用Unity开多个相同工程时,Untiy编辑器的窗口不能迅速区分开是哪个工程,使用user32.dll的接口修改窗口名。</p>
<p>在Editor文件夹下导入一下脚本,关联窗口名与项目路径</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br></pre></td><td class="code"><pre><span class="line">using System;</span><br><span class="line">using System.Diagnostics;</span><br><span class="line">using System.Runtime.InteropServices;</span><br><span class="line">using System.Text;</span><br><span class="line">using UnityEngine;</span><br><span class="line">using UnityEditor;</span><br><span class="line"></span><br><span class="line">namespace NF</span><br><span class="line">{</span><br><span class="line"> //声明要调用的系统接口</span><br><span class="line"> public partial class UpdateUnityEditorProcess</span><br><span class="line"> {</span><br><span class="line"> public delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam);</span><br><span class="line"></span><br><span class="line"> [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]</span><br><span class="line"> public static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData);</span><br><span class="line"> [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]</span><br><span class="line"> public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);</span><br><span class="line"></span><br><span class="line"> [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]</span><br><span class="line"> public static extern IntPtr GetWindow(HandleRef hWnd, int uCmd);</span><br><span class="line"></span><br><span class="line"> [DllImport("user32.dll", CharSet = CharSet.Auto)]</span><br><span class="line"> public static extern bool IsWindowVisible(HandleRef hWnd);</span><br><span class="line"></span><br><span class="line"> [DllImport("user32.dll", CharSet = CharSet.Auto)]</span><br><span class="line"> public static extern IntPtr GetParent(IntPtr hWnd);</span><br><span class="line"></span><br><span class="line"> [DllImport("user32.dll")]</span><br><span class="line"> private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);</span><br><span class="line"></span><br><span class="line"> [DllImport("user32.dll", CharSet = CharSet.Auto)]</span><br><span class="line"> private extern static int GetWindowTextLength(IntPtr hWnd);</span><br><span class="line"></span><br><span class="line"> [DllImport("user32.dll", EntryPoint = "SetWindowText", CharSet = CharSet.Auto)] </span><br><span class="line"> public extern static int SetWindowText(int hwnd, string lpString);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> //工具类</span><br><span class="line"> public partial class UpdateUnityEditorProcess</span><br><span class="line"> {</span><br><span class="line"> public IntPtr hwnd = IntPtr.Zero;</span><br><span class="line"> private bool haveMainWindow = false;</span><br><span class="line"> private IntPtr mainWindowHandle = IntPtr.Zero;</span><br><span class="line"> private int processId = 0;</span><br><span class="line"> private IntPtr hwCurr = IntPtr.Zero;</span><br><span class="line"> private static StringBuilder sbtitle = new StringBuilder(255);</span><br><span class="line"> private static string ProjectName = "";</span><br><span class="line"> private static string ProjectPath = "";</span><br><span class="line"> public static float lasttime = 0;</span><br><span class="line"></span><br><span class="line"> private static UpdateUnityEditorProcess _instance;</span><br><span class="line"> public static UpdateUnityEditorProcess Instance//具体修改窗口名的地方</span><br><span class="line"> {</span><br><span class="line"> get</span><br><span class="line"> {</span><br><span class="line"> if (_instance == null)</span><br><span class="line"> {</span><br><span class="line"> _instance = new UpdateUnityEditorProcess();</span><br><span class="line"> _instance.hwnd = _instance.GetMainWindowHandle(Process.GetCurrentProcess().Id);</span><br><span class="line"> var strArr = Application.dataPath.Split("/");</span><br><span class="line"> ProjectName = strArr[strArr.Length - 2];</span><br><span class="line"> ProjectPath = Application.dataPath.Replace("/Assets", "");</span><br><span class="line"> }</span><br><span class="line"> return _instance;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public void SetTitle()</span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> lasttime = 0;</span><br><span class="line"> if (Time.realtimeSinceStartup > lasttime)</span><br><span class="line"> {</span><br><span class="line"> sbtitle.Length = 0;</span><br><span class="line"> lasttime = Time.realtimeSinceStartup + 2f;</span><br><span class="line"> int length = GetWindowTextLength(hwnd);</span><br><span class="line"> hwnd = _instance.hwnd;</span><br><span class="line"> GetWindowText(hwnd.ToInt32(), sbtitle, 255);</span><br><span class="line"> string strTitle = sbtitle.ToString();</span><br><span class="line"> string[] ss = strTitle.Split('-');</span><br><span class="line"> if (ss.Length > 0 && !strTitle.Contains(ProjectPath))</span><br><span class="line"> {</span><br><span class="line"> SetWindowText(hwnd.ToInt32(), strTitle.Replace(ProjectName, ProjectPath));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public IntPtr GetMainWindowHandle(int processId)</span><br><span class="line"> {</span><br><span class="line"> if (!this.haveMainWindow)</span><br><span class="line"> {</span><br><span class="line"> this.mainWindowHandle = IntPtr.Zero;</span><br><span class="line"> this.processId = processId;</span><br><span class="line"> EnumThreadWindowsCallback callback = new EnumThreadWindowsCallback(this.EnumWindowsCallback);</span><br><span class="line"> EnumWindows(callback, IntPtr.Zero);</span><br><span class="line"> GC.KeepAlive(callback);</span><br><span class="line"> this.haveMainWindow = true;</span><br><span class="line"> }</span><br><span class="line"> return this.mainWindowHandle;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private bool EnumWindowsCallback(IntPtr handle, IntPtr extraParameter)</span><br><span class="line"> {</span><br><span class="line"> int num;</span><br><span class="line"> GetWindowThreadProcessId(new HandleRef(this, handle), out num);</span><br><span class="line"> if ((num == this.processId) && this.IsMainWindow(handle))</span><br><span class="line"> {</span><br><span class="line"> this.mainWindowHandle = handle;</span><br><span class="line"> }</span><br><span class="line"> return true;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private bool IsMainWindow(IntPtr handle)</span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> return (GetParent(handle) == IntPtr.Zero && !(GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero) && IsWindowVisible(new HandleRef(this, handle)));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> //Editor 回调设置</span><br><span class="line">#if UNITY_EDITOR_WIN</span><br><span class="line"></span><br><span class="line"> [InitializeOnLoad]</span><br><span class="line"> class UpdateUnityEditorTitle</span><br><span class="line"> {</span><br><span class="line"> private static bool isInGame = false;</span><br><span class="line"></span><br><span class="line"> [System.Obsolete]</span><br><span class="line"> static UpdateUnityEditorTitle()</span><br><span class="line"> {</span><br><span class="line"> EditorApplication.delayCall += DoUpdateTitleFunc;</span><br><span class="line"></span><br><span class="line"> EditorApplication.hierarchyChanged += DoUpdateTitleFunc;</span><br><span class="line"></span><br><span class="line"> EditorApplication.playmodeStateChanged += OnPlaymodeStateChanged;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> static void OnPlaymodeStateChanged()</span><br><span class="line"> {</span><br><span class="line"> if (EditorApplication.isPlaying == isInGame) return;</span><br><span class="line"> isInGame = EditorApplication.isPlaying;</span><br><span class="line"> UpdateUnityEditorProcess.lasttime = 0;</span><br><span class="line"> DoUpdateTitleFunc();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> static void DoUpdateTitleFunc()</span><br><span class="line"> {</span><br><span class="line"> UpdateUnityEditorProcess.lasttime = 0;</span><br><span class="line"> UpdateUnityEditorProcess.Instance.SetTitle();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">#endif</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="http://example.com/2024/04/02/Unity-Editor%E6%8B%93%E5%B1%95/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="冲击波">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="OK">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2024/04/02/Unity-Editor%E6%8B%93%E5%B1%95/" class="post-title-link" itemprop="url">Unity Editor拓展</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2024-04-02 14:47:39" itemprop="dateCreated datePublished" datetime="2024-04-02T14:47:39+08:00">2024-04-02</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2024-04-18 23:03:01" itemprop="dateModified" datetime="2024-04-18T23:03:01+08:00">2024-04-18</time>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="imgui扩展编辑器">IMGUI扩展编辑器</h1>
<p><strong>常用标记</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[SerializeField]</span><br><span class="line">private int Number;</span><br><span class="line"></span><br><span class="line">[Range(0, 1)]//滑动条</span><br><span class="line">public float MyFloat;</span><br><span class="line"></span><br><span class="line">[Header("This is the Name")]//标题</span><br><span class="line">public string Name = "大壮";</span><br><span class="line"></span><br><span class="line">[Tooltip("物体宽度")]//鼠标悬停时出现的提示</span><br><span class="line">public float width;</span><br><span class="line"></span><br><span class="line">[Space(30)]//控制上下两个属性之间的间隔</span><br><span class="line">[TextArea(5, 10)]//文本框大小,参数是最小行数和最大行数</span><br><span class="line">public string Content = "";</span><br><span class="line"></span><br><span class="line">[HideInInspector]//隐藏</span><br><span class="line">public string Str = "test string";</span><br></pre></td></tr></table></figure>
<p>需要拓展Editor类,并且最好将类放到Editor文件夹下,Editor文件夹下的资源在游戏最终打包过程不会被打包进项目。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">using UnityEditor;</span><br><span class="line"></span><br><span class="line">[CustomEditor(typeof(TestScriptBE))]//该标记用于声明为哪个脚本进行Inspector拓展</span><br><span class="line">public class EditorTestScriptBE : Editor</span><br><span class="line">{</span><br><span class="line"> private Texture2D texture;</span><br><span class="line"> public override void OnInspectorGUI()</span><br><span class="line"> {</span><br><span class="line"> base.OnInspectorGUI();//显示TestScriptBE脚本的属性</span><br><span class="line"> texture = EditorGUILayout.ObjectField(texture, typeof(Texture2D)) as Textture2D;</span><br><span class="line"> //新增一个获取图片的操作框</span><br><span class="line"> if(GUILayout.Button("Test Button", GUILayout.Height(30)))//新增一个按钮,并设置高度</span><br><span class="line"> {</span><br><span class="line"> if (texture != null)</span><br><span class="line"> Debug.Log(texture.name);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>这类编辑器拓展来自于IMGUI,较为落后与混乱</p>
<h1 id="ui-toolkit">UI Toolkit</h1>
<p>包含UI Elements, UI Builder, Features。在2021版本后被集成进Unity。</p>
<p>在项目管理窗口的Editor文件夹下创建UI Toolkit/Editor Window</p>
<img src="/2024/04/02/Unity-Editor%E6%8B%93%E5%B1%95/1.png" class>
<h2 id="uxml">UXML</h2>
<p>在 UIBuilder 中可视化建立的窗口UI</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br></pre></td><td class="code"><pre><span class="line">public class SceneObjectWindow : EditorWindow</span><br><span class="line">{</span><br><span class="line"> private GameObject[] sceneObjects;</span><br><span class="line"> private ObjectField objectField;</span><br><span class="line"> private Button createBtn;</span><br><span class="line"> private Button refreshBtn;</span><br><span class="line"> private ListView listView;</span><br><span class="line"> private TextField nameText;</span><br><span class="line"> private Vector3Field posText;</span><br><span class="line"> private TextField caseText;</span><br><span class="line"></span><br><span class="line"> //标记该函数,并确定打开窗口的路径</span><br><span class="line"> [MenuItem("Window/UI Toolkit/MyWindow")]</span><br><span class="line"> public static void ShowWindowBE()</span><br><span class="line"> {</span><br><span class="line"> SceneObjectWindow wnd = GetWindow<SceneObjectWindow>();</span><br><span class="line"> wnd.titleContent = new GUIContent("MyWindow");</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public void CreateGUI()</span><br><span class="line"> {</span><br><span class="line"> // Each editor window contains a root VisualElement object</span><br><span class="line"> VisualElement root = rootVisualElement;</span><br><span class="line"></span><br><span class="line"> // Import UXML,导入UIBuilder中可视化建立的UI</span><br><span class="line"> var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/SceneObjectWindow.uxml");</span><br><span class="line"> visualTree.CloneTree(root);</span><br><span class="line"></span><br><span class="line"> var rightVE = root.Q<VisualElement>("right");//需要对组件进行重命名才能用该方式获取,此处重命名为right,显示为#right</span><br><span class="line"> //一些组件无法在UIBuilder中创建,只能在带啊吗中创建,例如Helpbox</span><br><span class="line"> HelpBox helpBox1 = new HelpBox("同学们请坐下,只是一个演示", HelpBoxMessageType.None);</span><br><span class="line"> HelpBox helpBox2 = new HelpBox("同学们请坐下,只是一个演示", HelpBoxMessageType.Info);</span><br><span class="line"> rightVE.Add(helpBox1);</span><br><span class="line"> rightVE.Add(helpBox2);</span><br><span class="line"></span><br><span class="line"> //</span><br><span class="line"> objectField = root.Q<ObjectField>("ObjectField");//需要对组件进行重命名才能用该方式获取,此处重命名为ObjectField,显示为#ObjectField</span><br><span class="line"> objectField.objectType = typeof(GameObject);//尽管该组件默认显示名称为ObjectField,但实际上它没有名称,不对它进行重命名则无法获取</span><br><span class="line"></span><br><span class="line"> //</span><br><span class="line"> createBtn = root.Q<Button>("CreateBtn");</span><br><span class="line"> createBtn.clicked += OnCreateGameObject;</span><br><span class="line"></span><br><span class="line"> //</span><br><span class="line"> refreshBtn = root.Q<Button>("RefreshBtn");</span><br><span class="line"> refreshBtn.clicked += OnRefresh;</span><br><span class="line"></span><br><span class="line"> //</span><br><span class="line"> listView = root.Q<ListView>("ListView");</span><br><span class="line"> listView.makeItem = MakeListItem;//在OnRefresh中更改listView.itemsSource时调用</span><br><span class="line"> listView.bindItem = BindListItem;//listView.makeItem中调用</span><br><span class="line"> listView.onSelectionChange += OnSelectItem;</span><br><span class="line"></span><br><span class="line"> //</span><br><span class="line"> nameText = root.Q<TextField>("NameText");</span><br><span class="line"> posText = root.Q<Vector3Field>("PosText");</span><br><span class="line"> nameText.bindingPath = "m_Name";//设置 绑定序列化对象 的路径即字段名:检视面板shift + 右键单击属性即可打印原生组件的字段名</span><br><span class="line"> posText.bindingPath = "m_LocalPosition";</span><br><span class="line"></span><br><span class="line"> //</span><br><span class="line"> caseText = root.Q<TextField>("CaseText");</span><br><span class="line"> caseText.RegisterValueChangedCallback<string>(OnCaseTextChanged);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private void OnCaseTextChanged(ChangeEvent<string> evt)</span><br><span class="line"> {</span><br><span class="line"> Debug.Log($"Before:{evt.previousValue}-----After:{evt.newValue}");</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private void OnSelectItem(IEnumerable<object> enumerable)</span><br><span class="line"> {</span><br><span class="line"> foreach (var item in enumerable) </span><br><span class="line"> {</span><br><span class="line"> GameObject go = item as GameObject;</span><br><span class="line"> Selection.activeGameObject = go;</span><br><span class="line"></span><br><span class="line"> //序列化,绑定序列化后的对象以做到实时更改</span><br><span class="line"> SerializedObject so = new SerializedObject(go);</span><br><span class="line"> SerializedObject so2 = new SerializedObject(go.transform);</span><br><span class="line"> nameText.Bind(so);</span><br><span class="line"> posText.Bind(so2);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private void OnRefresh()</span><br><span class="line"> {</span><br><span class="line"> Scene scene = SceneManager.GetActiveScene();</span><br><span class="line"> sceneObjects = scene.GetRootGameObjects();//SceneManagement类中的操作</span><br><span class="line"> listView.itemsSource = sceneObjects;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private void BindListItem(VisualElement element, int index)</span><br><span class="line"> {</span><br><span class="line"> Label label = element as Label;</span><br><span class="line"> var go = sceneObjects[index];</span><br><span class="line"> label.text = go.name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private VisualElement MakeListItem()</span><br><span class="line"> {</span><br><span class="line"> var label = new Label();</span><br><span class="line"> label.style.unityTextAlign = TextAnchor.MiddleLeft;</span><br><span class="line"> label.style.marginLeft = 5;</span><br><span class="line"> return label;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> private void OnCreateGameObject()</span><br><span class="line"> {</span><br><span class="line"> GameObject prefab = objectField.value as GameObject;</span><br><span class="line"> var go = Instantiate(prefab);</span><br><span class="line"> go.transform.position = new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="uss样式">USS样式</h2>
<h2 id="editorwindow类">EditorWindow类</h2>
<p>生命周期:</p>
<p>Awake、CreateGUI、OnGUI(给IMGUI使用)</p>
<h2 id="inspector复用uitoolkit窗口">Inspector复用UIToolkit窗口</h2>
<p>需要拓展Editor类,并且最好将类放到Editor文件夹下,Editor文件夹下的资源在游戏最终打包过程不会被打包进项目。</p>