You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:12:05