2016-05-15 2 views
0

Итак, базойси мне нужен мой персонаж, чтобы подняться, когда нажаты space или mousebutton. Я добавил rigbody 2d и box colider 2d в свой gameobject (плеер). Проблема в том, что когда я ударил space или mousebutton, он прыгал не постоянно вверх.UNITY 2D: Игрок, летящий, когда космос/мышь удерживается

Вот мой код:

using UnityEngine; 
using System.Collections; 

public class PixelMovement : MonoBehaviour { 

    Vector3 velocity = Vector3.zero; 
    public Vector3 PressVelocity; 
    public float maxSpeed = 5f; 
    public float fowardSpeed = 1f; 
    public float jumpForce; 

    bool didPress = false; 

    // Use this for initialization 
    void Start() { 

    } 

    //Do Graphic & Input updates 
    void Update() 
    { 
     if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0)) 
     { 
      didPress = true; 
     } 
    } 

    //Do physics engine updates here 
    void FixedUpdate() 
    { 
     velocity.x = fowardSpeed; 
     if (didPress == true) 
     { 
      didPress = false; 
      velocity += PressVelocity * Time.deltaTime *jumpForce; 

     } 

     velocity = Vector3.ClampMagnitude(velocity, maxSpeed); 
     transform.position += velocity * Time.deltaTime; 
    } 
} 
+0

Я пробовал свой код и отлично работает на своем компьютере. [Здесь я оставил ссылку с видео] (https://youtu.be/-JzNxQdYJMs). Есть ли у вас другой скрипт, прикрепленный к этому GameObject? – ORParga

+0

Это '2d' не' 3d' – pHenomen

+0

Я прикрепил 'box colider 2d' и снял флажок' срабатывает', а также добавил 'rigbody2d' – pHenomen

ответ

0

Хорошо, это работает для меня. Спасибо всем за помощь :)

using UnityEngine; 
using System.Collections; 

public class PixelMovement : MonoBehaviour { 

    public float playerSpeed; 
    public Vector3 gravity; 
    public float maxSpeed = 5f; 
    Vector3 velocity = Vector3.zero; 
    public float fowardSpeed = 1f; 

    bool didPress = false; 

    void Update() 
    { 
     if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0)) 
     { 
      didPress = true; 
     } 
     else 
     { 
      didPress = false; 
     } 
    } 

    void FixedUpdate() 
    { 
     velocity.x = fowardSpeed; 
     transform.position += velocity * Time.deltaTime; 
     if (didPress == true) 
     { 

      float amntToMove1 = playerSpeed * Time.deltaTime; 
      transform.Translate(Vector3.up * amntToMove1); 
     } 
     velocity = Vector3.ClampMagnitude(velocity, maxSpeed); 
     transform.position += velocity * Time.deltaTime; 
    } 
} 
0
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0)) 
    { 
     didPress = true; 
    } 
    else 
    { 
     didPress = false; 
    } 

и удалить didPress = false; из FixedUpdate() функции

EDIT: Хорошо, подождите, я только что заметил, вы обновляете transform.position в FixedUpdate(), который не очень хорошая идея. Когда вы это делаете, вы в основном телепортируете свой объект из одной позиции в другую, игнорируя все виды физики (что, вероятно, является причиной использования FixedUpdate()). С вашим скриптом, сталкивающимся с другими объектами, вы получите странные результаты. Найдите учебное пособие по использованию RigidBodies для правильного движения с учетом физики или просто переместите весь свой код на Update(), потому что прямо сейчас у вас могут быть некоторые рамки, в которых ваш объект не перемещается, и другие кадры, где он перемещается в два раза больше расстояния. Это произойдет потому, что FixedUpdate() может выполняться любое количество раз (включая 0) в одном кадре, в зависимости от настройки. По умолчанию FixedUpdate работает 50 раз в секунду, а по умолчанию - около 60 раз в секунду (по мобильному 30). И, наконец, в FixedUpdate никогда не использовать Time.deltaTime, используйте Time.fixedDeltaTime:

Time.deltaTime равна примерно 1/60th второй (продолжительностью 1 кадр)

Time.fixedDeltaTime составляет примерно 1/пятидесятых второго (продолжительность обновления 1 физики)

+0

Проверьте ответ, который я обновил .. – pHenomen

0

Если вы используете гравитацию и массу RigitBody2D. Я рекомендую вам использовать метод RigitBody2D.Addforce(), чтобы пересканировать ваш персонаж, потому что, если вы просто измените положение каркаса, гравитация немедленно повернет его к земле.

Этот код создает эффект «ракеты», который снимается, когда пользователь удерживает клавишу пробела:

using UnityEngine; 
using System.Collections; 

public class jumpAntigravity : MonoBehaviour { 

    Vector2 upForce; 

    void Start() { 
     //Up force set to double of gravity 
     upForce = new Vector2(0, 9.8f*2); 
    } 

    void Update() { 
     if (Input.GetKey(KeyCode.Space)) 
     { 
      print("Spacebar is down"); 
      GetComponent<Rigidbody2D>().AddForce(upForce); 
     } 
    } 
} 
0

ИсправленоUpdate можно вызывать несколько раз за кадр подряд. Это основано на настройках физики для вашего проекта. Вы можете отредактировать это, чтобы добавить более или менее точную точность в физику.

Обновление вызывается только в 1 раз.

Итак, вы хотите избежать логики в FixedUpdate. Если вы хотите переместить жесткое тело, используйте MovePosition.

Из документов Unity: Если на Rigidbody включена поддержка Rigidbody, вызов Rigidbody.MovePosition приводит к плавному переходу между двумя позициями в любых промежуточных кадрах. Это следует использовать, если вы хотите постоянно перемещать жесткое тело в каждом файле FixedUpdate.

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