2015-05-28 6 views
1

Я создал сценарий первого лица на C#, при этом мышь выглядела в отдельном скрипте. Однако в моем сценарии движения работает основная функция ходьбы, но функция спринта не работает. После изменений в сценарии, в результате чего получается довольно неэффективный, но в конечном итоге тот же скрипт, я пришел к выводу, что он просто не обнаруживает или не использует какой-либо вход из ключа спринта, который был настроен в редакторе, хотя я могу ошибаться , Сценарий:Sprint Not Working

using UnityEngine; 
using System.Collections; 

public class PlayerMovement : MonoBehaviour { 

public float speed = 3.0F; 
public float jumpSpeed = 8.0F; 
public float gravity = 20.0F; 
public float runSpeed = 6f; 
public float crouchSpeed = 3f; 
Vector3 moveDirection; 
void Update() { 

    CharacterController controller = GetComponentInParent<CharacterController>(); 
    if (controller.isGrounded) { 
      moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); 
      moveDirection = transform.TransformDirection(moveDirection); 

     if (Input.GetButton("Jump")){ 
      moveDirection.y = jumpSpeed; 
     } 


    } 
    moveDirection.y -= gravity * Time.deltaTime; 
    if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) && Input.GetButton("Sprint")){ 
     controller.Move (moveDirection * runSpeed * Time.deltaTime); 
    } 
    else if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)){ 
     controller.Move (moveDirection * speed * Time.deltaTime); 
    } 

} 
} 
+1

Это может не способствовать вашей текущей проблеме, но вы можете рассмотреть вопрос о включении 'Input.GetKey (KeyCode.W) || Input.GetKey (KeyCode.S) || Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.D) 'в одном наборе скобок в условии if для спринте. – Serlite

+0

Добавление скобок должно решить вашу проблему, Serlite правильно. –

+0

@Atra Извините, если я не понимаю, вы имеете в виду просто 'if ((Input.GetKey (KeyCode.W) || Input.GetKey (KeyCode.S) || Input.GetKey (KeyCode.A) || Input. GetKey (KeyCode.D)) && Input.GetButton ("Sprint")) '? Я попробовал это, и это не изменило текущую ситуацию, но я чувствую, что неправильно понял решение. – Darkbyte

ответ

0

вы должны оформить оператор приоритет в C# (https://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71%29.aspx)

Проблема у Вас есть, что код всегда будет идти в первое состояние, если заявление, если W, S или A.

Чтобы исправить это в скобках ИЛИ заявления типа:

if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && Input.GetButton("Sprint")){ 
    controller.Move (moveDirection * runSpeed * Time.deltaTime); 
} 
else if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)){ 
    controller.Move (moveDirection * speed * Time.deltaTime); 
} 
+0

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

+0

Вы предполагаете, что символ перемещается в разных направлениях, если нажаты W, S, D или A? С кодом в настоящее время он всегда будет двигаться в том же направлении, независимо от того, какая клавиша нажата. –

+0

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

1

Это просто логическая логическая ошибка: && имеет приоритет над ||.

Эта линия неисправна:

if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) && Input.GetButton("Sprint")) 

Вы должны приложить || условия:

if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && Input.GetButton("Sprint")) 

Во всяком случае, лучше всего было бы разделить на две части:

if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) 
{ 
    var realSpeed = Input.GetButton("Sprint") ? runSpeed : speed; 
    controller.Move (moveDirection * realSpeed * Time.deltaTime); 
} 
+0

Есть ли другие проблемы? К сожалению, это, похоже, не устраняет проблему. – Darkbyte