[英]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.