NoteController.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using UnityEngine;
  2. /* 控制音符生命周期管理
  3. * 1. 音符的生成
  4. * 2. 音符的销毁
  5. * 3. 音符的移动
  6. * 4. 音符的音效播放
  7. * 5. 音符的碰撞检测
  8. * 6. 音符需要提前4秒创建
  9. */
  10. public class NoteController : MonoBehaviour
  11. {
  12. public float speed = 2; // 音符移动速度
  13. public float hitTime = 4f; // 音符点击的时间
  14. private float endTime; // 音符消失时间
  15. public string action = ""; // 音符对应的动作
  16. private float hitLeadTime = 4f; // 音符提前创建的时间
  17. // Start is called once before the first execution of Update after the MonoBehaviour is created
  18. void Start()
  19. {
  20. hitLeadTime = GameData.noteStartLeadTime; // 获取音符提前创建的时间
  21. transform.position = new Vector3(-1 * hitLeadTime * speed, -2, 5); // 初始化音符位置
  22. transform.localScale = NoteSize(); // 设置音符大小
  23. endTime = Time.time + hitTime + hitLeadTime/2; // 设置音符消失时间
  24. if (action == "left")
  25. {
  26. transform.rotation = Quaternion.Euler(0, 0, -90); // 设置音符旋转角度
  27. }
  28. else if (action == "right")
  29. {
  30. transform.rotation = Quaternion.Euler(0, 0, 90); // 设置音符旋转角度
  31. }
  32. else if (action == "up")
  33. {
  34. transform.rotation = Quaternion.Euler(0, 0, 180); // 设置音符旋转角度
  35. }
  36. else if (action == "down")
  37. {
  38. // transform.rotation = Quaternion.Euler(0, 0, 0); // 设置音符旋转角度
  39. }
  40. }
  41. // Update is called once per frame
  42. void Update()
  43. {
  44. // 检测是否超过消失时间,如果超过则销毁音符
  45. if (Time.time > endTime)
  46. {
  47. Destroy(gameObject);
  48. }
  49. else
  50. {
  51. transform.position += new Vector3(speed * Time.deltaTime, 0, 0); // 移动音符
  52. // transform.Translate(new Vector3(speed * Time.deltaTime, 0, 0)); // 移动音符
  53. transform.localScale = NoteSize(); // 设置音符大小
  54. }
  55. }
  56. // 根据距离hitTime的时间差来调整音符的大小
  57. public Vector3 NoteSize()
  58. {
  59. float positionX = transform.position.x; // 获取音符当前X坐标
  60. float deltaSize = 1 - (Mathf.Abs(positionX / speed) / hitLeadTime);
  61. float size = 0.2f + 0.8f * deltaSize; // 根据时间差计算音符大小
  62. return new Vector3(size, size, 1); // 调整音符大小
  63. }
  64. void OnDestroy()
  65. {
  66. }
  67. }