C# 只跳一次

C# 只跳一次,c#,unity3d,C#,Unity3d,我对C#(Unity)的编码有一些问题;我试图让我的角色随着空间移动和跳跃。但是由于某些原因,角色会跳一次,当再次到达地面时,它会停止跳!有人能帮我吗?我试图在Unity上勾选和取消勾选“Is jumping”和“Double jumping”,但似乎没有任何效果: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour

我对C#(Unity)的编码有一些问题;我试图让我的角色随着空间移动和跳跃。但是由于某些原因,角色会跳一次,当再次到达地面时,它会停止跳!有人能帮我吗?我试图在Unity上勾选和取消勾选“Is jumping”和“Double jumping”,但似乎没有任何效果:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    public float Speed;
    public float JumpForce;

    public bool isJumping;
    public bool doubleJump;

    private Rigidbody2D rig;

    // Use this for initialization
    void Start () {
        rig = GetComponent<Rigidbody2D>();
    }
    
    // Update is called once per frame
    void Update () {
        Move();
        Jump();
    }

    void Move () {
        Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), 0f, 0f);
        transform.position += movement * Time.deltaTime * Speed;
    }

    void Jump () {
        if(Input.GetButtonDown("Jump")) 
        {
            if(!isJumping){
                rig.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse);
                doubleJump = true;
            }else{
                if(doubleJump){
                    rig.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse);
                            doubleJump = false;
                }
            }
        }
    }

    void OnCollisionEnter2D(Collision2D collision){
        if(collision.gameObject.layer == 8)
        {
            isJumping = false;
        }
    }
    
    void OnCollisionExit2D(Collision2D collision){
        if(collision.gameObject.layer == 8){
            isJumping = true;
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类玩家:单一行为{
公众浮标速度;
公共安全部队;
公共场所在跳跃;
公共跳远;
私人Rigidbody2D钻机;
//用于初始化
无效开始(){
rig=GetComponent();
}
//每帧调用一次更新
无效更新(){
Move();
跳跃();
}
无效移动(){
Vector3移动=新的Vector3(Input.GetAxis(“水平”),0f,0f;
transform.position+=移动*时间.延时*速度;
}
空跳(){
if(Input.GetButtonDown(“跳转”))
{
如果(!正在跳跃){
装备添加力(新矢量2(0f,跳跃力),力模式2D脉冲);
双跳=真;
}否则{
中频(双跳){
装备添加力(新矢量2(0f,跳跃力),力模式2D脉冲);
双跳=假;
}
}
}
}
空心OnCollisionInter2D(碰撞2D碰撞){
if(collision.gameObject.layer==8)
{
isJumping=false;
}
}
无效OnCollisionExit2D(碰撞2D碰撞){
if(collision.gameObject.layer==8){
isJumping=true;
}
}
}
您在
Jump()
中的逻辑似乎是正确的,所以我猜
正在跳转的
设置不正确。可能是你在地面上,然后跳到不在第8层的平台上。在这种情况下,
OnCollisionInter2D
将永远不会被调用来设置您的
IsJumping

    void OnCollisionEnter2D(Collision2D collision){
        if(collision.gameObject.layer == 8)
        {
            isJumping = false;
        }
    }
    
    void OnCollisionExit2D(Collision2D collision){
        if(collision.gameObject.layer == 8){
            isJumping = true;
        }
    }
我对您的代码进行了一些编辑,使其更具可读性(尽管其中一些是有品味的),并添加了一些一般提示

使用System.Collections.Generic;
使用UnityEngine;
//加https://docs.unity3d.com/ScriptReference/RequireComponent.html
[RequiredComponent(类型)(刚体))]
公共类玩家:单一行为{
公众浮标速度;
公共安全部队;
//布尔人的命名应遵循以下准则:https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members#names-财产
公共学校停课;
公共图书馆已被取消;
私人Rigidbody2D钻机;
//用于初始化
无效开始(){
//另一个技巧是,只需写出变量名,不要缩短它们(再次参见指南)。
rig=GetComponent();
}
//每帧调用一次更新
无效更新(){
Move();
跳转检查();
}
无效移动(){
//一些提示
//A)尝试将任何与physiscs相关的移动移动到fixedUpdate
//B)尝试使用.AddForce()移动刚体不使用transform.position的对象。请参见:https://docs.unity3d.com/ScriptReference/Rigidbody.html
Vector3移动=新的Vector3(Input.GetAxis(“水平”),0f,0f;
transform.position+=移动*时间.延时*速度;
}
无效跳转检查(){
if(Input.GetButtonDown(“跳转”))
{
//如果我们被禁飞就跳
如果(接地)
{
跳跃();
HasDoubleJump=假;
}
//如果我们在空中(!IsGrounded)并且我们还没有双跳,就跳。
否则如果(!hasdublejumped)
{
跳跃();
hasdublejump=true;
}
其他的
{
//我们在空中,我们跳了两次,什么也不做!
}
}
}
私有无效跳转()=>
装备添加力(新矢量2(0f,跳跃力),力模式2D脉冲);
空心OnCollisionInter2D(碰撞2D碰撞){
if(collision.gameObject.layer==8)
{
IsGrounded=true;
}
}
无效OnCollisionExit2D(碰撞2D碰撞){
if(collision.gameObject.layer==8){
isfounded=false;
}
}
}

首先将isJumping重命名为IsGround-因为这很可能就是您测试的对象,对吗?如果您添加Debug.Log(isJumping);在if(!isJumping)之前的Jump()函数中,在第二次跳转之后得到什么值?有些东西告诉我,在第一次跳转之后,它再也不会被设置为false。很抱歉打扰,但我想知道Vector3/Vector2等的含义!你能告诉我吗0@Aserli向量基本上是一对轴
Vector2
有一个X轴和一个Y轴,
Vector3
有一个X轴、Y轴和Z轴。这是用于职位。每个变换都有一个统一的矢量位置。将+1添加到Y会使对象沿Y轴(向上)移动一步,将-1添加到Y轴上会使对象向下移动一步,以此类推。