unity3d 我应该如何安排代码以修复错误CS1022

uyhoqukh  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(292)

我正在使用Unity学习2D游戏开发,而我刚刚开始编程和游戏开发。我遇到了错误:CS1022类型或命名空间定义,或生命周期结束预期这里是我写的代码:
'

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

{public class Player : MonoBehaviour
public Rigidbody2D rb;
public int movespeed;
    // Start is called before the first frame update
    void Start() { 
     rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update() {
        if (Input.GetKey(KeyCode.LeftArrow))
    {
        rb.velocity = new Vector2 (-movespeed, rb.velocity.y);
    }
        if (Input.GetKey(KeyCode.RightArrow))
    {
        rb.velocity = new Vector2 (movespeed, rb.velocity.y);
    }
    if (Input.GetKey(KeyCode.Space))
    {
        rb.velocity = new Vector2 (rb.velocity.x, 5);
    }
    
public Transform groundCheck;
public float groundCheckRadius;
public LayerMask whatIsGround;
public bool onGround;

     void FixedUpdate()
     {
        onGround = Physics2D.OverlapCircle(groundCheck.position,
        groundCheckRadius,whatIsGround);
     }
}
}

'我试图控制我的游戏角色的跳跃能力,使它不能通过跳跃飞行。
它说错误是在行(39,1).我不知道如何修复这个错误有人能帮助和解释我做错了什么吗?
我不知道该怎么做,因为我已经完全按照书中我用来学习编码说,我已经尝试rearranging的代码,但无济于事。

rta7y2nd

rta7y2nd1#

编程中最有用的技巧之一就是学习如何解释编译错误。你遇到的错误是“类型或命名空间定义,或预期的文件结尾”--编译器说的是它认为它到达了文件结尾,但结尾处有更多的东西,它不知道如何解释。
但这里重要的一点是,要知道编译器用来计算应该在哪里开始和结束的是花括号{}的使用,这两个花括号用来划分类、名称空间和其他块的开始和结束(比如if/else/for/foreach/etc)。因此,如果您遇到类似于您所看到的错误,很可能是您的花括号位置不正确,或者它们不匹配。
所以如果你数一下花括号,你会得到7个{和7个},这很好--你没有打开某个东西,然后忘记关闭它。
如果你仔细观察你的类是这样开始的:

{public class Player : MonoBehaviour
public Rigidbody2D rb;

这看起来是错误的--当定义一个块时,你指定了块,然后 * 然后 * 把花括号放在后面。所以你定义了一个类,但是你把花括号放在了错误的位置。要定义一个类,你要做以下事情:

protectionlevel class ClassName : SuperClass, IInterface {
    // content of the class goes here
}

因此,对于您的类,您需要一个名称为Player的公共类,它继承自MonoBehaviour,没有接口,因此它应该是:

public class Player : MonoBehaviour {
    // content of the class goes here
}

update函数的代码中还有另一个花括号错误--下面是update方法的全部内容(从start curly到end curly):

void Update() { // starts here
        if (Input.GetKey(KeyCode.LeftArrow))
    {
        rb.velocity = new Vector2 (-movespeed, rb.velocity.y);
    }
        if (Input.GetKey(KeyCode.RightArrow))
    {
        rb.velocity = new Vector2 (movespeed, rb.velocity.y);
    }
    if (Input.GetKey(KeyCode.Space))
    {
        rb.velocity = new Vector2 (rb.velocity.x, 5);
    }
    
public Transform groundCheck;
public float groundCheckRadius;
public LayerMask whatIsGround;
public bool onGround;

     void FixedUpdate()
     {
        onGround = Physics2D.OverlapCircle(groundCheck.position,
        groundCheckRadius,whatIsGround);
     }
} // ends here

这可能不是您想要的。字段groundCheck etc和方法FixedUpdate应该在Update函数之外定义。尝试在if语句之后关闭Update函数,以便将以下代码定义为类的一部分,而不是Update方法的一部分。
查看花括号错误的最好方法是遵循一致的indentation style,每个花括号缩进一个级别,这样你就可以很容易地看到类或函数或其他东西的一部分,并帮助你调试这类问题。

vsaztqbk

vsaztqbk2#

正如其他人在注解中指出的那样,您的代码中存在几个格式错误,例如类声明前多了一个左括号{Update方法缺少一个右括号}
如果你使用的是像VisualStudio这样的IDE,内置的格式化选项(Edit > Advanced > Format Document)可以帮助你组织括号的缩进;尽管它们不会自动解决错误😉
下面是您的代码,但格式更详细:

using UnityEngine;

public class Player : MonoBehaviour
{
    public LayerMask whatIsGround;
    public Rigidbody2D rb;
    public Transform groundCheck;
    
    public bool onGround;
    public float groundCheckRadius;
    public int movespeed;
    
    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            rb.velocity = new Vector2(-movespeed, rb.velocity.y);
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            rb.velocity = new Vector2(movespeed, rb.velocity.y);
        }

        if (Input.GetKey(KeyCode.Space))
        {
            rb.velocity = new Vector2(rb.velocity.x, 5);
        }
    }

    private void FixedUpdate()
    {
        onGround = Physics2D.OverlapCircle(groundCheck.position,
            groundCheckRadius, whatIsGround);
    }
}

我已经将变量移到了顶部,这样就可以很容易地将它们与其余代码区分开来,并为内置Unity函数添加了一个private访问修饰符。

相关问题