Unity C#脚本实现GameObject缩放报错与逻辑异常求解
Unity C# 缩放开关脚本问题修复
问题1:CS0108 编译错误原因
你在类中手动声明了public Transform transform;字段,但所有继承自MonoBehaviour的脚本,已经从父类Component继承了内置的transform属性,作用就是直接获取当前挂载物体的Transform组件。你声明的同名字段会隐藏父类的同名成员,因此触发该报错。
- 修复方式:直接删除手动声明的
public Transform transform;行即可,不需要额外声明该字段,也不需要在代码里写transform = GetComponent<Transform>();,内置的transform属性可以直接使用。
问题2:按键后同时输出两条日志的逻辑错误原因
你写的两个if判断是独立顺序执行的,不是互斥分支:
- 当第一个判断
scale.x != objectSize成立时,进入代码块将scale.x修改为objectSize,输出condition1后,代码不会跳出判断,会继续向下执行 - 此时
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
相关产品推荐
相关产品推荐

