Нужна помощь в получении контроллера персонажа для прыжка - PullRequest
0 голосов
/ 12 мая 2019

Пока у меня есть контроллер персонажа, который позволяет мне двигаться, бегать и приседать (без анимации), но я не могу заставить контроллер прыгать. Я знаю, что на 100% персонаж получает данные для прыжка, а вектор движения составляет около ~ 40 по оси Y, поэтому игрок должен двигаться. Проблема в том, что ничего не происходит. Игрок все еще может перемещаться и падать уступами, но ничего не происходит, когда я нажимаю пробел Это мой код:

 using UnityEngine;

 public class KeyboardMovement : MonoBehaviour
 {
     private CharacterController controller;
     public float walkSpeed;
     public float sprintSpeed;
     public float crouchSpeed;
     public float jumpHeight;
     Vector3 up = Vector3.zero;
     Vector3 movement = Vector3.zero;
     Vector3 forward = Vector3.zero;
     Vector3 sideways = Vector3.zero;
     void Start()
     {
         controller = GetComponent<CharacterController>();
     }


     void Update()
     {
         float speed = walkSpeed;
         //If crouching, set speed to crouch speed. This ovverides sprinting
         if (SingletonSettings.GetKey(SingletonSettings.Keybindings.crouch))
             speed = crouchSpeed;
         //Else if sprinting, set speed to sprint speed
         else if (SingletonSettings.GetKey(SingletonSettings.Keybindings.sprint))
             speed = sprintSpeed;

         //Create vectors for movement
         forward = transform.TransformDirection(Vector3.forward) * Input.GetAxis("Vertical");
         sideways = transform.TransformDirection(Vector3.right) * Input.GetAxis("Horizontal");
         //up = SingletonSettings.GetKey(SingletonSettings.Keybindings.jump) && controller.isGrounded ? Vector3.up * jumpHeight : Vector3.zero;
         movement = (up * 100) + ((forward + sideways) * 10 * Time.deltaTime * speed);

         //Combine vectors and Multiply by DeltaTime to ensure smooth movement at different framerates.
         //Also multiply by 10*speed to ensure correct speed in different states
          if (controller.isGrounded && Input.GetKey(KeyCode.Space))
         {
             movement.y = jumpHeight*50 * Time.deltaTime;
         }
         controller.SimpleMove(movement);
     }
     void OnGUI()
     {
         GUILayout.Label('\n' + Newtonsoft.Json.JsonConvert.SerializeObject(movement.y, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings
         {
             ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
         }));
     }
 }

1 Ответ

0 голосов
/ 13 мая 2019

CharacterController.SimpleMove из документов

Перемещает символ со скоростью.

Скорость вдоль оси y игнорируется .

Гравитация применяется автоматически.

https://docs.unity3d.com/ScriptReference/CharacterController.SimpleMove.html


Вы должны использовать CharacterController.Move

Более сложная функция движения, принимающая абсолютное движениеdeltas.

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

...

Эта функция не применяет гравитацию.

https://docs.unity3d.com/ScriptReference/CharacterController.Move.html

С помощью этого метода вам нужно будет самостоятельно применить гравитацию

movement.y -= gravity * Time.deltaTime;

controller.Move(movement * Time.deltaTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...