Unity中moveType设为1后FixedUpdate内if语句未触发问题
Unity中moveType设为1后FixedUpdate对应逻辑未触发
问题详情
- 在主移动脚本
SnakeMovement顶部声明私有整型变量moveType并初始化为0 - 创建
HorizontalMovement函数,通过UI文本按钮的OnClick事件绑定触发;点击后moveType会被设为1,预期触发FixedUpdate()中的if(moveType == 1)分支,允许玩家用A、D键控制移动 - 实际测试中
moveType成功变为1,但该if分支逻辑未生效 - 相同机制的
MouseMovement(对应moveType=2)可正常工作,唯一区别是鼠标控制有额外的MousePosition脚本辅助 - 单独测试
if(moveType == 1)内的代码功能正常,已尝试将HorizontalMovement()和FixedUpdate()设为public、序列化moveType监控值,均未解决问题
附相关脚本
MousePosition脚本
public class MousePosition : MonoBehaviour { private Camera mainCam; private void Start() { mainCam = Camera.main; } private void FixedUpdate() { Vector2 mouseWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition); transform.position = mouseWorldPosition; } }
SnakeMovement脚本
public class SnakeMovement : MonoBehaviour { public SnakeTail tail; [SerializeField] private GameObject moveObjScreen; [SerializeField] private GameObject mouse; private Camera mainCam; [SerializeField] private float speed; private float rotateSpeed; private float velocityX = 0f; private int moveType = 0; void Start() { Time.timeScale = 0; mainCam = Camera.main; } void Update() { if (Input.GetKeyDown(KeyCode.LeftShift)) { speed = 4.5f; } if (Input.GetKeyUp(KeyCode.LeftShift)) { speed = 3f; } } void FixedUpdate() { if (moveType == 1) { // Move Type velocityX = Input.GetAxisRaw("Horizontal"); // Movement transform. Translate(Vector2.up * speed * Time.fixedDeltaTime, Space.Self); // Rotation transform.Rotate(Vector3.forward * -velocityX * rotateSpeed * Time.fixedDeltaTime); } else if (moveType == 2) { FollowMousePosition(); } } void HorizontalMovement() { Cursor.lockState = CursorLockMode.Locked; moveObjScreen.SetActive(false); Time.timeScale = 1; moveType = 1; } private void MouseMovement() { Cursor.visible = false; moveObjScreen.SetActive(false); mouse.SetActive(true); Time.timeScale = 1; moveType = 2; } private void FollowMousePosition() { // Movement & Rotation transform.position = Vector2.MoveTowards(transform.position, GetWorldPositionFromMouse(), speed * Time.deltaTime); } private Vector2 GetWorldPositionFromMouse() { return (mainCam.ScreenToWorldPoint(Input.mousePosition)); } }
排查与解决方法
修复未初始化变量与语法隐患
rotateSpeed仅声明未赋值,默认值为0导致旋转逻辑完全失效;同时移动代码中transform. Translate存在多余空格(语法隐患)。修改如下:// 在SnakeMovement的Start方法中添加rotateSpeed初始化 void Start() { Time.timeScale = 0; mainCam = Camera.main; rotateSpeed = 120f; // 按需调整数值 } // 修正FixedUpdate中的移动代码 transform.Translate(Vector2.up * speed * Time.fixedDeltaTime, Space.Self);验证输入与时间缩放
在FixedUpdate中添加调试日志,确认moveType和Time.timeScale的实际值,排除其他代码修改时间缩放的可能:void FixedUpdate() { Debug.Log($"moveType: {moveType}, Time.timeScale: {Time.timeScale}"); // 原有逻辑... }确认输入轴配置
检查Unity编辑器的Edit > Project Settings > Input Manager,确保Horizontal轴已正确绑定A/D(或左/右箭头)键,避免输入无响应。
内容的提问来源于stack exchange,提问作者Leo Sharpe
相关产品推荐
相关产品推荐

