2016-07-07 3 views
1

Я работаю над сценарием диспетчера символов, и все работает нормально, но проблема в том, что как только мой игрок начинает падать, он так внезапно и дергается. Я хотел бы, чтобы игрок постепенно падать вниз, это мой персонаж контроллер сценария -Smooth fall in Unity - C#

using UnityEngine; 
using System.Collections; 

public class CharacterController : MonoBehaviour { 

    public float inputDelay = 0.1f; 
    public float forwardVel = 12; 
    public float rotateCel = 12; 
    public float JumpHeight = 20; 
    public Vector3 Gravity = new Vector3 (0, -180, 0); 
    public bool CanPress; 
    private float jumpTime; 
    public float _initialJumpTime = 0.4f; 
    //[HideInInspector] 
    public bool isGrounded; 
    Quaternion targetRotation; 
    Rigidbody rBody; 
    Vector3 forwardInput, turnInput; 
    public bool HasJumped; 

    public Quaternion TargetRotation 
    { 
     get {return targetRotation;} 
    } 
    // Use this for initialization 
    void Start() { 
     Physics.gravity = Gravity; 
     targetRotation = transform.rotation; 
     if (GetComponent<Rigidbody>()) 
      rBody = GetComponent<Rigidbody>(); 
     else { 
      Debug.LogError("Character Needs Rigidbody"); 
     } 

    // forwardInput = turnInput = 0; 
     forwardInput = turnInput = Vector3.zero; 
    } 

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

     GetInput(); 
     //Turn(); 

     if (CanPress == true) { 
      if (Input.GetKeyDown (KeyCode.Space)) { 
       HasJumped = true; 
       jumpTime = _initialJumpTime; 
      } 
     } 

     if (HasJumped == true) { 
      rBody.useGravity = false; 
      jumpTime -= 1 * Time.deltaTime; 
      if (jumpTime > 0) { 
      Jump(); 
      } 
      else { 
       HasJumped = false; 
       rBody.useGravity = true; 
      } 
     } 
    } 


    void GetInput() { 
     //forwardInput = Input.GetAxis ("Vertical"); 
     //turnInput = Input.GetAxis ("Horizontal"); 
     forwardInput = new Vector3 (Input.GetAxis ("Horizontal") * rotateCel, 0, Input.GetAxis ("Vertical") * forwardVel); 
     forwardInput = transform.TransformDirection (forwardInput); 
     if (Input.GetKeyUp (KeyCode.Space)) { 
      //HasJumped = false; 
     } 


    } 

    void Jump() { 

      Vector3 up = transform.TransformDirection (Vector3.up); 
     GetComponent<Rigidbody>().AddForce (up * 5, ForceMode.Impulse); 

    } 
    void FixedUpdate() { 

     Run(); 
    } 
    void Run() { 
     if (Mathf.Abs (10) > inputDelay) { 
      //Move 
      //rBody.velocity = transform.forward * forwardInput * forwardVel; 
      rBody.velocity = forwardInput; 
     } else { 
      //zero velocity 
      rBody.velocity = Vector3.zero; 

     } 

    } 
    void Turn() { 
    // targetRotation *= Quaternion.AngleAxis (rotateCel * turnInput * Time.deltaTime, Vector3.up); 
    // transform.rotation = targetRotation; 
    } 

    void OnTriggerEnter(Collider col) { 
     isGrounded = true; 
     CanPress = true; 
    } 

    void OnTriggerExit(Collider col) { 
     isGrounded = false; 
     CanPress = false; 
    } 

} 

Мой персонаж имеет Rigidbody attactches, которая использует гравитацию и имеет X, Y, Z для ограничения вращения.

  • Игрок плавно поднимается и плавно падает, но переход между ними очень резкий и внезапный.

Спасибо за помощь. :)

+0

Вы строите свой собственный контроллер символов? Если вам интересно, вам интересно, почему вы не используете встроенный контроллер символов как часть Unity Standard Assets, что делает все это для вас :-) – Tom

+0

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

ответ

1

Хорошо, поэтому я взял ваш код и сыграл.

Я думаю, проблема заключалась в том, что в вашей функции Run() вы изменяли скорость rigidbody, которая влияла на ваши прыжки.

Я извлек этот материал и немного улучшил ваш скрипт и протестировал его. Прикрепите это к капсуле с rigidbody на ней, с нижним этажом с box collider и нажмите пробел, и вы должны получить плавный прыжок.

Ваш новый (МОГ) Сценарий:

using UnityEngine; 
using System.Collections; 

public class CharacterController : MonoBehaviour 
{ 
    public float inputDelay = 0.1f; 
    public float forwardVel = 12; 
    public float rotateCel = 12; 
    public float jumpHeight = 10; 
    private float jumpTime; 
    public float _initialJumpTime = 0.4f; 
    //[HideInInspector] 
    public bool isGrounded; 
    Quaternion targetRotation; 
    Rigidbody rBody; 
    Vector3 forwardInput, turnInput; 
    public bool canJump; 

