Yılanın Üzerinde Değil
Coddy'nin Unity'de 3D Yılan Oyunu kursunda ders 9 / 14.
MoveFood() yılanın kapladığı hücreler de dahil olmak üzere herhangi bir hücreyi seçer. Yılanın altındaki yiyecek, yılan oradan hareket edene kadar yenemez ve yılan ne kadar uzunsa bu durum o kadar sık yaşanır.
Çözümlerden biri, hücre boş olana kadar yeniden seçim yapmaktır. Bu yöntem boş bir tahtada işe yarar, ancak tahta doldukça giderek daha fazla deneme gerektirir ve hiç boş hücre kalmadığında işlem hiç bitmez. Sağlam çözüm, önce boş hücrelerin bir listesini oluşturup içlerinden birini seçmektir: her boş hücrenin seçilme olasılığı eşittir ve tek bir seçim her zaman yeterlidir. Bir sinema, geç kalan bir konuğu aynı şekilde oturtur:
List<int> free = new List<int>();
for (int seat = 1; seat <= 40; seat++)
{
if (!taken.Contains(seat)) free.Add(seat);
}
int pick = free[Random.Range(0, free.Count)];Random.Range(0, free.Count), üst sınır dahil edilmediği için 0'dan sonuncu indekse kadar bir indeks döndürür. Listeyi oluşturmak için tahta, yılanın bir hücreyi kaplayıp kaplamadığını sorar: Snake üzerindeki, başı ve tüm parçaları kontrol eden bir yöntem.
Görev
OrtaSnakeiçinde,public bool Occupies(Vector3 cell)metodunu yaz:cellyılanın başının bulunduğu hücre veya bir kuyruk segmentinin bulunduğu hücre olduğunda true döndürsün.GameManageriçindeusing System.Collections.Generic;ekle veMoveFood()metodunu yeniden yaz: x ve z değerlerini tahtadaki her hücre boyunca döngüye sok, yılanın kaplamadığı her hücreyi birList<Vector3> freelistesine ekle ve yiyeceği bu listeden rastgele bir hücreye yerleştir.
Play'e bas, ardından Check'e bas. Kontroller tahtanın çoğunu yılanla doldurur ve yiyeceğin hâlâ boş hücreleri bulduğundan emin olur.
Kendin dene
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Snake snake;
public GameObject foodPrefab;
private Transform food;
private int score;
void Awake()
{
Instance = this;
}
void Start()
{
food = Instantiate(foodPrefab).transform;
MoveFood();
}
public bool IsFood(Vector3 cell)
{
return cell == food.position;
}
public void Eat()
{
score++;
MoveFood();
}
void MoveFood()
{
int x = Random.Range(-snake.edge, snake.edge + 1);
int z = Random.Range(-snake.edge, snake.edge + 1);
food.position = new Vector3(x, 0f, z);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.