2016-08-19 2 views
0

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

using UnityEngine; 
using System.Collections; 

public class MovePlayer : MonoBehaviour 
{ 
    Vector3 endPos; 
    int numBackwards = 0; 
    bool jumping = false; 
    public Rigidbody rigidBody; 
    //public Collider theCollider; 

    void Start() 
    { 
     rigidBody = GetComponent<Rigidbody>(); 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     rigidBody.freezeRotation = true; 

     endPos = gameObject.transform.position; 
     if (!jumping) 
     { 
      if (Input.GetButtonDown("up") && gameObject.transform.position == endPos) { 
       if (numBackwards < 0) 
       { 
        numBackwards++; 
       } 
       else 
       { 
        UpdateScore.score++; 
       } 
       transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World); 
       transform.Translate(Vector3.forward * 110 * Time.deltaTime, Space.World); 
      } 
      else if (Input.GetButtonDown("down") && gameObject.transform.position == endPos) 
      { 
       transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World); 
       transform.Translate(-Vector3.forward * 110 * Time.deltaTime, Space.World); 
       numBackwards--; 
      } 
      else if (Input.GetButtonDown("left") && gameObject.transform.position == endPos) 
      { 
       transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World); 
       transform.Translate(Vector3.left * 110 * Time.deltaTime, Space.World); 
      } 
      else if (Input.GetButtonDown("right") && gameObject.transform.position == endPos) 
      { 
       transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World); 
       transform.Translate(Vector3.right * 110 * Time.deltaTime, Space.World); 
      } 
     } 
    } 

    void OnCollisionEnter(Collision other) 
    { 
     if (other.gameObject.CompareTag("Ground")) 
      jumping = false; 
    } 

    void OnCollisionExit(Collision other) 
    { 
     if (other.gameObject.CompareTag("Ground")) 
      jumping = true; 
    } 
} 

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

public float distance;  
public float fspeed; 
public float uspeed; 

//PRIVATE 
private Rigidbody rigidBody; 


void Awake() 
{ 
    rigidBody = GetComponent<Rigidbody>(); 
    rigidBody.freezeRotation = true; 
} 

void FixedUpdate() 
{ 
    if (Physics.Raycast(transform.position, -Vector3.up, distance + 0.1F)) 
    { 
     if (Input.GetKeyDown(KeyCode.UpArrow)) 
     { 
      rigidBody.AddForce(new Vector3(0, uspeed, fspeed)); 
     } 

     if (Input.GetKeyDown(KeyCode.DownArrow)) 
     { 
      rigidBody.AddForce(new Vector3(0, uspeed, -fspeed)); 
     } 

     if (Input.GetKeyDown(KeyCode.LeftArrow)) 
     { 
      rigidBody.AddForce(new Vector3(fspeed, uspeed, 0)); 
     } 

     if (Input.GetKeyDown(KeyCode.RightArrow)) 
     { 
      rigidBody.AddForce(new Vector3(-fspeed, uspeed, 0)); 
     } 
    } 
} 

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

ответ

2

Использовать ForceMode. Impulse отлично подходит для прыгающего персонажа, выглядит реалистично, так как использует массу. И это не непрерывно. Также требуется меньшее значение для большего эффекта.

if (Input.GetKey(KeyCode.UpArrow)) 
{ 
    rigidBody.AddForce(new Vector3(0, uspeed, fspeed), ForceMode.Impulse); 
} 

Оставив параметр режима силы пустые причины Force быть по умолчанию, как ForceMode, которая непрерывна. Который вызывает скольжение больше, чем инерция.

Для игнорирования инерциального скольжения сбрасывайте скорость при касании земли.

void OnCollisionEnter(Collision other) 
{ 
    if (other.gameObject.tag == "Ground") 
    { 
     jumping = false; 

     rigidBody.velocity = Vector3.zero; 
    }   
} 

Проверка !jumping до ввода уже исключает прыжки на воздухе.

+0

Я не могу заставить это работать, вы знаете, почему это приведет к тому, что это не сработает? –

+0

Что происходит? –

+0

Это просто не движется. –

Смежные вопросы