我该如何解决这个错误?字段从未分配并且始终具有空值[重复]

2024-04-16

我创建了 4 个 C# 脚本。当我运行 2d unity 游戏时,我在控制台中看到此警告。

“Assets\Scripts\GameHandler.cs(7,34):警告 CS0649:字段 'GameHandler.car' 永远不会被分配给,并且总是有它的 默认值空”

我正在创建一个类似于贪吃蛇的游戏,使用 Unity 2d 中的 C# 脚本。以前从未使用过 unity 或 c#,这是我的第一个项目。到目前为止,一切进展顺利,但是,我不断收到此警告,这导致我的游戏崩溃。 我附加了两个脚本,第一个游戏处理程序是这个问题所在,我认为它指的是该类Car我附在下面。这是很多代码,所以我很抱歉,我只是不知道。

public class GameHandler : MonoBehaviour
{
    [SerializeField] private Car car;

    private LevelGrid levelGrid;

    // Start is called before the first frame update
    private void Start()
    {
        Debug.Log("GameHandler.Start");

        //GameObject carHeadGameObject = new GameObject();
        //SpriteRenderer carSpriteRenderer = carHeadGameObject.AddComponent<SpriteRenderer>();
        //carSpriteRenderer.sprite = GameAssets.instance.carHeadSprite;

        levelGrid = new LevelGrid(20,20); //width,height of grid

        car.Setup(levelGrid);
        levelGrid.Setup(car);
    }


    }
