using UnityEngine; /* 控制音符生命周期管理 * 1. 音符的生成 * 2. 音符的销毁 * 3. 音符的移动 * 4. 音符的音效播放 * 5. 音符的碰撞检测 * 6. 音符需要提前4秒创建 */ public class NoteController : MonoBehaviour { public float speed = 2; // 音符移动速度 public float hitTime = 4f; // 音符点击的时间 private float endTime; // 音符消失时间 public string action = ""; // 音符对应的动作 private float hitLeadTime = 4f; // 音符提前创建的时间 // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { hitLeadTime = GameData.noteStartLeadTime; // 获取音符提前创建的时间 transform.position = new Vector3(-1 * hitLeadTime * speed, -2, 5); // 初始化音符位置 transform.localScale = NoteSize(); // 设置音符大小 endTime = hitTime + hitLeadTime; // 设置音符消失时间 if (action == "left") { transform.rotation = Quaternion.Euler(0, 0, -90); // 设置音符旋转角度 } else if (action == "right") { transform.rotation = Quaternion.Euler(0, 0, 90); // 设置音符旋转角度 } else if (action == "up") { transform.rotation = Quaternion.Euler(0, 0, 180); // 设置音符旋转角度 } else if (action == "down") { // transform.rotation = Quaternion.Euler(0, 0, 0); // 设置音符旋转角度 } } // Update is called once per frame void Update() { // 检测是否超过消失时间,如果超过则销毁音符 if (Time.time > endTime) { Destroy(gameObject); } else { transform.position += new Vector3(speed * Time.deltaTime, 0, 0); // 移动音符 // transform.Translate(new Vector3(speed * Time.deltaTime, 0, 0)); // 移动音符 transform.localScale = NoteSize(); // 设置音符大小 } } // 根据距离hitTime的时间差来调整音符的大小 public Vector3 NoteSize() { float positionX = transform.position.x; // 获取音符当前X坐标 float deltaSize = 1 - (Mathf.Abs(positionX / speed) / hitLeadTime); float size = 0.4f + 0.6f * deltaSize; // 根据时间差计算音符大小 return new Vector3(size, size, 1); // 调整音符大小 } void OnDestroy() { } }