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

Unity C#实现物体周期性下落功能异常问题求助

问题修复与解释

核心错误点

  • 赋值/比较运算符混淆:你的if条件里误用了=(赋值运算符)而非==(比较运算符),比如rigidbody.useGravity = false会直接把重力设为false,同时这个表达式的返回值是false,导致第一个if永远不会触发;而第二个if里的rigidbody.useGravity = true会强制开启重力,所以第二个条件会被错误触发。
  • 时间数值与需求不符:注释标注要3秒下落,但代码里写的是timer >=6,重置阶段的1.25秒也和描述的1秒不符,逻辑数值混乱。
  • 无状态区分的顺序判断:两个if顺序执行,重置timer后可能会误触另一个条件,应该用else if区分“等待下落”和“等待重置”两个阶段。

修正后的代码

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

public class FallingObject : MonoBehaviour
{
    float timer = 0;
    Rigidbody rigidbody;
    // 记录初始位置,避免每次重置时叠加位移
    Vector3 initialPosition;

    void Start()
    {
        rigidbody = GetComponent<Rigidbody>();
        rigidbody.useGravity = false;
        // 保存物体初始位置
        initialPosition = transform.position;
    }

    void Update()
    {
        timer += Time.deltaTime;

        // 阶段1:等待3秒后开启重力下落
        if (timer >= 3f && !rigidbody.useGravity)
        {
            Debug.Log("3秒已过,开始下落");
            rigidbody.useGravity = true;
            timer = 0;
        }
        // 阶段2:下落1秒后重置位置并关闭重力
        else if (timer >= 1f && rigidbody.useGravity)
        {
            Debug.Log("1秒已过,重置物体");
            rigidbody.useGravity = false;
            // 重置到初始位置,避免位移叠加
            transform.position = initialPosition;
            // 重置速度,防止下次下落时带初始速度
            rigidbody.velocity = Vector3.zero;
            timer = 0;
        }
    }
}

额外优化说明

  • 保存物体初始位置,避免用Translate重置导致位置不断上移的问题。
  • 重置时清空刚体速度,防止下次下落时保留之前的下落速度,导致运动异常。
  • 用!rigidbody.useGravity替代rigidbody.useGravity == false,写法更简洁直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:45:41