Unity 2D C#脚本变量切换失效:仅Left类型生效
FNF音符脚本问题:Type变量逻辑仅Left生效的修复
问题描述
我正在复刻周五夜放克(FNF),这是游戏中向上移动的音符脚本。遇到的问题:Type变量的switch逻辑完全失效,仅Left类型能正常工作。已确认所有游戏对象的Type变量均已赋值,尝试改用if语句后,依然只有Left类型生效。
原代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Note : MonoBehaviour { public float position; public KeyCode keyCode; public float speed; public string Type; public Color color; void Update() { transform.position += new Vector3(0, speed * Time.deltaTime, 0); if (string.IsNullOrEmpty(Type)) { switch (Type) { case "Left": keyCode = KeyCode.A; gameObject.GetComponent<SpriteRenderer>().color = Color.magenta; color = Color.magenta; break; case "Right": keyCode = KeyCode.D; gameObject.GetComponent<SpriteRenderer>().color = Color.red; color = Color.red; break; case "Up": keyCode = KeyCode.W; gameObject.GetComponent<SpriteRenderer>().color = Color.green; color = Color.green; break; case "Down": keyCode = KeyCode.S; gameObject.GetComponent<SpriteRenderer>().color = Color.cyan; color = Color.cyan; break; } } if (transform.position.y > 6) { Destroy(gameObject); GameObject.Find("chart_loader").GetComponent<chart>().notes.Remove(gameObject.GetComponent<Note>()); } } }
修复方案
核心问题:判断条件写反
你当前的if (string.IsNullOrEmpty(Type))是只有当Type为空或空字符串时才执行switch逻辑,但你已经确认所有对象的Type都已赋值,所以除了Left可能是测试时意外未赋值(刚好触发空条件),其他类型都无法进入switch分支。只需把判断改为if (!string.IsNullOrEmpty(Type))即可。
额外优化建议
用枚举替代字符串Type:字符串容易出现拼写错误(大小写、漏字等),改用枚举更可靠:
public enum NoteType { Left, Right, Up, Down } public NoteType type;后续switch直接针对
type判断,无需处理字符串匹配问题。缓存SpriteRenderer组件:不要在Update循环中反复调用
GetComponent<SpriteRenderer>(),在Start方法中缓存组件引用,提升性能:private SpriteRenderer sr; void Start() { sr = GetComponent<SpriteRenderer>(); }之后用
sr.color替代gameObject.GetComponent<SpriteRenderer>().color。优化销毁逻辑:销毁对象后调用
GetComponent会返回null,应先获取Note组件引用再执行销毁:if (transform.position.y > 6) { Note noteComp = GetComponent<Note>(); GameObject.Find("chart_loader").GetComponent<chart>().notes.Remove(noteComp); Destroy(gameObject); }
内容的提问来源于stack exchange,提问作者O Majestático
相关产品推荐
相关产品推荐

