【问题标题】:Unity Jump function issueunity Jump 功能问题
【发布时间】:2014-05-21 21:00:36
【问题描述】:

过去一天我一直在编写这个脚本。出于某种原因,只要动画师处于活动状态,我的角色就​​不会跳跃。我已经进入动画(只有一个)并删除了对动画的所有引用,在任何地方放置一个位置,但问题仍然存在。

我发现如果我使用我正在使用的 Co-routine,我可以让我的玩家跳跃。但是,我仍然是使用它们的新手,我无法弄清楚为什么我的播放器一旦添加了力量就不会倒在地上。而且我的播放器只有在单击按钮时才会向上移动。有人可以看看我的脚本并告诉我我做错了什么吗?

public float jumpSpeed = 100.0f;
public float jumpHeight = 2.0f;
public AudioClip jumpSound;

private GameObject pos;
private bool moving;
private bool isJumping;

void Start()
{

}

// Update is called once per frame
void Update () 
{
    if(Input.GetMouseButtonDown(0))// && !moving)
    {
        isJumping = true;
        StartCoroutine(JumpPlayer(gameObject.transform.localPosition));
    }
    else
    {
        isJumping = false;
    }
}

IEnumerator JumpPlayer(Vector3 startPos)
{
    Vector3 jump = new Vector3(transform.localPosition.x, jumpHeight, transform.localPosition.z);

    float t = 0f;

    t += Time.deltaTime / jumpSpeed;
    rigidbody.AddForce(Vector3.up * jumpSpeed);
    //gameObject.transform.localPosition = Vector3.Lerp(startPos, jump, 0.5f);
    //isJumping = false;
    yield return null;
}

【问题讨论】:

  • 有类似(或接近)的问题,答案是使用Impulse 代替AddForce。

标签: c# unity3d


【解决方案1】:

首先,你对协程的使用并没有做任何特别的事情——因为它最后只做yield return null,它会在一个帧中运行然后退出。您可以将其设为常规的 void 函数,并且您不应该看到任何行为变化。

删除其他冗余代码,你就得到了这个:

if(Input.GetMouseButtonDown(0))
{
    rigidbody.AddForce(Vector3.up * jumpSpeed);
}

此力仅针对单个帧添加:按下鼠标按钮的帧(如果您使用 Input.GetMouseButton 代替,您会看到应用于多个帧的力)。

您说“我的播放器仅在单击按钮时向上移动”但我不清楚为什么会出现问题 - 也许您的意思是只要按住按钮,播放器就应该继续向上移动,其中情况你应该参考我的上一段。

玩家不再跌倒的最明显原因与RigidBody 组件有关:您是否将重量和阻力设置为合适的值?一个简单的测试方法是在场景开始时将播放器放置在离地面一定距离的位置,并确保在场景开始时它们掉到地上。

另一个原因可能是您在Update 循环中使用了.AddForce 的默认覆盖。此方法的默认行为在 FixedUpdate 调用期间应用强制,您可能会发现使用 ForceMode.Impulse 或 ForceMode.VelocityChange 会为您提供所需的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2021-08-07
    • 2017-05-10
    • 2020-09-12
    相关资源
    最近更新 更多