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

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));
    }
}

排查与解决方法

  1. 修复未初始化变量与语法隐患
    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);
    
  2. 验证输入与时间缩放
    在FixedUpdate中添加调试日志,确认moveType和Time.timeScale的实际值,排除其他代码修改时间缩放的可能:

    void FixedUpdate()
    {
        Debug.Log($"moveType: {moveType}, Time.timeScale: {Time.timeScale}");
        // 原有逻辑...
    }
    
  3. 确认输入轴配置
    检查Unity编辑器的Edit > Project Settings > Input Manager,确保Horizontal轴已正确绑定A/D(或左/右箭头)键,避免输入无响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:43:15