मेरे पास इस तरह एक खिलाड़ी आंदोलन कोड है:

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    private CharacterController controller;
    private Vector3 velocity;
    private float speed = 4f;
    private float jumpHeight = 1f;
    private float gravity = 9.81f;
    Vector3 lastMovementVector = Vector3.zero;

    private void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    private void Update()
    {
        Debug.Log(velocity.y + " | " + controller.isGrounded); // Test

        Walk();
        Jump();
    }

    private void Walk()
    {
        Vector3 movementVector = transform.right * Input.GetAxis("Horizontal") + transform.forward * Input.GetAxis("Vertical");

        if (controller.isGrounded)
        {
            // This part executes
            controller.Move(movementVector * Time.deltaTime * speed);
            lastMovementVector = movementVector * Time.deltaTime * speed / 2f;
        }
        else
        {
            controller.Move(lastMovementVector); // Сontinues in flight
        }
    }

    private void Jump()
    {
        if (controller.isGrounded)
        {
            // I already checked with bool, this part doesn't execute
            if (velocity.y < 0)
            {
                velocity.y = 0;
            }
            if (Input.GetButtonDown("Jump"))
            {
                velocity.y += Mathf.Sqrt(jumpHeight * 2f * gravity);
            }
        }
        velocity.y -= gravity * Time.deltaTime;
        controller.Move(velocity * Time.deltaTime);
    }
}

मैं जांचता हूं कि खिलाड़ी मैदान पर है या नहीं - वह है।

लेकिन इस भाग पर ध्यान नहीं दिया जाता है और निष्पादित नहीं किया जाता है:

if (controller.isGrounded)
        {
            // I already checked with bool, this part doesn't execute
            if (velocity.y < 0)
            {
                velocity.y = 0;
            }
            if (Input.GetButtonDown("Jump"))
            {
                velocity.y += Mathf.Sqrt(jumpHeight * 2f * gravity);
            }
        }

मैं तब तक नहीं कूद सकता जब तक मैं हिल नहीं जाता। लेकिन जब मैं हिलना शुरू करता हूं तो यह जांचना शुरू कर देता है!

हालांकि कोड के दोनों हिस्सों की एक ही शर्त है।

मैं हैरान हूं कि वह कोड के इस हिस्से की उपेक्षा करता है। मैं पहले से ही आधे घंटे से बैठा हूं।

-1
Spasibo 10 अक्टूबर 2020, 13:46

1 उत्तर

सबसे बढ़िया उत्तर

मुझे नहीं पता कि यह कैसे काम करता है लेकिन मैंने इसे केवल एक वेरिएबल isGrounded...

अब कोड इस तरह दिखता है:

    private CharacterController controller;
    private Vector3 velocity;
    private float speed = 4f;
    private float jumpHeight = 1f;
    private float gravity = 9.81f;
    Vector3 lastMovementVector = Vector3.zero;
    private bool isGrounded; // This is new variable

    private void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    private void Update()
    {
        Debug.Log(velocity.y + " | " + controller.isGrounded);

        isGrounded = controller.isGrounded; // Equated to property

        Walk();
        Jump();
    }

    private void Walk()
    {
        Vector3 movementVector = transform.right * Input.GetAxis("Horizontal") + transform.forward * Input.GetAxis("Vertical");

        if (isGrounded)
        {
            controller.Move(movementVector * Time.deltaTime * speed);
            lastMovementVector = movementVector * Time.deltaTime * speed / 2f;
        }
        else
        {
            controller.Move(lastMovementVector);
        }
    }

    private void Jump()
    {
        if (isGrounded)
        {
            if (velocity.y < 0)
            {
                velocity.y = 0;
            }
            if (Input.GetButtonDown("Jump"))
            {
                velocity.y += Mathf.Sqrt(jumpHeight * 2f * gravity);
            }
        }
        velocity.y -= gravity * Time.deltaTime;
        controller.Move(velocity * Time.deltaTime);
    }
}
0
Spasibo 10 अक्टूबर 2020, 19:07