    public Quaternion TargetRotation 
    { 
     get { return targetRotation; } 
    } 

    void Start() 
    { 
     targetRotation = transform.rotation; 
     if (GetComponent<Rigidbody>()) 
      rBody = GetComponent<Rigidbody>(); 
     else 
     { 
      Debug.LogError("Character Needs Rigidbody"); 
     } 

     // forwardInput = turnInput = 0; 
     forwardInput = turnInput = Vector3.zero; 
    } 

    void Update() 
    { 
     GetInput(); 
     //Turn(); 

     if (Input.GetKeyDown(KeyCode.Space) && canJump) 
     { 
      rBody.AddForce(Vector3.up * jumpHeight, ForceMode.Impulse); 
     } 
    } 


    void GetInput() 
    { 
     //forwardInput = Input.GetAxis ("Vertical"); 
     //turnInput = Input.GetAxis ("Horizontal"); 
     forwardInput = new Vector3(Input.GetAxis("Horizontal") * rotateCel, 0, Input.GetAxis("Vertical") * forwardVel); 
     forwardInput = transform.TransformDirection(forwardInput); 
    } 

    void FixedUpdate() 
    { 
     //Run(); 
    } 

    void Run() 
    { 
     //HERE YOU SET THE RIGIDBODYS VELOCITY, WHICH IS CAUSING YOUR JUMP TO NOT WORK PROPERLY. DO NOT MODIFY THE VELOCITY 
     //OF A RIGIDBODY 
     if (Mathf.Abs(10) > inputDelay) 
     { 
      //Move 
      //rBody.velocity = transform.forward * forwardInput * forwardVel; 
      rBody.velocity = forwardInput; 
     } 
     else 
     { 
      //zero velocity 
      rBody.velocity = Vector3.zero; 
     } 
    } 

    void Turn() 
    { 
     // targetRotation *= Quaternion.AngleAxis (rotateCel * turnInput * Time.deltaTime, Vector3.up); 
     // transform.rotation = targetRotation; 
    } 

    void OnCollisionEnter(Collision col) 
    { 
     isGrounded = true; 
     canJump = true; 
    } 

    void OnCollisionExit(Collision col) 
    { 
     isGrounded = false; 
     canJump = false; 
    } 
} 

Пара пунктов:

  • имя ваши переменные inThisKindOfFashion (jumpHeight, isOnGround, camelCaseExample), имеющие переменные, начинающиеся с буквы как Gravity и JumpHeight могут запутаться.

  • как кто-то однажды ответил на один из моих вопросов, не изменяйте скорость твердого тела, если вы не знаете, что делаете! Кажется странным, но после этого совета у меня никогда не было проблемы с тех пор!

  • В вашем сценарии я использовал OnCollision, а не OnTrigger. Если вы положите пол box collider под своим capsule с collider, rigidbody и этот скрипт, ваш персонаж остановится на земле. Если вы используете триггер, он провалится (по крайней мере, по моему опыту!)

Счастливое кодирование!:-)


Редактировать Чтобы ответить на Ваши комментарии:

«Как вы предлагаете мне переместить игрока»

Движение может быть сделано различными способами , но я обычно использую это все время, если мне не нужно что-то делать по-другому:

void Update() 
{ 
    if (Input.GetKeyDown(KeyCode.LeftArrow)) 
    { 
     transform.position += Vector3.left * speed * Time.deltaTime; //speed could be 5f, for example (f means float); 
    } 

    // then do the same for other directions, RightArrow -.right, UpArrow - .forward, DownArrow - .back 
} 

«Как я регулирую как быстро игрок прыгает»

Вы можете изменить переменную jumpHeight для более высокого или меньшего прыжка. Если быстрее вы имеете в виду падение быстрее, перейдите в «Редактирование»> «Настройки проекта»> «Физика»> и измените гравитацию Y на нечто меньшее, например -20.

Учебники можно найти here

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

+0

Ничего себе, спасибо @ Тому, я отвечу на этот совет :) Я проверю код и скажу, работает ли он. :) –

+0

Нет проблем! :-) – Tom

+0

Эй, @ Теперь прыжок отлично работает. всего несколько вопросов. Как вы предлагаете мне переместить игрока вместо Rigidbody или просто использовать Vector3.Lerp? Как настроить скорость воспроизведения плеера, и поскольку мне всего 13, и у меня нет большого опыта в кодировании, есть ли какой-либо веб-сайт или учебник, в котором подробно описывается кодирование C#? Большое вам спасибо за ваше время и помощь. Счастливое кодирование вам! : D –