Прыжки, когда пользователь отпускает кнопку мыши?

Сценарий делает прыжок GameObject, используя реалистичную гравитацию и достигая определенной цели. GameObject перескакивает относительно цели, тем самым корректируя траекторию. Он также работает во время перемещения целевой точки.

Когда 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;
    }
}

С помощью сценария выше GameObject всегда перескакивает с достигнутого положения. Это то, что я имею в виду под "непрерывным циклом прыжков",

Скрипт 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 редактор сбрасывается каждый раз.

EDIT: у меня были жалобы на мои скрипты, работающие так, как они должны быть (Input.GetMouseButtonUp(0) Если мои скрипты работают на вас, загрузите примерный проект, в котором мои скрипты работают правильно, в качестве ответа Я подозреваю, что мои другие скрипты мешают... Спасибо.

+1
05 янв. '16 в 12:02
источник поделиться
1 ответ

Если вы хотите "продолжить" прыжки, используйте GetMouseButton(...) вместо GetMouseButtonDown(...) поскольку последний будет 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);
    }
}
0
05 янв. '16 в 14:58
источник

Посмотрите другие вопросы по меткам или Задайте вопрос