--------------------------------------
    using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Car : MonoBehaviour
{
    private enum Direction
    {
        Left,
        Right,
        Up,
        Down
    }

    private enum State
    {
        Alive,
        Dead
    }

    private State state;
    private Vector2Int gridPosition; //uses ints instead of floats useful for grid positiioning
    private float gridMoveTimer; //time remaining until next movement
    private float gridMoveTimerMax; // time between moves

    private Direction gridMoveDirection;

    private LevelGrid levelGrid;
    private int carsize;
    private List<CarMovePosition> carMovePositionList;
    private List<Carsize> carSizeList;

    public void Setup(LevelGrid levelGrid) {
        this.levelGrid = levelGrid;
    }

    private void Awake() {
        gridPosition = new Vector2Int(10,10); //initalise grid position into middle of grid 
        gridMoveTimerMax = .2f; //car to move along grid every 1/2 second
        gridMoveTimer = gridMoveTimerMax; //0f
        gridMoveDirection = Direction.Right; // default move right

        carMovePositionList = new List<CarMovePosition>();
        carsize = 0;
        carSizeList = new List<Carsize>();

        state = State.Alive;
    }

    private void Update()
    {
        switch (state)
        {
            case State.Alive:
            HandleInput(); // checks for keyboard input
            HandleGridMovement();
                break;
            case State.Dead:
                break;
        }



    }


    private void HandleInput()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            if (gridMoveDirection != Direction.Down)
            { // can only go up if not going down
                gridMoveDirection = Direction.Up;
            }
        }
        //return true on up arrow press

        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            if (gridMoveDirection != Direction.Up)
            {
                gridMoveDirection = Direction.Down;

            }
        }
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            if (gridMoveDirection != Direction.Right)
            {
                gridMoveDirection = Direction.Left;
            }
        }
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            if (gridMoveDirection != Direction.Left)
            {
                gridMoveDirection = Direction.Right;
            }
        }
    }

    private void HandleGridMovement()
    {
        gridMoveTimer += Time.deltaTime; // amount of time left since last update
        if (gridMoveTimer >= gridMoveTimerMax)//if true then 1 sec since last move
        {
            gridMoveTimer -= gridMoveTimerMax;

            CarMovePosition previousCarMovePosition = null;

            if (carMovePositionList.Count > 0){
                previousCarMovePosition = carMovePositionList[0];
            }

            CarMovePosition carMovePosition = new CarMovePosition(previousCarMovePosition, gridPosition, gridMoveDirection);
            carMovePositionList.Insert(0, carMovePosition);

            Vector2Int gridMoveDirectionVector;
            switch (gridMoveDirection) {
                default:
                case Direction.Right: gridMoveDirectionVector = new Vector2Int(+1, 0);break;
                case Direction.Left: gridMoveDirectionVector = new Vector2Int(-1, 0); break;
                case Direction.Up: gridMoveDirectionVector = new Vector2Int(0, +1); break;
                case Direction.Down: gridMoveDirectionVector = new Vector2Int(0, -1); break;
            }
            gridPosition += gridMoveDirectionVector;

            bool cargotfuel = levelGrid.Trycarfuel(gridPosition);
            if (cargotfuel)
            {
                carsize++;
                CreateCarSize();
            }


            if (carMovePositionList.Count >= carsize + 1)
            {
                carMovePositionList.RemoveAt(carMovePositionList.Count - 1);
            }

            foreach (Carsize carsize in carSizeList)
            {
                Vector2Int carSizeGridPosition = carsize.GetGridPosition();
                if (gridPosition == carSizeGridPosition)
                {

                    //print("Gameover");
                    state = State.Dead;
                }
            }


            transform.position = new Vector3(gridPosition.x, gridPosition.y);
            //move transform based on location of gridPosition

            transform.eulerAngles = new Vector3(0, 0, GetAngleFromVector(gridMoveDirectionVector) - 90);
            //modify transform to face the correct way

            UpdateCarSize();

        }
    }


    private void CreateCarSize()
    {
        carSizeList.Add(new Carsize(carSizeList.Count));
    }

    private void UpdateCarSize(){
        for (int i = 0; i < carSizeList.Count; i++) {
            carSizeList[i].SetCarMovePosition(carMovePositionList[i]);
            //carSizeList[i].SetGridPosition(carMovePositionList[i].GetGridPosition());
        }
    }

    private float GetAngleFromVector(Vector2Int dir)
    {
        float n = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        if (n < 0) n += 360;
        return n;
    }

    public Vector2Int GetGridPosition()
    {
        return gridPosition;
    }

    //returns car list of positions full with body
    public List<Vector2Int> Getcargridpositionlist(){
        List<Vector2Int> gridPositionList = new List<Vector2Int>() { gridPosition };
        foreach (CarMovePosition carMovePosition in carMovePositionList)
        {
            gridPositionList.Add(carMovePosition.GetGridPosition());
        }
        return gridPositionList;
    }

    private class Carsize{

        private CarMovePosition carMovePosition;
        private Transform transform;

        public Carsize(int sizeIndex){
            GameObject carsGameObject = new GameObject("carBody", typeof(SpriteRenderer));
            carsGameObject.GetComponent<SpriteRenderer>().sprite = GameAssets.instance.carsSprite;
            carsGameObject.GetComponent<SpriteRenderer>().sortingOrder = -sizeIndex;
            transform = carsGameObject.transform;
        }

        public void SetCarMovePosition(CarMovePosition carMovePosition){
            this.carMovePosition = carMovePosition;

            transform.position = new Vector3(carMovePosition.GetGridPosition().x, carMovePosition.GetGridPosition().y);

            float angle;
            switch (carMovePosition.GetDirection()){
            default:
                case Direction.Up:// going up
                    switch (carMovePosition.GetPreviousDirection()){
                        default:
                            angle = 0; break;
                        case Direction.Left: // was going left
                            angle = 0 + 45; break;
                        case Direction.Right:// was going right
                            angle = 0 - 45; break;
                    }
                    break;
                case Direction.Down:
                    switch (carMovePosition.GetPreviousDirection()){
                        default:
                            angle = 180; break;
                        case Direction.Left:
                            angle = 180 + 45; break;
                        case Direction.Right:
                            angle = 180 - 45; break;
                    }
                    break;
                case Direction.Left:
                    switch (carMovePosition.GetPreviousDirection()){
                        default:
                            angle = -90; break;
                        case Direction.Down:
                            angle = -45; break;
                        case Direction.Up:
                            angle = 45; break;
                    }
                    break;
                case Direction.Right: // going right
                    switch (carMovePosition.GetPreviousDirection()){
                    default:
                        angle = 90; break;
                    case Direction.Down: // previously going down
                        angle = 45; break;
                    }
                    break;
            }
            transform.eulerAngles = new Vector3(0, 0, angle);
        }

        public Vector2Int GetGridPosition()
        {
            return carMovePosition.GetGridPosition();
        }
    } 

    private class CarMovePosition{

        private CarMovePosition previousCarMovePosition;
        private Vector2Int gridPosition;
        private Direction direction;

        public CarMovePosition(CarMovePosition previousCarMovePosition, Vector2Int gridPosition, Direction direction){
            this.previousCarMovePosition = previousCarMovePosition;
            this.gridPosition = gridPosition;
            this.direction = direction;
        }

        public Vector2Int GetGridPosition(){
            return gridPosition;
        }

        public Direction GetDirection(){
            return direction;
        }

        public Direction GetPreviousDirection(){
            if (previousCarMovePosition == null){
                return Direction.Right;
            } else {
                return previousCarMovePosition.direction;
            }
        }

    }
    }

这可能是我之前必须在 unity2d 本身中单击/拖动某些内容的情况。但我现在很失落。


它告诉你的是

[SerializeField] private Car car; 

未在代码中初始化,但这很好,因为您正在检查器中初始化它。如果你想消除警告,可以将其设置为 null:

[SerializeField] private Car car = null;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我该如何解决这个错误?字段从未分配并且始终具有空值[重复] 的相关文章

随机推荐