לגדול
שיעור 8 מתוך 14 בקורס משחק Unity: נחש תלת־ממדי של Coddy.
האכילה מאריכה את הנחש במקטע אחד. המקטע החדש מגיע למקום שבו היה קצה הזנב לפני הצעד: הזנב מתקדם קדימה, והמקטע החדש ממלא את התא שהקצה עזב, כך שהנחש גדל מאחור.
התא הזה נעלם ברגע שהזנב זז, לכן כדאי לזכור אותו קודם. ואז, כשהראש מגיע לאוכל, ליצור שם מקטע ולהוסיף אותו לרשימה, כך שהוא יעקוב אחריו החל מהצעד הבא. מקטע שנוצר אך לא נוסף לעולם לא זז. רכבת מוסיפה קרון מאחור באותו אופן:
Vector3 back = wagons[wagons.Count - 1].position;
// ... הרכבת ממשיכה לנסוע ...
Transform wagon = Instantiate(wagonPrefab, back, Quaternion.identity);
wagons.Add(wagon);הגדל את הנחש לפני הקריאה ל-Eat(). Eat() מזיזה את האוכל, ובשיעור הבא נגרום לה לחפש תא שהנחש לא מכסה, כולל המקטע החדש.
אתגר
בינוניכל מזון מוסיף חוליה לזנב.
- ב־
Snake, הוסף אתpublic Transform segmentPrefab;(הסצנה מקשרת אותו). - ב־
Step(), לפני שהזנב זז, שמור אתVector3 tailEnd: התא של החוליה האחרונה, או התא של הראש כשהזנב ריק. - כשאוכלים מזון, הוסף את
Instantiate(segmentPrefab, tailEnd, Quaternion.identity)אלtail, ואז קרא ל־Eat().
לחץ על "שחק" ואכול כמה פריטי מזון: הנחש גדל בקובייה אחת בכל פעם. ואז לחץ על "בדיקה".
נסו בעצמכם
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // שניות בין שני צעדים
public int edge = 7; // תאי הלוח משתרעים מ־-edge עד edge
public bool alive = true;
public List<Transform> tail = new List<Transform>();
private float timer;
private Vector3 direction = Vector3.right; // הכיוון שבו הראש נע בצעד האחרון שלו
private Vector3 nextDirection = Vector3.right; // הפנייה הממתינה לצעד הבא
void Update()
{
if (!alive) return;
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Turn(Vector3 newDirection)
{
if (newDirection != -direction)
{
nextDirection = newDirection;
}
}
void Step()
{
direction = nextDirection;
Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > edge || Mathf.Abs(next.z) > edge)
{
Die();
return;
}
for (int i = tail.Count - 1; i > 0; i--)
{
tail[i].position = tail[i - 1].position;
}
if (tail.Count > 0)
{
tail[0].position = transform.position;
}
transform.position = next;
if (GameManager.Instance.IsFood(next))
{
GameManager.Instance.Eat();
}
}
void Die()
{
alive = false;
}
}
כל השיעורים ביחידה משחק Unity: נחש תלת־ממדי
תרגלו בעצמכם: Unity אונליין