2016-08-29 1 views
0

Итак, в единстве я работал над созданием скрипта для этого третьего лица, и до сих пор он работает так, как я хочу, чтобы он работал, просто теперь я застрял на том, как заставить его двигаться вперед и оставить на том же время (или другое направление). Потому что сейчас он просто начинает прослушиваться.Как заставить игрока не «спаз» выходить из строя?

код Движение:

using UnityEngine; 
using System.Collections; 
using UnityStandardAssets.CrossPlatformInput; 
public class Character_Controler : MonoBehaviour 
{ 
    [SerializeField] 
    public float speed = 1f; 
    // the world-relative desired move direction, calculated from the camForward and user input. 
    private bool canJump = false; 
    Vector3 movement; 
    Rigidbody playerRbody; 

     void Awake() 
     { 
      playerRbody = GetComponent<Rigidbody>(); 

     } 
    private void FixedUpdate() 
    { 
     playerRbody.AddForce(Physics.gravity * playerRbody.mass); 
     // float h = Input.GetAxisRaw("Horizontal"); 
     // float v = Input.GetAxisRaw("Vertical"); 
     var jump = Input.GetKeyDown(KeyCode.Space); 
     if (!canJump && playerRbody.velocity.y == 0) 
     { 
      canJump = true; 

     } 
     if (jump && canJump == true) 
     { 
      playerRbody.AddForce(new Vector3(0, 6f, 0), ForceMode.Impulse); 
      canJump = false; 
     } 
     if (Input.GetKey(KeyCode.W)) 
     { 
      moveForward(speed); 
     } 
     else if (Input.GetKey(KeyCode.S)) 
     { 
      moveBack(speed); 
     } 

     if (Input.GetKey(KeyCode.A)) 
     { 
      moveLeft(speed); 
     } 
     else if (Input.GetKey(KeyCode.D)) 
     { 
      moveRight(speed); 
     } 
     transform.localEulerAngles = new Vector3(0, transform.localEulerAngles.y, transform.localEulerAngles.z); 
     //transform.forward = Camera.main.transform.forward; 

    } 

    } 
    private void moveForward(float speed) 
    { 
     transform.forward = Camera.main.transform.forward; 
     // Quaternion newRotation = Quaternion.LookRotation(transf); 
     // playerRbody.MoveRotation(newRotation); 
     transform.localPosition += transform.forward * speed * Time.deltaTime; 
    } 

    private void moveBack(float speed) 
    { 
     transform.forward = -Camera.main.transform.forward; 
     transform.localPosition += transform.forward * speed * Time.deltaTime; 

    } 

    private void moveRight(float speed) 
    { 
     transform.forward = Camera.main.transform.right; 
     transform.localPosition += transform.forward * speed * Time.deltaTime; 
    } 

    private void moveLeft(float speed) 
    { 
     transform.forward = -Camera.main.transform.right; 
     transform.localPosition += transform.forward * speed * Time.deltaTime; 
    } 
} 
+0

Если ваш игрок имеет жесткое тело, почему вы прямо изменяете положение трансформирования? Также вы должны просто сделать все движение в одной функции, а не 4. –

+0

@ XanderLuciano Это был единственный способ заставить игрока работать так, как я хотел, я подробно объясню немного, должен пойти afk для abit. – Willo

ответ

0

Не обрабатывать позиции преобразования, как это.

https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html

https://docs.unity3d.com/ScriptReference/Rigidbody.html

И Vector3.Up * 6f такой же, как новый Vector3 (0, 6, 0); Если вы хотите, чтобы ваш игрок двигался вверх, но он вращается по-другому, он не будет двигаться вверх по отношению к его вращению, используя новый Vector3(), используя его преобразование, чтобы узнать, где вверх указывает.

Я бы также рекомендовал не перемещать плеер на основе камеры справа/вверх/влево/и т. Д.