c# - 重新启动位置后如何阻止球体自行移动?

标签 c# unity3d game-physics

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

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

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

这意味着大于 0/0/0 的 movementForce 和 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。我试图用谷歌搜索它,我认为这与输入管理器中的重力有关 - 我尝试更改它,但球仍将永远移动,我注意到唯一改变的是球的速度。

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

最佳答案

I am trying to add a restart button, that teleports the ball back to the start-position/origin. It all works good, but the ball will keep moving after I restart, but I want it to stay in a spot and not move by itself.

我看到您尝试使用 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

What I want to achieve is after I for example press 'W' for a second, after a few seconds the ball will completely stop, it just seems that the value from GetAxis never goes back to 0.

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

enter image description here

关于c# - 重新启动位置后如何阻止球体自行移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40771660/

相关文章:

javascript - 在 Unity WebPlayer 中使用 FFmpeg

c# - 来自 eventTrigger OnPointerDown 的连续输入

C# 将事件处理程序添加到已在运行时从程序集中加载的类

c# - 如何检测应用程序是否正在从 DVD 运行?

c# - ML Agents - 多个代理中断训练

c++ - 3D碰撞检测: convex hull vs convex hull ,需要位置和法线

c# - 获取在列表中出现两次的对象列表

unity3d - 将墨卡托投影转换为等距柱状投影的着色器?

JavaScript 多边形碰撞检测

javascript - Phaser P2 Sprite Scale Change 不适用于所有组 child