【问题标题】:Jumping when user releases mouse button?用户释放鼠标按钮时跳转?
【发布时间】:2016-01-14 03:03:17
【问题描述】:

脚本使用逼真的重力使游戏对象跳跃并到达特定目标。 GameObject relative 跳转到目标,从而调整其轨迹。它在目标点移动时也有效。

当 GameObject 到达目标时,目标会跳到更高的位置 (position.y += 50) 并且 GameObject 会朝那里跳跃。因此,我们有一个“连续跳跃循环”。

脚本:

using UnityEngine;
using System.Collections;

public class Jumper : MonoBehaviour
{
    public Vector3 _gravity = 9.8f * Vector3.down;
    public bool stillJumping = true;
    public GameObject Target1;

    public void SetVelocityToJump(GameObject goToJumpTo, float timeToJump)
    {
        StartCoroutine(jumpAndFollow(goToJumpTo, timeToJump));
    }

    private IEnumerator jumpAndFollow(GameObject goToJumpTo, float timeToJump)
    {
        var startPosition = transform.position;
        var targetTransform = goToJumpTo.transform;
        var lastTargetPosition = targetTransform.position;
        var initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);

        var progress = 0f;
        while (progress < timeToJump)
        {
            progress += Time.deltaTime;
            if (targetTransform.position != lastTargetPosition)
            {
                lastTargetPosition = targetTransform.position;
                initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);
            }

            transform.position = startPosition + (progress * initialVelocity) + (0.5f * Mathf.Pow(progress, 2) * _gravity);
            yield return null;
        }

        OnFinishJump(target, timeToJump);
    }

    private void OnFinishJump(GameObject target, float timeToJump)
    {
        if (stillJumping)
        {
            Vector3 temp1 = Target1.transform.position;
            temp1.y += 12.5f;
            Target1.transform.position = temp1;
            StartCoroutine(jumpAndFollow(target, timeToJump));
        }
    }

    private Vector3 getInitialVelocity(Vector3 toTarget, float timeToJump)
    {
        return (toTarget - (0.5f * Mathf.Pow(timeToJump, 2) * _gravity)) / timeToJump;
    }
}

使用上面的脚本,游戏对象总是从它到达的位置跳转。这就是我所说的“连续跳跃循环”的意思

JumpTarget 的脚本:

public class JumpTarget : MonoBehaviour
{
    public Jumper Jumper;
    public float TimeToJump;

    public void Start()
    {
        if (Jumper != null) Jumper.SetVelocityToJump(gameObject, TimeToJump);
    }
}

这里的问题是:我们怎样才能让 GameObject 继续在 (Input.GetMouseButtonUp(0)) 上跳跃每次(不仅仅是第一次跳跃)?我不能安静地想通出去。

下面的代码应该可以实现这一点,但 GameObject 甚至不跳转!

if (Input.GetMouseButtonUp(0) && Jumper != null) Jumper.SetVelocityToJump(gameObject, TimeToJump);

我尝试调试,但不幸的是,我的 Unity 编辑器每次都崩溃。

编辑:我抱怨我的脚本按应有的方式运行 (Input.GetMouseButtonUp(0) 如果我的脚本适合您,请上传一个示例项目,其中我的脚本可以正常工作,作为答案。我怀疑我的其他脚本正在干扰...谢谢。

【问题讨论】:

  • 你的代码是在JumpTargetUpdate()函数中使用了Input.GetMouseButtonUp吗?
  • @Adam H 问题已编辑。

标签: c# unity3d unity5


【解决方案1】:

如果您想“继续”跳跃,请使用GetMouseButton(...) 而不是GetMouseButtonDown(...),因为后者只会触发一次。

using UnityEngine;
using System.Collections;

public class Jumper : MonoBehaviour
{
    public Vector3 _gravity = 9.8f * Vector3.down;
    public GameObject Target1;

    public void SetVelocityToJump(GameObject goToJumpTo, float timeToJump)
    {
        StartCoroutine(jumpAndFollow(goToJumpTo, timeToJump));
    }

    private IEnumerator jumpAndFollow(GameObject goToJumpTo, float timeToJump)
    {
        var startPosition = transform.position;
        var targetTransform = goToJumpTo.transform;
        var lastTargetPosition = targetTransform.position;
        var initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);

        var progress = 0f;
        while (progress < timeToJump)
        {
            progress += Time.deltaTime;
            if (targetTransform.position != lastTargetPosition)
            {
                lastTargetPosition = targetTransform.position;
                initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);
            }

            transform.position = startPosition + (progress * initialVelocity) + (0.5f * Mathf.Pow(progress, 2) * _gravity);
            yield return null;
        }

        OnFinishJump(target, timeToJump);
    }

    private void OnFinishJump(GameObject target, float timeToJump)
    {
        if (Input.GetMouseButton(0))
        {
            Vector3 temp1 = Target1.transform.position;
            temp1.y += 12.5f;
            Target1.transform.position = temp1;
            StartCoroutine(jumpAndFollow(target, timeToJump));
        }
    }

    private Vector3 getInitialVelocity(Vector3 toTarget, float timeToJump)
    {
        return (toTarget - (0.5f * Mathf.Pow(timeToJump, 2) * _gravity)) / timeToJump;
    }
}

public class JumpTarget : MonoBehaviour
{
    public Jumper Jumper;
    public float TimeToJump;

    public void Start()
    {
        if (Jumper != null && Input.GetMouseButton(0)) Jumper.SetVelocityToJump(gameObject, TimeToJump);
    }
}

【讨论】:

  • 您好,我在Input.GetMouseButtonUp(0) 上说过。当用户释放鼠标按钮时。那是我的问题。
  • 正如我之前所说,当用户释放鼠标按钮时,游戏对象不会跳转,使用您的代码。
  • “当用户释放鼠标按钮时,游戏对象不跳转”不是特定问题。我问你 100 次代码是否到达 if 语句,如果 Jumper 实际上不是 null。我认为您甚至都没有尝试调试它。没有人会做一个示例项目,因为这不是一个代码编写服务。
  • 我已经告诉过你两次,当我尝试调试时,我的 Unity 编辑器崩溃了。而且我只有一台电脑……现在对我来说最好的方法是将工作项目与非工作项目进行比较。
  • 不要在 Unity 编辑器中调试,在 Monodevelop 或 Visual Studio 中调试。如果你没有调试你的代码,那么这意味着你甚至没有尝试帮助自己。这里没有人喜欢帮助那些不尝试帮助自己的人。要求一个示例项目,是要求某人为您创建一个工作项目,基本上是要求某人为您解决整个问题,我并不是说我不会这样做,我是说这里没有人将要这样做。我只能向您推荐的是,如果您的调试问题出现在您身上,请解决该问题并开始调试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多