Commit d55acff5f713b025835c477911144f24cfbe5530
1 parent
97e12b16
Exists in
master
Arquivo sinais.txt na pasta Resources; Scroll para o topo quando a pesquisa é al…
…terada; Correção de problema que fazia ultimas palavras não serem reproduzidas quando havia sinais de pontuação; Retirada de alterações no avatar collider dentro do script FadeFX.
Showing
6 changed files
with
163 additions
and
93 deletions
Show diff stats
Assets/Resources/sinais.txt
1 | - | |
2 | -% | |
3 | 1 | , |
4 | 2 | 0 |
5 | 3 | 1 |
... | ... | @@ -2351,16 +2349,6 @@ CUSTEAR |
2351 | 2349 | CUSTOSO |
2352 | 2350 | CUTANEO |
2353 | 2351 | CUTUCAR |
2354 | -Cotovelo | |
2355 | -Cozinheira | |
2356 | -Cpf | |
2357 | -Crer | |
2358 | -Crianca | |
2359 | -Cueca | |
2360 | -Cuidadoso | |
2361 | -Cumprimentos | |
2362 | -Cunhada | |
2363 | -Curitiba | |
2364 | 2352 | DÓLAR |
2365 | 2353 | D |
2366 | 2354 | DA |
... | ... | @@ -2848,7 +2836,7 @@ DIGITADOR |
2848 | 2836 | DIGITAL |
2849 | 2837 | DIGITALIZADA |
2850 | 2838 | DIGITALIZADO |
2851 | -DIGITAR 23-Sep-2015 17:56 61K | |
2839 | +DIGITAR | |
2852 | 2840 | DIGITO |
2853 | 2841 | DIGNIDADE |
2854 | 2842 | DIGNO |
... | ... | @@ -3054,18 +3042,18 @@ DURO |
3054 | 3042 | DUVIDA |
3055 | 3043 | DUVIDOSO |
3056 | 3044 | DVD |
3057 | -Dama | |
3058 | -Decidir | |
3059 | -Dedo | |
3060 | -Default Take | |
3061 | -Descer | |
3062 | -Diminuir | |
3063 | -Diretor | |
3064 | -Disputar | |
3065 | -Distrito-federal | |
3066 | -Dividir | |
3067 | -Divorciar | |
3068 | -Domino | |
3045 | +DAMA | |
3046 | +DECIDIR | |
3047 | +DEDO | |
3048 | +DEFAULT TAKE | |
3049 | +DESCER | |
3050 | +DIMINUIR | |
3051 | +DIRETOR | |
3052 | +DISPUTAR | |
3053 | +DISTRITO-FEDERAL | |
3054 | +DIVIDIR | |
3055 | +DIVORCIAR | |
3056 | +DOMINO | |
3069 | 3057 | E |
3070 | 3058 | EBRIO |
3071 | 3059 | ECOLOGIA |
... | ... | @@ -5249,7 +5237,7 @@ LACRIMEJANTE |
5249 | 5237 | LACRIMEJAR |
5250 | 5238 | LACTEO |
5251 | 5239 | LACTOSE |
5252 | -LADO24-Sep-2015 09:59 19K | |
5240 | +LADO | |
5253 | 5241 | LADRAR |
5254 | 5242 | LADRILHO |
5255 | 5243 | LAGARTA | ... | ... |
Assets/Scripts/Animation List/ListManager.cs
... | ... | @@ -48,7 +48,7 @@ public class ListManager : MonoBehaviour { |
48 | 48 | |
49 | 49 | public IEnumerator Load() |
50 | 50 | { |
51 | - string[] lines; | |
51 | + /*string[] lines; | |
52 | 52 | WWW www = new WWW("http://150.165.205.9/anims/sinais.txt"); |
53 | 53 | yield return www; |
54 | 54 | |
... | ... | @@ -60,7 +60,19 @@ public class ListManager : MonoBehaviour { |
60 | 60 | else |
61 | 61 | { |
62 | 62 | lines = www.text.Split("\n"[0]); |
63 | - } | |
63 | + }*/ | |
64 | + | |
65 | + WWW www = new WWW("file:///" + Application.dataPath + "/Resources/sinais.txt"); | |
66 | + yield return www; | |
67 | + | |
68 | + Debug.Log(Application.dataPath); | |
69 | + | |
70 | + string[] lines = new string[0]; | |
71 | + | |
72 | + if (string.IsNullOrEmpty(www.error)) | |
73 | + lines = System.Text.Encoding.UTF8.GetString(www.bytes, 0, www.bytes.Length).Split('\n'); | |
74 | + else | |
75 | + Debug.Log(www.error); | |
64 | 76 | |
65 | 77 | this.trie = new TrieST<string>(); |
66 | 78 | |
... | ... | @@ -96,6 +108,7 @@ public class ListManager : MonoBehaviour { |
96 | 108 | Destroy(go); |
97 | 109 | |
98 | 110 | populateList(); |
111 | + this.scrollView.verticalNormalizedPosition = 1F; | |
99 | 112 | } |
100 | 113 | |
101 | 114 | private void populateList() | ... | ... |
Assets/Scripts/Animation List/TrieST.cs
... | ... | @@ -47,12 +47,12 @@ public class TrieST<Value> |
47 | 47 | |
48 | 48 | public void put(String key, String val) |
49 | 49 | { |
50 | - root = put(root, key, val, 0); | |
50 | + if ( ! String.IsNullOrEmpty(key) && ! String.IsNullOrEmpty(val)) | |
51 | + root = put(root, key, val, 0); | |
51 | 52 | } |
52 | 53 | |
53 | 54 | private Node put(Node x, String key, String val, int d) |
54 | 55 | { |
55 | - | |
56 | 56 | if (x == null) x = new Node(); |
57 | 57 | if (d == key.Length) |
58 | 58 | { |
... | ... | @@ -60,10 +60,16 @@ public class TrieST<Value> |
60 | 60 | x.val = val; |
61 | 61 | return x; |
62 | 62 | } |
63 | - int c = indexes[key[d]]; | |
64 | - x.next[c] = put(x.next[c], key, val, d + 1); | |
65 | - return x; | |
66 | 63 | |
64 | + try { | |
65 | + int c = indexes[key[d]]; | |
66 | + x.next[c] = put(x.next[c], key, val, d + 1); | |
67 | + } | |
68 | + catch (IndexOutOfRangeException) { | |
69 | + Debug.Log("Error at TrieST.put: { key: " + key + "; index: " + d + "; value: " + ((int) key[d]) + " }" + key); | |
70 | + } | |
71 | + | |
72 | + return x; | |
67 | 73 | } |
68 | 74 | |
69 | 75 | public Queue<String> keys() | ... | ... |
Assets/Scripts/Player Manager/GenericPlayerManager.cs
1 | 1 | /** Gerenciador genérico e principal dos players. |
2 | 2 | * |
3 | - * Versão: 2.1 | |
3 | + * Versão 2.1 | |
4 | 4 | * - Acompanhamento da legenda |
5 | - * Corrigido problema na soletração quando a velocidade ultrapassava ~1 | |
5 | + * Corrigido problema na soletração quando a velocidade ultrapassava ~1. | |
6 | + * | |
7 | + * Versão 2.2 | |
8 | + * - Acompanhamento da legenda | |
9 | + * Corrigido problema na soletração quando o estado muda para pausado. | |
6 | 10 | */ |
7 | 11 | |
8 | 12 | //Log Dir http://docs.unity3d.com/Manual/LogFiles.html |
... | ... | @@ -53,12 +57,16 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
53 | 57 | |
54 | 58 | // Se diferente de null, não está reproduzindo animação de intervalo |
55 | 59 | private AnimationState intervalAnimationState = null; |
60 | + // Usado para pausar quando comandado | |
61 | + private AnimationReference animationPlaying = null; | |
56 | 62 | |
57 | 63 | // Gerenciador de animações de intervalo |
58 | 64 | public RandomAnimations randomAnimations; |
59 | 65 | // Gerenciados de legendas |
60 | 66 | private Subtitle subtitles = null; |
61 | 67 | |
68 | + private bool[] lastLetterAnimations = new bool[256]; | |
69 | + | |
62 | 70 | public virtual void Start() |
63 | 71 | { |
64 | 72 | // Configuração de velocidade das animações |
... | ... | @@ -80,20 +88,21 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
80 | 88 | foreach (string flag in flags) |
81 | 89 | this.flags.Add(flag); |
82 | 90 | |
83 | - // Duplica sinais para diferenciar quando há repetidos | |
84 | - string[] toDuplicate = new string[] { | |
91 | + string[] preloadedAnims = new string[] { | |
85 | 92 | "A", "B", "C", "D", "E", "F", "G", "H", "I", |
86 | 93 | "J", "K", "L", "M", "N", "O", "P", "Q", "R", |
87 | 94 | "S", "T", "U", "V", "W", "X", "Y", "Z", |
88 | 95 | "0", "1", "2", "3", "4", |
89 | 96 | "5", "6", "7", "8", "9", |
90 | - "," | |
97 | + "," | |
91 | 98 | }; |
92 | - foreach (string anim in toDuplicate) | |
99 | + | |
100 | + // Duplica sinais para diferenciar quando há repetidos | |
101 | + foreach (string anim in preloadedAnims) | |
93 | 102 | COMPONENT_ANIMATION.AddClip(COMPONENT_ANIMATION[anim].clip, "d_" + anim); |
94 | 103 | |
95 | - // Sinal default é tratado como animação de intervalo: não sinaliza reprodução na UI | |
96 | - //this.intervalAnimations.Add(DEFAULT_ANIMATION); | |
104 | + foreach (string anim in preloadedAnims) | |
105 | + this.loadedAssetBundles.Add(anim); | |
97 | 106 | |
98 | 107 | // Cria novo _default chamado _default_middle para pausas dentro de uma glosa |
99 | 108 | // Impede que a animação default seja confundida com não-reprodução na UI |
... | ... | @@ -131,9 +140,9 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
131 | 140 | subtitles.updateNumberSpeed(); |
132 | 141 | |
133 | 142 | // Altera a velocidade de todas as animações em reprodução |
134 | - if ( ! paused) lock (animQueue) | |
143 | + if ( ! paused) lock (this.animQueue) | |
135 | 144 | { |
136 | - foreach (AnimationReference reference in animQueue) | |
145 | + foreach (AnimationReference reference in this.animQueue) | |
137 | 146 | if (reference.type != Subtitle.TYPE_NONE && reference.state != null) |
138 | 147 | reference.state.speed = getSpeedByType(reference.type); |
139 | 148 | } |
... | ... | @@ -169,12 +178,10 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
169 | 178 | this.randomAnimations.unlockFor("handleStates"); |
170 | 179 | this.subtitles.setText(""); |
171 | 180 | |
172 | - lock (animQueue) { animQueue.Clear(); } | |
181 | + lock (this.animQueue) { this.animQueue.Clear(); } | |
173 | 182 | COMPONENT_ANIMATION.CrossFadeQueued(DEFAULT_ANIMATION, fadeLength, QueueMode.PlayNow); |
174 | 183 | |
175 | - playing = false; | |
176 | - paused = false; | |
177 | - onPlayingStateChange(); | |
184 | + resetStates(); | |
178 | 185 | } |
179 | 186 | |
180 | 187 | /* Repete animações */ |
... | ... | @@ -198,7 +205,7 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
198 | 205 | state.speed = speed; |
199 | 206 | |
200 | 207 | lock (this.animQueue) { |
201 | - animQueue.Enqueue(new AnimationReference(name, subtitle, state, type)); | |
208 | + this.animQueue.Enqueue(new AnimationReference(name, subtitle, state, type)); | |
202 | 209 | } |
203 | 210 | |
204 | 211 | return state; |
... | ... | @@ -235,12 +242,17 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
235 | 242 | */ |
236 | 243 | protected abstract WWW loadAssetBundle(string aniName); |
237 | 244 | |
245 | + /** | |
246 | + * Listen to changes in the playing status. | |
247 | + */ | |
248 | + protected abstract void onConnectionError(string gloss, string word); | |
238 | 249 | |
239 | 250 | /** |
240 | 251 | * Listen to changes in the playing status. |
241 | 252 | */ |
242 | 253 | protected abstract void onPlayingStateChange(); |
243 | 254 | |
255 | + | |
244 | 256 | /* Pause or continue animations */ |
245 | 257 | public void setPauseState(bool paused) |
246 | 258 | { |
... | ... | @@ -248,15 +260,22 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
248 | 260 | { |
249 | 261 | this.paused = paused; |
250 | 262 | |
251 | - lock (animQueue) | |
263 | + lock (this.animQueue) | |
252 | 264 | { |
253 | - foreach (AnimationReference reference in animQueue) | |
265 | + if (this.animationPlaying != null && this.animationPlaying.state != null) | |
266 | + this.animationPlaying.state.speed = paused ? 0F : getSpeedByType(this.animationPlaying.type); | |
267 | + | |
268 | + foreach (AnimationReference reference in this.animQueue) | |
254 | 269 | if (reference.state != null) |
255 | 270 | reference.state.speed = paused ? 0F : getSpeedByType(reference.type); |
256 | 271 | } |
257 | - | |
258 | - onPlayingStateChange(); | |
259 | 272 | } |
273 | + | |
274 | + onPlayingStateChange(); | |
275 | + } | |
276 | + | |
277 | + public void setAnimationEnabled(bool enabled) { | |
278 | + COMPONENT_ANIMATION.enabled = enabled; | |
260 | 279 | } |
261 | 280 | |
262 | 281 | /* Pause or continue animations */ |
... | ... | @@ -315,6 +334,14 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
315 | 334 | return true; |
316 | 335 | } |
317 | 336 | |
337 | + private string nextLetterAnimation(char letter) | |
338 | + { | |
339 | + string animation = (this.lastLetterAnimations[letter] ? "" : "d_") + letter.ToString(); | |
340 | + this.lastLetterAnimations[letter] = ! this.lastLetterAnimations[letter]; | |
341 | + | |
342 | + return animation; | |
343 | + } | |
344 | + | |
318 | 345 | /* Enfileira soletração de palavra */ |
319 | 346 | private string spellWord(Queue<ToPlay> toPlayQueue, string word) |
320 | 347 | { |
... | ... | @@ -329,9 +356,8 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
329 | 356 | for (int i = 0; i < word.Length; i++) |
330 | 357 | { |
331 | 358 | lastAnimationSubtitle = Subtitle.highlight(word, i); |
332 | - | |
333 | - string anim = word[i].ToString(); | |
334 | - lastAnim = anim.Equals(lastAnim) ? "d_" + anim : anim; | |
359 | + lastAnim = nextLetterAnimation(word[i]); | |
360 | + //anim.Equals(lastAnim) ? "d_" + anim : anim; | |
335 | 361 | |
336 | 362 | short type; |
337 | 363 | |
... | ... | @@ -443,23 +469,29 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
443 | 469 | AssetBundle bundle = null; |
444 | 470 | |
445 | 471 | if (www.error == null) |
446 | - bundle = www.assetBundle; | |
447 | - | |
448 | - if (bundle != null && ! String.IsNullOrEmpty(bundle.mainAsset.name)) | |
449 | 472 | { |
450 | - AnimationClip aniClip = bundle.mainAsset as AnimationClip; | |
451 | - bundle.Unload(false); | |
473 | + bundle = www.assetBundle; | |
452 | 474 | |
453 | - if (aniClip) | |
475 | + if (bundle != null && ! String.IsNullOrEmpty(bundle.mainAsset.name)) | |
454 | 476 | { |
455 | - COMPONENT_ANIMATION.AddClip(aniClip, aniName); | |
477 | + AnimationClip aniClip = bundle.mainAsset as AnimationClip; | |
478 | + bundle.Unload(false); | |
479 | + | |
480 | + if (aniClip) | |
481 | + { | |
482 | + COMPONENT_ANIMATION.AddClip(aniClip, aniName); | |
483 | + | |
484 | + loadedAssetBundles.Add(aniName); | |
485 | + loaded = true; | |
456 | 486 | |
457 | - loadedAssetBundles.Add(aniName); | |
458 | - loaded = true; | |
487 | + Debug.Log("Bundle \"" + aniName + "\" loaded!"); | |
488 | + } | |
489 | + else UnityEngine.Debug.Log ("Sinal \"" + aniName + "\" foi não carregado corretamente."); | |
459 | 490 | } |
460 | - else UnityEngine.Debug.Log ("Sinal \"" + aniName + "\" não carregado corretamente."); | |
461 | 491 | } |
492 | + else onConnectionError(gloss, aniName); | |
462 | 493 | } |
494 | + else onConnectionError(gloss, aniName); | |
463 | 495 | } |
464 | 496 | |
465 | 497 | // Reproduz palavra |
... | ... | @@ -496,18 +528,19 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
496 | 528 | |
497 | 529 | if (this.flags.Contains(aniName) || this.intervalAnimations.Contains(aniName)) |
498 | 530 | { |
499 | - //playAnimation(Subtitle.TYPE_NONE, DEFAULT_ANIMATION, "", 1.6F); | |
500 | 531 | toPlayQueue.Enqueue(new ToPlay(Subtitle.TYPE_NONE, DEFAULT_ANIMATION_MIDDLE, "", 1.6F)); |
501 | - continue; | |
532 | + spelled = false; | |
502 | 533 | } |
503 | - | |
504 | - // Se já houve o soletramento de alguma palavra, reproduz animação default | |
505 | - if (spelled) | |
506 | - toPlayQueue.Enqueue(new ToPlay(Subtitle.TYPE_NONE, DEFAULT_ANIMATION_MIDDLE, lastAnimationSubtitle, 1.6F)); | |
507 | 534 | else |
508 | - spelled = true; | |
535 | + { | |
536 | + // Se já houve o soletramento de alguma palavra, reproduz animação default | |
537 | + if (spelled) | |
538 | + toPlayQueue.Enqueue(new ToPlay(Subtitle.TYPE_NONE, DEFAULT_ANIMATION_MIDDLE, "", 1.6F)); | |
539 | + else | |
540 | + spelled = true; | |
509 | 541 | |
510 | - lastAnimationSubtitle = spellWord(toPlayQueue, aniName); | |
542 | + lastAnimationSubtitle = spellWord(toPlayQueue, aniName); | |
543 | + } | |
511 | 544 | } |
512 | 545 | |
513 | 546 | if (toPlayQueue.Count > 4 || wordsCount == stringPos.Length) |
... | ... | @@ -536,65 +569,93 @@ public abstract class GenericPlayerManager : MonoBehaviour { |
536 | 569 | onPlayingStateChange(); |
537 | 570 | |
538 | 571 | bool isNotEmpty; |
539 | - lock (animQueue) { isNotEmpty = animQueue.Count > 0; } | |
572 | + lock (this.animQueue) { isNotEmpty = this.animQueue.Count > 0; } | |
573 | + | |
574 | + // Animação anterior a atual | |
575 | + AnimationReference endedAnimation = null; | |
540 | 576 | |
541 | - // Enquanto estiver executando a rotina "loadAndPlay" | |
577 | + // Enquanto estiver executando a corotina "loadAndPlay" | |
542 | 578 | // ou existir animações na fila de reprodução |
543 | 579 | while (loading || isNotEmpty) |
544 | 580 | { |
581 | + // Se não houver animações na fila, espera | |
545 | 582 | if (isNotEmpty) |
546 | 583 | { |
584 | + // Pega primeira animação | |
547 | 585 | AnimationReference reference; |
548 | - lock (animQueue) { reference = animQueue.Peek(); } | |
549 | - | |
550 | - this.subtitles.setText(reference.subtitle); | |
586 | + lock (this.animQueue) { reference = this.animQueue.Peek(); } | |
551 | 587 | |
588 | + // Se estiver sendo reproduzida | |
552 | 589 | if (COMPONENT_ANIMATION.IsPlaying(reference.name)) |
553 | 590 | { |
591 | + this.subtitles.setText(reference.subtitle); | |
592 | + | |
593 | + // Animação seguinte | |
554 | 594 | AnimationReference next = null; |
555 | - lock (animQueue) | |
595 | + lock (this.animQueue) | |
556 | 596 | { |
557 | - animQueue.Dequeue(); | |
597 | + this.animationPlaying = this.animQueue.Dequeue(); | |
558 | 598 | |
559 | - if (animQueue.Count > 0) | |
560 | - next = animQueue.Peek(); | |
599 | + if (this.animQueue.Count > 0) | |
600 | + next = this.animQueue.Peek(); | |
561 | 601 | } |
562 | 602 | |
563 | 603 | while (true) |
564 | 604 | { |
605 | + // Se a próxima animação estiver sendo reproduzida (no fade) | |
565 | 606 | if (next != null && COMPONENT_ANIMATION.IsPlaying(next.name)) |
566 | 607 | { |
608 | + // Se a animação anterior a atual não tiver acabado, | |
609 | + // espera acabar e só então conta o tempo | |
610 | + if (endedAnimation != null) | |
611 | + while (COMPONENT_ANIMATION.IsPlaying(endedAnimation.name)) | |
612 | + yield return null; | |
613 | + | |
614 | + // Tempo para pular para a legenda da próxima animação | |
567 | 615 | yield return new WaitForSeconds(0.4F); |
616 | + | |
617 | + // Deprecated | |
618 | + // yield return WaitForContinuousMillis.Wait(this, 300); | |
619 | + | |
620 | + endedAnimation = reference; | |
568 | 621 | break; |
569 | 622 | } |
623 | + | |
570 | 624 | else if (COMPONENT_ANIMATION.IsPlaying(reference.name)) |
571 | - { | |
572 | 625 | yield return null; |
573 | - } | |
626 | + | |
574 | 627 | else break; |
575 | 628 | } |
576 | 629 | |
577 | 630 | reference = null; |
578 | 631 | } |
579 | 632 | |
633 | + // Se a animação não tiver sido liberada e seu AnimationState for nulo, | |
634 | + // a animação será liberada | |
580 | 635 | if (reference != null && reference.state == null) |
581 | - lock (animQueue) { animQueue.Dequeue(); } | |
636 | + lock (this.animQueue) { this.animQueue.Dequeue(); } | |
582 | 637 | else |
583 | 638 | yield return null; |
584 | 639 | } |
585 | 640 | else yield return null; |
586 | 641 | |
587 | - this.subtitles.setText(""); | |
588 | - | |
589 | - lock (animQueue) { isNotEmpty = animQueue.Count > 0; } | |
642 | + lock (this.animQueue) { isNotEmpty = this.animQueue.Count > 0; } | |
590 | 643 | } |
591 | 644 | |
592 | - this.playing = false; | |
593 | - this.paused = false; | |
594 | - onPlayingStateChange(); | |
645 | + this.subtitles.setText(""); | |
595 | 646 | |
647 | + resetStates(); | |
596 | 648 | this.randomAnimations.unlockFor("handleStates"); |
597 | 649 | } |
598 | 650 | } |
599 | 651 | |
652 | + public void resetStates() | |
653 | + { | |
654 | + this.animationPlaying = null; | |
655 | + this.playing = false; | |
656 | + this.paused = false; | |
657 | + | |
658 | + onPlayingStateChange(); | |
659 | + } | |
660 | + | |
600 | 661 | } | ... | ... |
Assets/Scripts/PlayerManager.cs
Assets/Scripts/UI/FadeFX.cs
... | ... | @@ -39,7 +39,7 @@ public class FadeFX : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { |
39 | 39 | private void Activate() |
40 | 40 | { |
41 | 41 | this.active = true; |
42 | - this.screenManager.setAvatarColliderState(false); | |
42 | + //this.screenManager.setAvatarColliderState(false); | |
43 | 43 | |
44 | 44 | foreach (CanvasRenderer renderer in this.renderers) |
45 | 45 | renderer.SetAlpha(1F); |
... | ... | @@ -61,7 +61,7 @@ public class FadeFX : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { |
61 | 61 | if ( ! SwitchResolution.showbox && ! update_box.activeSelf) |
62 | 62 | { |
63 | 63 | this.active = false; |
64 | - this.screenManager.setAvatarColliderState(true); | |
64 | + //this.screenManager.setAvatarColliderState(true); | |
65 | 65 | |
66 | 66 | foreach (CanvasRenderer renderer in this.renderers) |
67 | 67 | renderer.SetAlpha(0.2F); | ... | ... |