簡體   English   中英

Unity Destroy 和其他代碼不起作用?

[英]Unity Destroy and other code not working?

我正在嘗試制作 Snake 游戲,並且正在嘗試讓蘋果功能正常工作。 這個腳本的目的是,每當我的蛇越過蘋果時,蘋果就會消失並重新出現在屏幕上的隨機位置。 但相反,它什么也不做,知道為什么嗎?

PS:相機尺寸為 10,縱橫比為 16:9,這就是為什么我有一些奇怪的 Random.Range 值。 此外,我在 Update 中使用 Debug.Log 來確保變量有效,是的,每當我的蛇移動時,它的坐標就會顯示出來。

public class Apple_RandomSpawn : MonoBehaviour
{
    private Vector2 foodPos;
    private Snake_Move snakeMove;

    void Start()
    {
        SpawnApple();
    }

    public void Update()
    {
        transform.position = new Vector2(foodPos.x, foodPos.y);
        SnakeAte();
    }

    public void SpawnApple()
    {
        foodPos = new Vector2(Random.Range(-17, 17), Random.Range(-9, 9));
    }

    public void SnakeAte()
    {
        if (Mathf.Approximately(foodPos.x, snakeMove.pos.x) && Mathf.Approximately(foodPos.y, snakeMove.pos.y))
        {
            SpawnApple();
        }
    }
}

首先,它與您的問題沒有直接關系,但不要將GetComponent()或 GameObject.Find( GameObject.Find()放在Update() function 中。 這兩個,尤其是 GameObject.Find GameObject.Find() function 是超重的,所以建議你應該在Start()Awake()中調用這幾種 function ,或者在 ZA42F2ED4F8EBC02A 初始化時調用 function 它可以直接並嚴重影響游戲的性能,所以這是我的建議:

[SerializeField]
private Snake_Move snakeMove;

並通過 Inspector 拖動您的游戲對象(附加了Snake_Head組件)。 您應該始終首先考慮這種方式,而不是使用 GameObject.Find( GameObject.Find()GetComponent()

其次,不建議Float直接通過=比較相等,因為肯定有舍入誤差 關於比較 Unity 中的兩個浮點值,有一個幫助 function,例如Mathf.Approximately(float a, float b) 通過=直接比較兩個float值幾乎總是不會像您想象的那樣工作。

第三,您的代碼中似乎沒有Instantiate() function,但是您嘗試使用一個蘋果 object,並且每次使用它時,只需將其更改為 Z4757FE07FD492A8BE0EAZ.8A760DE 那為什么Object.Destroy(gameObject)存在呢? 你正在做的是,當你第一次得到它時就摧毀它。 我認為你必須刪除Destroy() function, SpawnApple()更改蘋果的目標坐標,position 將在Update() ZC1C425268E68385D14AB5074C17Z9 中更新。

並且不需要間接設置目標 position,並在Update() function 中對其進行更新。 可以直接設置apple的position,如:

// assuming you followed my suggestio aboven about snakeMove.

public void Update()
    {
        SnakeAte();

        Debug.Log(snakeMove.pos);
    }

public void SpawnApple()
    {
        transform.position = new Vector2(Random.Range(-17, 17), Random.Range(-9, 9));
    }

public void SnakeAte()
    {
        if (foodPos == snakeMove.pos)
        {
            SpawnApple();
        }
    }

首先,您最后一條評論中的 null 參考來自: private Snake_Move snakeMove; 它是一個私有變量,並且從未分配過。 您要么需要將其設為 public/[SerialistField] 並在檢查中分配它,要么有某種初始化 function 給它一個值。

對於命中檢測,如果您想檢查 2 個浮點數是否完全相同,Mathf.Approximately 會很好。 如果您正在檢查移動物體的 2 個位置,那么它們完全相同的機會非常低,並且可能取決於幀速率等。 保持您的實施,您可以檢查兩個位置之間的最小距離。 您可以調整 DISTANCE_THRESHOLD 以獲得更適合您的值。

public class Apple_RandomSpawn : MonoBehaviour
        {
            private const float DISTANCE_THRESHOLD = 0.1f;
            private Vector2 foodPos;
            private Snake_Move snakeMove;

            void Start()
            {
                SpawnApple();
            }

            public void Update()
            {                   
                SnakeAte();
            }

            public void SpawnApple()
            {
                foodPos = new Vector2(Random.Range(-17, 17), Random.Range(-9, 9));
                transform.position = new Vector2(foodPos.x, foodPos.y);
            }

            public void SnakeAte()
            {
                if (Vector3.Distance(foodPos, snakeMove) < DISTANCE_THRESHOLD)
                {
                    SpawnApple();
                }
            }
        }

現在請記住,由於您將蘋果傳送到一個純粹隨機的位置,它可能會立即傳送回您的蛇的頂部:)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM