【问题标题】:Unity Doublejump in C#C# 中的 Unity 双跳
【发布时间】:2014-09-29 16:41:27
【问题描述】:

试图让我的角色能够进行双跳,也没有在 C# 中编写太多代码。 我已经尝试过不同的东西,但如果有人教我,我发现没有一个会很好。

using UnityEngine;

public class PlatformerCharacter2D : MonoBehaviour 
{
    bool facingRight = true;                            // For determining which way the player is currently facing.

    [SerializeField] float maxSpeed = 10f;              // The fastest the player can travel in the x axis.
    [SerializeField] float jumpForce = 400f;            // Amount of force added when the player jumps. 

    [Range(0, 1)]
    [SerializeField] float crouchSpeed = .36f;          // Amount of maxSpeed applied to crouching movement. 1 = 100%

    [SerializeField] bool airControl = false;           // Whether or not a player can steer while jumping;
    [SerializeField] LayerMask whatIsGround;            // A mask determining what is ground to the character

    Transform groundCheck;                              // A position marking where to check if the player is grounded.
    float groundedRadius = .2f;                         // Radius of the overlap circle to determine if grounded
    bool grounded = false;                              // Whether or not the player is grounded.
    Transform ceilingCheck;                             // A position marking where to check for ceilings
    float ceilingRadius = .01f;                         // Radius of the overlap circle to determine if the player can stand up
    Animator anim;                                      // Reference to the player's animator component.


    void Awake()
    {
        // Setting up references.
        groundCheck = transform.Find("GroundCheck");
        ceilingCheck = transform.Find("CeilingCheck");
        anim = GetComponent<Animator>();
    }


    void FixedUpdate()
    {
        // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground
        grounded = Physics2D.OverlapCircle(groundCheck.position, groundedRadius, whatIsGround);
        anim.SetBool("Ground", grounded);

        // Set the vertical animation
        anim.SetFloat("vSpeed", rigidbody2D.velocity.y);
    }


    public void Move(float move, bool crouch, bool jump)
    {    
        // If crouching, check to see if the character can stand up
        if(!crouch && anim.GetBool("Crouch"))
        {
            // If the character has a ceiling preventing them from standing up, keep them crouching
            if( Physics2D.OverlapCircle(ceilingCheck.position, ceilingRadius, whatIsGround))
                crouch = true;
        }

        // Set whether or not the character is crouching in the animator
        anim.SetBool("Crouch", crouch);

        //only control the player if grounded or airControl is turned on
        if(grounded || airControl)
        {
            // Reduce the speed if crouching by the crouchSpeed multiplier
            move = (crouch ? move * crouchSpeed : move);

            // The Speed animator parameter is set to the absolute value of the horizontal input.
            anim.SetFloat("Speed", Mathf.Abs(move));

            // Move the character
            rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y);

            // If the input is moving the player right and the player is facing left...
            if(move > 0 && !facingRight)
                // ... flip the player.
                Flip();
            // Otherwise if the input is moving the player left and the player is facing right...
            else if(move < 0 && facingRight)
                // ... flip the player.
                Flip();
        }

        // If the player should jump...
        if (grounded && jump) {
        // Add a vertical force to the player.
        anim.SetBool ("Ground", false);
        rigidbody2D.AddForce (new Vector2 (0f, jumpForce));
        }
    }


    void Flip ()
    {
        // Switch the way the player is labelled as facing.
        facingRight = !facingRight;

        // Multiply the player's x local scale by -1.
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    尚未测试您的代码,但以下应该可以工作:

    using UnityEngine;
    
    public class PlatformerCharacter2D : MonoBehaviour 
    {
        bool facingRight = true;                            // For determining which way the player is currently facing.
    
        [SerializeField] float maxSpeed = 10f;              // The fastest the player can travel in the x axis.
        [SerializeField] float jumpForce = 400f;            // Amount of force added when the player jumps. 
    
        [Range(0, 1)]
        [SerializeField] float crouchSpeed = .36f;          // Amount of maxSpeed applied to crouching movement. 1 = 100%
    
        [SerializeField] bool airControl = false;           // Whether or not a player can steer while jumping;
        [SerializeField] LayerMask whatIsGround;            // A mask determining what is ground to the character
    
        Transform groundCheck;                              // A position marking where to check if the player is grounded.
        float groundedRadius = .2f;                         // Radius of the overlap circle to determine if grounded
        bool grounded = false;                              // Whether or not the player is grounded.
        Transform ceilingCheck;                             // A position marking where to check for ceilings
        float ceilingRadius = .01f;                         // Radius of the overlap circle to determine if the player can stand up
        Animator anim;                                      // Reference to the player's animator component.
    
        int maxNumberOfAirJumps = 1;                        // Number of times the player can jump in the air
        int numberOfAirJumpsLeft = 0;
    
    
        void Awake()
        {
            // Setting up references.
            groundCheck = transform.Find("GroundCheck");
            ceilingCheck = transform.Find("CeilingCheck");
            anim = GetComponent<Animator>();
        }
    
    
        void FixedUpdate()
        {
            // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground
            grounded = Physics2D.OverlapCircle(groundCheck.position, groundedRadius, whatIsGround);
            anim.SetBool("Ground", grounded);
    
            // Set the vertical animation
            anim.SetFloat("vSpeed", rigidbody2D.velocity.y);
        }
    
    
        public void Move(float move, bool crouch, bool jump)
        {    
            // If crouching, check to see if the character can stand up
            if(!crouch && anim.GetBool("Crouch"))
            {
                // If the character has a ceiling preventing them from standing up, keep them crouching
                if( Physics2D.OverlapCircle(ceilingCheck.position, ceilingRadius, whatIsGround))
                    crouch = true;
            }
    
            // Set whether or not the character is crouching in the animator
            anim.SetBool("Crouch", crouch);
    
            //only control the player if grounded or airControl is turned on
            if(grounded || airControl)
            {
                // Reduce the speed if crouching by the crouchSpeed multiplier
                move = (crouch ? move * crouchSpeed : move);
    
                // The Speed animator parameter is set to the absolute value of the horizontal input.
                anim.SetFloat("Speed", Mathf.Abs(move));
    
                // Move the character
                rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y);
    
                // If the input is moving the player right and the player is facing left...
                if(move > 0 && !facingRight)
                    // ... flip the player.
                    Flip();
                // Otherwise if the input is moving the player left and the player is facing right...
                else if(move < 0 && facingRight)
                    // ... flip the player.
                    Flip();
            }
    
            // If the player should jump...
            if (grounded && jump) {
                // Add a vertical force to the player.
                anim.SetBool ("Ground", false);
                rigidbody2D.AddForce (new Vector2 (0f, jumpForce));
                numberOfAirJumpsLeft = maxNumberOfAirJumps; //Reset the air jumps when the player jumps
            }
            else if (!grounded && jump && numberOfAirJumpsLeft  > 0)
            {
                rigidbody2D.AddForce (new Vector2 (0f, jumpForce));
                numberOfAirJumpsLeft--; //One less jump 
            }
        }
    
    
        void Flip ()
        {
            // Switch the way the player is labelled as facing.
            facingRight = !facingRight;
    
            // Multiply the player's x local scale by -1.
            Vector3 theScale = transform.localScale;
            theScale.x *= -1;
            transform.localScale = theScale;
        }
    }
    

    所有的[SerializeField] 也可能是不合适的

    【讨论】:

    • 感谢它的工作!但是我还有另一个问题,当我双跳非常快时,我的角色将比我等待一秒钟进行第二次跳跃高出近 4 倍。我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多