Commit d55acff5f713b025835c477911144f24cfbe5530

Authored by Mateus Lustosa
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.
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&lt;Value&gt;
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&lt;Value&gt;
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
... ... @@ -74,6 +74,8 @@ public class PlayerManager : GenericPlayerManager {
74 74 return null;
75 75 }
76 76  
  77 + protected override void onConnectionError(string gloss, string word) { }
  78 +
77 79 void OnApplicationQuit()
78 80 {
79 81 try {
... ...
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);
... ...