2014-02-19 6 views
1

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

Где я ошибаюсь и что могу сделать, чтобы исправить это?

using UnityEngine; 

using System.Collections; 



[RequireComponent(typeof(CharacterController))] 

public class small_bounce_script: MonoBehaviour { 

public float speed = 6.0F; 

public float jumpSpeed = 8.0F; 

public float gravity = 20.0F; 

private Vector3 moveDirection = Vector3.zero; 

private Vector3 bounce = Vector3.zero; 



void Update() { 



    CharacterController controller = GetComponent<CharacterController>(); 



    if (controller.isGrounded) { 

     if (bounce.sqrMagnitude > 0) { 

      moveDirection = bounce; 

      bounce = Vector3.zero; 

     } else { 

      moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); 

      moveDirection = transform.TransformDirection(moveDirection); 

      moveDirection *= speed; 

     } 



     if (Input.GetButton("Jump")) 

      moveDirection.y = jumpSpeed; 

    } 



    moveDirection.y -= gravity * Time.deltaTime; 

    controller.Move(moveDirection * Time.deltaTime); 



} 





void OnTriggerEnter(Collider other) { 

    Debug.Log ("Controller collider hit"); 

    Rigidbody body = other.attachedRigidbody; 




    // Only bounce on static objects... 

    if ((body == null || body.isKinematic) && other.gameObject.controller.velocity.y < -1f) { 

     float kr = 0.5f; 

     Vector3 v = other.gameObject.controller.velocity; 

     Vector3 n = other.normal; 

     Vector3 vn = Vector3.Dot(v,n) * n; 

     Vector3 vt = v - vn; 

     bounce = vt -(vn*kr); 

    } 

} 

}

ответ

1

Батут реагирует как spring device. Предположим, что гравитация находится в направлении Y, а поверхность батута позиционируется в плоскости X, Z.

Тогда ваша координата Y y пропорциональна синусоидальной функции во время OnTriggerStay. Velocity v в направлении Y как 1-я производная от y является тогда косинусной функцией, а X и Z-скоростью остаются постоянными.

у (т) = YMAX * sin (е * т)
v (т) = YMAX * F * Cos (е * т)

Учитывая сохранение энергии, мы имеем:

Е = 0,5 * м * vMax² = 0,5 * к * yMax²
=> YMAX = ± SQRT (к/м) * Vmax

  • Vmax: = скорость в направлении Y при ударе о батут. ± потому, что для посадки и взлета
  • YMAX: = максимальная амплитуда при v == 0, т.е. HWO глубоко должен игрок раковина перед возвращением
  • K: = пружинный константа, определяющая поведение батут т.е. насколько она сильна
  • м: = масса игрока
  • е: = SQRT (к/м)

Так все, что вам нужно сделать, это играть с константой весны и иметь что-то подобное в вашем Update методе:

Vector3 velocity = rigidbody.velocity; 
float elapsedTime = Time.time - timestampOnEnter; 
velocity.y = YMax * FConst * Mathf.cos (FConst * elapsedTime); 
rigidbody.velocity = velocity; 

Участник var timestampOnEnter взято в OnTriggerEnter, FConst - это константа, которую мы назвали f в части математики.