2015-12-24 4 views
1

Я создаю простую 2-ю игру, чтобы узнать Unity. У меня есть скрипт, который перемещает игрока влево и вправо по оси x. Кроме того, я добавил элементы управления движением в одном сценарии. Однако у меня есть проблема. Когда я играю в игру и нажимаю клавишу D, чтобы переместить плеер вправо, он движется вправо, но как только я отпустил, он отскакивает назад на 1/2 пути. Я потратил часы, глядя на этот код, но игрок продолжает прыгать назад примерно на 1/2 пути по оси х. Почему это? Пожалуйста, помогите, большое вам спасибо!Сценарий с управляющим игроком в Unity

using UnityEngine; 
using System.Collections; 

[System.Serializable] 
public class BoundaryOne 
{ 
public float xMin, xMax, yMin, yMax; 
} 

public class Done_PlayerController : MonoBehaviour 
{ 
public float speed; 
public BoundaryOne boundary; 



void Update() 

    { 
     transform.Translate(Input.acceleration.x/4, 0, 0); 
    } 
    // void Start() 

//{ 
    //GetComponent<Rigidbody>().velocity = transform.right * speed; 
//} 

void FixedUpdate() 
{ 
    float moveHorizontal = Input.GetAxis ("Horizontal"); 


    Vector3 movement = new Vector3 (moveHorizontal,0); 
    GetComponent<Rigidbody>().velocity = movement * speed; 

    GetComponent<Rigidbody>().position = new Vector3 
    (
     Mathf.Clamp (GetComponent<Rigidbody>().position.x, boundary.xMin, boundary.xMax), 

     Mathf.Clamp (GetComponent<Rigidbody>().position.y, boundary.yMin, boundary.yMax) 
    ); 


} 
} 
+0

Прежде всего переместить контрольный код 'Update' вместо' FixedUpdate'. Получение ввода в FixedUpdate может вызвать лагги. Во-вторых, вы используете 'GetComponent' в gameloop, что не является хорошей практикой. Возьмите «Жесткое тело» в переменной в начале и используйте это. И последнее, что я хочу спросить, что вы разрабатываете 2D-игру и используете 3D-компоненты, такие как «Rigidbody», а не «Rigidbody2D»? –

+0

Да, я использую 3D-компоненты в 2D-игре. Проверьте мой ответ ниже для нового кода. Я просто не вижу, что заставляет объект игрока прыгать назад! И элементы управления работают лучше после перехода на обновление, они немного отставали. –

+0

Вы не должны отвечать таким образом, вместо этого вы должны изменить свой вопрос. –

ответ

0
using UnityEngine; 
using System.Collections; 

[System.Serializable] 
public class BoundaryOne 
{ 
public float xMin, xMax, yMin, yMax; 
} 

public class Done_PlayerController : MonoBehaviour 
{ 
public float speed; 

//using mathf to limit bounds of movement 
public BoundaryOne boundary; 



void Update() 
{ 
    float moveHorizontal = Input.GetAxis("Horizontal"); 


    Vector3 movement = new Vector3(moveHorizontal, 0); 
    GetComponent<Rigidbody>().velocity = movement * speed; 

    GetComponent<Rigidbody>().position = new Vector3 
    (
     Mathf.Clamp(GetComponent<Rigidbody>().position.x, boundary.xMin, boundary.xMax), 

      Mathf.Clamp(0, 0, 0) 
     ); 
    //my mobile tilt controls 

    transform.Translate(Input.acceleration.x/4, 0, 0); 

} 

// void Start() 

//{ 
//GetComponent<Rigidbody>().velocity = transform.right * speed; 
//} 

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