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

Unity C#脚本实现GameObject缩放报错与逻辑异常求解

Unity C# 缩放开关脚本问题修复

问题1:CS0108 编译错误原因

你在类中手动声明了public Transform transform;字段,但所有继承自MonoBehaviour的脚本,已经从父类Component继承了内置的transform属性,作用就是直接获取当前挂载物体的Transform组件。你声明的同名字段会隐藏父类的同名成员,因此触发该报错。

  • 修复方式:直接删除手动声明的public Transform transform;行即可,不需要额外声明该字段,也不需要在代码里写transform = GetComponent<Transform>();,内置的transform属性可以直接使用。

问题2:按键后同时输出两条日志的逻辑错误原因

你写的两个if判断是独立顺序执行的,不是互斥分支:

  1. 当第一个判断scale.x != objectSize成立时,进入代码块将scale.x修改为objectSize,输出condition1后,代码不会跳出判断,会继续向下执行
  2. 此时scale.x已经被你刚改成了objectSize,第二个判断scale.x == objectSize必然成立,会立刻进入第二个代码块把scale.x改回1,输出condition2。最终效果是按一次S,球体先放大再立刻缩回原尺寸,没有实现开关切换的效果。
  • 额外隐患:直接通过float值相等判断缩放状态,容易因为浮点数精度误差导致判断失效,不推荐这种写法。

修复后可直接运行的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Scale : MonoBehaviour
{
    Vector3 scale;
    public float objectSize = 3.0f;
    // 用布尔值记录当前缩放状态,避免浮点判断误差
    private bool isLargeSize = false;

    void ScaleOnOff()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            // if-else是互斥分支,只会执行其中一个逻辑块
            if (!isLargeSize)
            {
                scale = transform.localScale;
                scale.x = objectSize;
                transform.localScale = scale;
                isLargeSize = true;
                Debug.Log("condition1:已放大到目标尺寸");
            }
            else
            {
                scale = transform.localScale;
                scale.x = 1f;
                transform.localScale = scale;
                isLargeSize = false;
                Debug.Log("condition2:已恢复初始尺寸");
            }
        }
    }

    void Update()
    {
        ScaleOnOff();
    }
}

内容的提问来源于stack exchange,提问作者newdevnoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:48:20