Гравитация во время прыжка игрока на батуте

Так что мне удалось исправить мой код батута, чтобы игрок подпрыгивал, как если бы он был на батуте. Однако у меня есть две проблемы с этим кодом.

Во-первых, когда вы прыгаете на батуте, он фактически запускает игрока прямо в стратосферу, и он просто продолжает двигаться, никогда не останавливаясь, как будто нет гравитации, которая могла бы его сбить. Несмотря на то, что я проверил гравитацию в настройках жесткого тела игрока.

И, во-вторых, даже если игрок не находится рядом с батутом, например. на платформе, к которой не прикреплен код сценария батута, игрок будет подброшен в воздух при немедленном запуске игры.

Код выглядит следующим образом:

using UnityEngine;
using System.Collections;

public class small_trampoline_bounce : MonoBehaviour
{

bool willBounce = false;
float bounceHeight = 10;
public Transform Player;


// Use this for initialization
void Start()
{
}

// Update is called once per frame
void Update()
{
    Vector3 velocity = Player.rigidbody.velocity;

    if (willBounce)
    {

        Player.rigidbody.velocity = new Vector3(velocity.x, 0, velocity.z);

        Player.rigidbody.AddForce(0, bounceHeight, 0, ForceMode.Impulse);


        willBounce = false;
    }
}

void OnCollisionEnter(Collision Trampoline)
{

    if (Trampoline.gameObject.name == "Player")
    {
        willBounce = true;
    }

}

}

Также это текущее состояние настроек как батута, так и плеера.

Настройки плеера: http://gyazo.com/b4d924849a86e5158361f6081948e39f.png

Настройки батута: http://gyazo.com/ded2884b93dd53c9e1b7fabc57e4fe51.png


person Marc Brooks    schedule 13.02.2014    source источник
comment
Какая у вас установлена ​​гравитация (это что-то вроде Правка --› Настройки --› Физика)   -  person BlueRaja - Danny Pflughoeft    schedule 14.02.2014
comment
Я вижу, вы включили опцию «Использовать гравитацию» в плеере, но вы также где-то установили Physics.gravity?   -  person Steven Hansen    schedule 14.02.2014
comment
@BlueRaja-DannyPflughoeft настройки моей гравитации следующие:   -  person Marc Brooks    schedule 14.02.2014
comment
@StevenHansen Код, который вы видите, — единственный код, который у меня есть на данный момент. Для моих настроек гравитации см. ссылку, которую я только что разместил для BlueRaja.   -  person Marc Brooks    schedule 14.02.2014


Ответы (2)


Я не знаю, решит ли это вашу проблему, но, возможно, попробуйте следующее:

using UnityEngine;
using System.Collections;

public class small_trampoline_bounce : MonoBehaviour
{

float bounceHeight = 10;


// Use this for initialization
void Start()
{
}

// Update is called once per frame
void Update()
{
}

void OnCollisionEnter(Collision Trampoline)
{

    if (Trampoline.gameObject.name == "Player")
    {
        Vector3 velocity = Trampoline.gameObject.rigidbody.velocity;
        Trampoline.gameObject.rigidbody.velocity = new Vector3(velocity.x, 0, velocity.z);

        Trampoline.gameObject.rigidbody.AddForce(0, bounceHeight, 0, ForceMode.Impulse);
    }

}

}

Таким образом, addforce применяется только к игроку, ударяющему по батуту, и должен срабатывать только один раз. Это может не решить вашу проблему, так как теоретически ваш код должен работать, но кто знает.

person Steven Mills    schedule 14.02.2014

Хорошо, после возни с кодом мне удалось заставить его работать правильно, конечным результатом было то, что вместо этого я закончил добавлять код к мотору персонажа игрока, чтобы, когда игрок сталкивается с батутом, он реализовывал нисходящую силу, которая обращала бы вспять отскок игрока на определенную высоту, указанную в инспекторе единства. Код ниже показывает конечный результат.

public float speed;
public float jumpSpeed; 
public float gravity;
public Vector3 moveDirection = Vector3.zero;
public float downwardForce;
public float terminalVelocity;
public float airSpeed;

void Update() 
{
    CharacterController controller = GetComponent<CharacterController>();
    // is the controller on the ground?
    if (controller.isGrounded) 
    {
        //Feed moveDirection with input.
        moveDirection = new Vector3 (Input.GetAxis ("Horizontal"), 0, Input.GetAxis ("Vertical"));
        moveDirection = transform.TransformDirection (moveDirection);
        downwardForce = 0;
        //Multiply it by speed.
        moveDirection *= speed;

        //Jumping
        if (Input.GetButton ("Jump"))
        {
            downwardForce -= jumpSpeed;
        }   
    } 
    else 
    {
        if (downwardForce < terminalVelocity)
        {
                moveDirection *= airSpeed;
                downwardForce += gravity * Time.deltaTime;
        }
    }
    //Applying gravity to the controller
    moveDirection.y -= downwardForce * Time.deltaTime;
    //Making the character move
    controller.Move(moveDirection * Time.deltaTime);
}
void OnTriggerEnter(Collider collider)
{           
    if (collider.tag == "smallTrampoline") 
    {
        downwardForce *= -1 * collider.gameObject.transform.GetComponent<SmallTrampolineBounce> ().jumpSpeed;

    }
    if (collider.tag == "largeTrampoline") 
    {
        downwardForce *= -2 * collider.gameObject.transform.GetComponent<SmallTrampolineBounce> ().jumpSpeed;
    }

Я также реализовал airSpeed ​​как способ ускорить движение игрока, когда он находится в воздухе, так как до этого игрок вообще не мог двигаться и просто застревал, прыгая вверх и вниз.

person Marc Brooks    schedule 20.03.2014