Yılanın Üzerinde Değil
Coddy'nin Unity Oyunu: 3D Yılan 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
OrtaYem asla yılanın üzerine düşmez.
Snakeiçindepublic bool Occupies(Vector3 cell)metodunu yaz: başın hücresi veya kuyruğun herhangi bir parçasının hücresi için true döndürsün.GameManager'ınMoveFood()metodunda,-snake.edgedeğerindensnake.edgedeğerine kadar x ve z üzerinde döngü kur;!snake.Occupies(cell)koşulunu sağlayan her hücreyiList<Vector3> freelistesine ekle ve yemifree[Random.Range(0, free.Count)]konumuna yerleştir.
“Oyna” düğmesine bas ve yılanı uzat: yem her zaman boş bir hücreye düşer. Ardından “Kontrol et” düğmesine bas.
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.
Unity Oyunu: 3D Yılan bölümündeki tüm dersler
Kendi başına pratik yap: Unity playground