重新开始位置后如何阻止球体自行移动?

Posted

技术标签:

【中文标题】重新开始位置后如何阻止球体自行移动?【英文标题】:How to stop a sphere from moving by itself after restarting its position? 【发布时间】:2016-11-23 18:19:39 【问题描述】:

我在学习 Unity 的第三天,目前正在学习 roll-a-ball tutorial。我正在尝试添加一个重新启动按钮,它将球传送回起始位置/原点。这一切都很好,但是我重新启动后球会继续移动,但我希望它保持在一个位置而不是自己移动。

我的意思是,如果我以最大速度向左移动并按“R”重新启动,那么它将继续向左快速移动一段时间,但我想要实现的是球不会继续移动在我重新启动它的位置后它自己会自动运行(也许它的速度只是降低得太慢以至于不明显,在这种情况下我希望它减速得更快)。

这是我刚刚尝试并“希望”能工作的代码,但没有。我认为我在这里遇到的问题是下一帧再次分配了一个新的axisHorizo​​ntal/axisVertical变量值,该值取自Input.GetAxis,据我所知,这是不可能的改变。

这意味着大于 0/0/0 的 motionForce 和 AddForce 将在下一帧再次激活。

using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour 

    public float movementSpeed = 7f;
    private Rigidbody rigidSphere;

    void Start() 
        rigidSphere = GetComponent<Rigidbody>();
    

    void FixedUpdate() 
        float axisHorizontal = Input.GetAxis("Horizontal");
        float axisVertical = Input.GetAxis("Vertical");

        Vector3 movementForce = new Vector3(axisHorizontal, 0.0f, axisVertical);
        rigidSphere.AddForce(movementForce * movementSpeed);

        if (Input.GetKeyDown(KeyCode.R)) 
            transform.position = new Vector3(0, 0, 0);
            rigidSphere.AddForce(0, 0, 0);
            axisHorizontal = 0;
            axisVertical = 0;
        
    

我尝试在谷歌上搜索如何更改从 GetAxis 获取的值,但其他人声称这样做是不可能的。所以我真的不知道如何让它不会永远移动......

在我学习 Unity 的那两天里,我还得到了一个“奖励”问题,但它们不值得一个单独的问题,也许如果它们之前已经回答过(我一直无法找到任何对我有帮助的文档),然后给我一个链接,告诉我在哪里可以找到我的问题的答案。

问题是,如何在按下按钮(W/A/S/D,输入管理器中正/负按钮的默认值)后让球停止移动?例如,我按“W”一秒钟,但球会一直向前移动,永远不会停止。

我想要实现的是在我按下“W”一秒钟后,几秒钟后球会完全停止,看起来 GetAxis 的值永远不会回到 0。我试着用谷歌搜索一下它,我认为这与输入管理器中的重力有关 - 我尝试更改它,但球仍然会永远移动,我注意到唯一改变的是球的速度。

如果有人能帮助我解决这些问题,我将不胜感激。

【问题讨论】:

我会说在 R 上,计算出球体的力并在相反的方向上施加相等的力(但不要问我如何)。 【参考方案1】:

我正在尝试添加一个重新启动按钮,它将球传送回 起始位置/原点。一切都很好,但球会保持 重新启动后移动,但我希望它留在原地不动 自己。

我看到您尝试使用rigidSphere.AddForce(0, 0, 0); 解决此问题。这只会将0,0,0 添加到球正在移动的现有力中。解决方案是将刚体速度设置为0

rigidSphere.AddForce(0, 0, 0); 替换为rigidSphere.velocity = Vector3.zero;

即使您执行此操作,Input.GetAxis 的值也会随着时间的推移而增加和减少,然后才会达到0。因此,在下一帧中,球可能仍会因此而移动。

要阻止这种情况,请将Input.GetAxis 替换为Input.GetAxisRaw

释放键时Input.GetAxisRaw 将立即返回到0

我想要实现的是在我按下“W”一秒钟之后, 几秒钟后球会完全停止,看起来 GetAxis 的值永远不会回到 0

由于球是滚动的,所以需要增加球的角阻力。这将使球在释放键后停止滚动。角阻力位于附在球上的刚体上。如果这还不够,还要增加阻力。

【讨论】:

谢谢!我注意到的唯一一件事是球会移动一点点,因为将设置一个小的轴水平/垂直值。有没有办法让球在 0.5 秒内完全无法移动(冻结)? 当然,将Input.GetAxis 替换为Input.GetAxisRaw。这应该完全杀死它。告诉我。

以上是关于重新开始位置后如何阻止球体自行移动?的主要内容,如果未能解决你的问题,请参考以下文章

阻止'Div'改变位置'悬停'

在 OpenGL 中移动 3d 形状

如何在不询问位置的情况下工作天气

如何强制 Java FX 场景刷新?

如何在 3D pyqtgraph 实现中设置 GLMeshItem 的绝对位置

如何通过鼠标移动事件获取相机位置并在three.js中转换为屏幕坐标? [关闭]