DiceEntity.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using DG.Tweening;
  5. using System.Linq;
  6. public class DiceEntity : MonoBehaviour {
  7. public InputM.KeyType key;
  8. private string currentLetter;
  9. private SpriteRenderer spriteText;
  10. private void Start() {
  11. spriteText = GetComponentsInChildren<SpriteRenderer>().Where(sp => sp.gameObject.name == "ImgText").First();
  12. GetComponentsInChildren<SpriteRenderer>().Where(sp => sp.gameObject.name == "ImgType").First().sprite = InputM.GetKeyTypeSprite(key);
  13. currentLetter = InputM.GetKeyRaw(key);
  14. UpdateSpriteText();
  15. }
  16. private void UpdateSpriteText() => spriteText.sprite = InputM.GetKeyTextSprite(currentLetter);
  17. const float rollTime = 3.5f, endTime = 1.5f;
  18. public bool canRestore = true;
  19. private void OnCollisionEnter2D(Collision2D collision) {
  20. if (!collision.gameObject.CompareTag("Player")) return;
  21. // 关闭其他移动
  22. GetComponent<Collider2D>().enabled = false;
  23. GetComponent<Rigidbody2D>().gravityScale = 0;
  24. GetComponent<Rigidbody2D>().velocity = Vector2.zero;
  25. // 开始旋转
  26. transform.DORotate(new Vector3(0, 0, 360f * Mathf.RoundToInt(rollTime * 1.5f)), rollTime, RotateMode.FastBeyond360);
  27. transform.DOScale(2, rollTime);
  28. transform.DOMoveY(transform.position.y + 3, rollTime);
  29. StartCoroutine(Roll());
  30. }
  31. IEnumerator Roll() {
  32. for (int i = 0; i < rollTime * 8; i++) {
  33. currentLetter = Module.RandomOne("wasdlr".ToList()).ToString();
  34. UpdateSpriteText();
  35. yield return new WaitForSeconds(0.1f);
  36. }
  37. for (int i = 0; i < Mathf.RoundToInt(rollTime * 0.333f); i++) {
  38. currentLetter = Module.RandomOne("wasdlr".ToList()).ToString();
  39. UpdateSpriteText();
  40. yield return new WaitForSeconds(0.333f);
  41. }
  42. // 最终确定
  43. string possible = InputM.GetPossibleResults(key, canRestore);
  44. Debug.Log(possible);
  45. currentLetter = Module.RandomOne(possible.ToCharArray().ToList()).ToString();
  46. UpdateSpriteText();
  47. yield return new WaitForSeconds(0.5f);
  48. // 强调动画
  49. transform.DOScale(2.5f, 0.1f);
  50. yield return new WaitForSeconds(0.1f);
  51. transform.DOScale(2.3f, 0.1f);
  52. yield return new WaitForSeconds(0.7f);
  53. // 结束动画
  54. transform.DOScale(1, endTime);
  55. GameObject endObj = InputM.GetDiceUI(key);
  56. Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.allCameras[0], endObj.transform.position);
  57. transform.DOMove((Vector2) Camera.allCameras[0].ScreenToWorldPoint(screenPos), endTime);
  58. yield return new WaitForSeconds(endTime);
  59. // 设置
  60. InputM.SetKey(key, currentLetter);
  61. endObj.GetComponent<DiceUI>().isDropped = false;
  62. endObj.GetComponent<DiceUI>().UpdateColor();
  63. yield return new WaitForSeconds(0.1f);
  64. Destroy(gameObject);
  65. }
  66. }