בששת השבועות האחרונים הייתי מאוד עסוק, למרות ש"להיות עסוק" התבטא בלהיות מחובר למחשב ולא לקום מהכסא. זר שהיה רואה אותי היה חושב שמצאתי עבודה אמיתית ואני עובד מהבית, ולמעשה הוא לא היה ממש טועה. באמת עבדתי,... על יעד מספר שמונה ברשימה שלי. ומשהושלם, הגעתי לשלושים ושבעה יעדים מתוך חמישים.
מספר פעמים כתבתי כאן שאני מסווג את את היעדים שנותרו לקבוצות, לפי קריטריונים כמו רמת קושי וזמן נדרש לביצוע. למרבה הצער רוב היעדים שנותרו ממתינים לרגיעה המיוחלת בקורונה, ומבין הנותרים יש שניים שמצד אחד אין מניעה להתחיל אותם, אך מצד שני דורשים השקעת זמן לא עצומה, אך גם לא קטנה. לאחד משני היעדים האלו אני מקדיש לא מעט מחשבה, אך נוטה להמתין איתו, ובינתיים סיימתי את השני: לכתוב משחק מחשב. מכיוון שאני אוהב שהיעדים שלי מוגדרים באופן מדיד, הוספתי בסוגריים את ההסבר הבא: "ב-unity, או משהו בסגנון, ברמה של tutorial פלוס". אם לא הבנתם את ההערה האחרונה, לא נורא, אני אסביר בהמשך.
המחשב הראשון שלי היה Apple II plus וקיבלתי אותו בשנת 1981, בגיל 6, אולי קצת לפני. לא היה הרבה מה שיכולתי לעשות איתו, אבל כבר אז למדתי תכנות בשפה גראפית שנקראה LOGO. כמה שנים אחרי זה, בבית הספר היסודי, למדתי שפת Basic בעזרת החוברות של חברת "מחשבת". בחטיבה כבר היו לי שיעורי תכנות בשפת פסקל וגם נבחנתי בבגרות 5 יחידות במדעי המחשב. מכאן התחילה קריירה לא מפתיעה, של שירות צבאי בתפקיד שכלל פיתוח תוכנה, שלושה תארים אקדמיים בתחום (ועוד כמה בתחומים אחרים) ומספר שנים בהיי טק.
מהפסקה האחרונה נראה שכל חיי ידעתי מה אני רוצה ופעלתי כדי להתקדם בכיוון הזה, אבל ההעדפות שלי השתנו בלי ששמתי לב. כשהייתי ילד הייתי כותב תוכנה בשביל הכיף, אבל עם השנים עשיתי את זה פחות ופחות, מבחירה. הכמיהה ליצור משהו בעזרת קוד פחתה עוד ועוד. אני חושב שלא מצאתי את עצמי בין שני קטבים שנעתי ביניהם. בשנות השמונים והתשעים יצא לי לכתוב תוכניות קטנות יחסית. למשל, משחק hangman טקסטואלי, או תרגיל בקורס אוניברסיטאי. בעבודות כאלו צריך לכתוב מאפס את הכל ומתקבל תוצר שהוא לגמרי שלי אבל די מוגבל ולא מלוטש.
כשהגעתי לתעשית ההי טק, נתקלתי בסוג אחר של פיתוח תוכנה שלא הייתי רגיל אליו, ולא מצא חן בעיני. לכל חברה יש תשתית תוכנה עצומה, שאין לי מושג איך יצרו אותה, וכעובד אני צריך להכיר ולהבין חלק מסויים ממנה ולהכניס שינויים שלי בתוכה. אם בפרויקטים הקטנים שכתבתי לעצמי, או כחלק מתרגיל ללימודים הייתי דווקא טוב, ורק מתוסכל מתוצר הלא מרשים שאפשר לייצר בזמן סביר, פה הביעה היתה הפוכה. שינוי קטן יכול למנף מערכת ענקית ולייצר אימפקט גדול, אבל הייתי ממש גרוע בזה. שום דבר בהכשרה שלי לא הכין אותי לסוג כזה של עבודה. לרוב התקשיתי להבין את המערכות שהייתי צריך לעבוד בתוכן וממש פחדתי לגעת בהן. יתר על כן, לא נראה שלעובדים סביבי יש בעיה כזו. בעוד שלי היתה עקומת למידה איטית, התרשמתי שהם לא היו זקוקים לעקומת למידה בכלל.
כשאתה פוחד לכתוב קוד, קשה להתמיד בתפקיד שזו הדרישה המרכזית שלו. לאחר מספר נסיונות להחליף פרוייקט ולהחליף חברה, החלטתי לעזוב את התחום וכך הגעתי למשרת סגל הוראה במכללה שאני נמצא בה עד היום. רגע לפני שהתחלתי ללמד שם, התחלתי בהנחייה של פרוייקטי גמר של סטודנטים לתואר ראשון בהנדסת תוכנה. בהתחלה קצת נלחצתי, כי ראיתי רשימה של פרוייקטים לדוגמה ואמרתי לעצמי שאני לא רק שלא הייתי מצליח להרים פרוייקטים כאלו, גם לא הייתי מעז לנסות כי לא הייתי יודע מאיפה להתחיל. תוך כדי המחזור הראשון והשני של ההנחיה הלחץ ירד. ראשית, אין סיבה שאהיה לחוץ כי אני המנחה. הסטודנט הוא זה שצריך לפתח את הפרויקט ולכן הלחץ עליו. שנית, רוב הסטודנטים לא לחוצים. לא רק שהם לא פחדו להתחייב על ביצוע של משהו שבתחילת הדרך, אין להם מושג איך לבצע ומה יכול להסתבך בדרך, בסופו של דבר, למרות הסתבכויות, הם מצאו את הדרך להגיע לסיום, גם אם לפעמים נדרשו שינויים מסויימים בתכנון הפרוייקט או חיתוכי פינות.
שמתי לב שהעבודה של הסטודנטים מאוד שונה מהתוכניות הקטנות שעומדות בפני עצמן שאני כתבתי כסטודנט, וגם הם ממשיכים לכתוב אותן במסגרת קורסי הליבה של התואר שלהם. כיום יש עולם שלם תשתיות זמינות שאפשר להתקין לבד, יחד עם מדריכים מקוונים שמסבירים הכל, והרבה מהדברים האלו הם אפילו בחינם. הסטודנטית הראשונה שהנחיתי עבדה על פרוייקט בלמידה ממוחשבת למרות שהידע היחיד שלה בתחום היתה הרצאה תיאורטית של שעה שאני העברתי לה. שאלתי אותה איך היא למדה להשתמש בתשתית קוד שהיא מצאה ברשת כדי לבסס עליה את הליבה החכמה של הפרויקט שלה, והיא ענתה לי שהיא עוקבת אחרי מדריכים ב-YouTube. אם רק לי היו מדריכים כאלו כשהייתי צריך אותם...
באותה שנה נודבתי להנחות פאנל של "בקרת עמיתים", שבו מתכנסים כעשרה סטודנטים שנמצאים יחסית בשלב מוקדם של הפרוייקט שלהם ומציגים את התכנון שלהם כדי לתת ולקבל פידבק. אחד מהסטודנטים פיתח משחק בתלת מימד ודיבר הרבה על התאוה שלו לפיתוח משחקים ועל מחקר מקדים שעשה על תשתיות אפשריות לפיתוח המשחק, בסופו בחר באחת שנקראת unity. לסיום, הראה לנו על הסמארטפון גירסה ראשונית שכללה דמות משחק שאפשר להניע אותה בתוך מה שנראה כמו חדר בבניין משרדים.
רוב פרוייקטי הגמר במכללה אינם משחקים, אבל כמה שנים לאחר מכן הנחייתי סטודנטית שבחרה לכתוב משחק במציאות רבודה (Augmented Reality), טכנולוגיה שבה מקרינים הדמיה של גופים תלת מימדיים על גבי צילום וידאו. אמרתי לה שבכל מה שקשור ללוגיקה של המשחק שרצתה לפתח, אני יודע בדיוק מה היא צריכה לעשות, אבל בנוגע לפן הטכנולוגי היא לגמרי לבדה. גם היא השתמשה ב-unity ולמעשה הצד הטכנולוגי היה החלק שהיה לה הכי קל בפרויקט.
בשלב הזה אמרתי לעצמי שאם הם יכולים, גם אני רוצה, והוספתי יעד לרשימה במקום די גבוה (מספר שמונה). הרעיון היה ללמוד להשתמש בטכנולוגיה כלשהי לפיתוח, כשציינתי את unity בתור התשתית היחידה לפיתוח משחקים שהכרתי, ולא להתאמץ יותר מדי מעבר לזה. לכן, כמדד, קבעתי שאמצא מדריך לימודי כלשהו ואבנה משהו שהוא טיפה יותר מהבסיס שהמדריך מספק.
חמש שנים של דחיינות חלפו, והעזתי להיכנס לאתר של unity. מתברר שכמחצית מהמשחקים בעולם מפותחים על התשתית הזו, ולמרות שהיא בתשלום, יש לה גרסה חופשית די נדיבה, ומאגר עצום של מדריכים וקורסים אונליין, גם הם בחינם. הרבה מהתשתית הלימודית הזו היא מהשנה או שנתיים האחרונות, אז טוב שחיכיתי. מצאתי קורס מבוא למתחילים והתחלתי לעקוב אחרי ההוראות.
המשימות הראשונות בקורס עסקו בטכנוקרטיה של התקנת תשתיות על המחשב ופתיחת חשבון, ולאחריהן התקנה של משחק חצי מוכן מהמותג של Lego. במשחק שולטים בדמות לגו בתוך עולם לגו, שהגיע פחות או יותר מוכן, והלומדה עוסקת בהשלמת חלקים חסרים במשחק. כל האתגר הפיתוחי נעשה באופן גראפי לחלוטין, בלי טיפת תכנות. רוצים להוסיף קוביית לגו לעולם שלכם? תגררו אותה למקום המתאים. הצמדתם אותה לקוביה אחרת? הן יתחברו כמו קוביות לגו בעולם האמיתי. רוצים להנפיש את דמויות הלגו שלכם? הוסיפו להן קוביות עם תכונות, כמו קוביה שגורמת לדמות לנוע לכיוון מסויים, להתכל על השחקן או לירות לעברו.
 |
משחק הלגו |
לחצו כאן ותוכלו לשחק במשחק, על גבי מחשב נייד / נייח בלבד, ולא בסמארטפון / טאבלט (אני מתנצל מראש, כל הקישורים בפוסט הזה לא יעבדו על סמארטפון. קראו את הפוסט הזה במחשב רגיל). השליטה בדמות היא עם מקשי החיצים, ואפשר לקפוץ עם מקש הרווח. לחיצת כפולה על הרווח נותנת קפיצה כפולה. המצלמה עוקבת אחרי השחקן, אבל לא מסתובבת יחד איתו. הזזה של העכבר תסובב את המצלמה. אם הדמות לא מגיבה ללחיצות על המקשים, הקליקו על המסך עם העכבר וזה יסתדר. המטרה במשחק היא לאסוף 15 קוביות מרחפות לאורך מסלול מכשולים. אני מזכיר ש-95% ממה שאתם רואים היה שם גם קודם ואני רק שיניתי והוספתי דברים בשוליים.
העבודה על משחק הלגו היתה נחמדה, אבל זה לא היה מה שחיפשתי. הרי קיבלתי משהו מוכן. בהמשך, הלומדה עברה לפיתוח פרויקטים קטנים כדי לתת טעימה מאלמנט כלשהו ה-unity. למשל, כאן יש סימולציה של כדור נופל על מסילה, שהכנתי כחלק מהלימוד של המנוע הפיזיקלי.
 |
"עבודת הגמר" של ההכשרה הבסיסית |
הקורס המקוון שעשיתי כמעט לא עסק בקוד. רק חלק אחד שלו באמת דרש כתיבת שורות בודדות. הוא בעיקר עסק במתן דוגמיות של מרכיבי התשתית - שימוש באודיו, דו מימד, תלת מימד וכן הלאה. חלקו האחרון עסק בסקירה (די מיותרת עבורי) של אופצייות התמקצעות להמשך. בסופו של הקורס קיבתתי תעודה וירטואלית שסיימתי הסמכה שאפילו אפשר לקשר אותה לפרופיל ב-LinkedIn.
לא הרגשתי שהלומדה הבסיסית הזה ממצה, ומצאתי לומדה נוספת, קצת יותר מקיפה. כאן צריך להסביר שיש אינסוף לומדות מקוונות באתר של unity, אבל חלקן מקובצות לקורסים קצת יותר גדולים, וחלק מהקורסים מקובצים ל"מסלולי הכשרה". למעשה, בתוכן החינמי יש שני מסלולים כאלו, זה שהרגע תיארתי ומסלול נוסף שנקרא Junior Programmer. קצת התלבטתי לגבי המסלול הזה בגלל השם שלו. הרי לתכנת אני יודע, למרות שלא בשפת #C, שבה משתמשים ב-unity. אני לא מחפש תכנות בסיסי אלא השלמה של החלקים שקשורים לפיתוח ב-unity. לקחתי הימור והתחלתי את המסלול הזה.
ההכשרה היתה בנויה מארבעה חלקים, שכל אחד מהם מחולק להרבה מאוד שיעורי משנה. שני החלקים הראשונים היו מאוד מוצלחים. הם היו בנויים מסרטוני וידאו בהן המדריך עבר שלב אחרי שלב על מה שהוא עושה. בכל יחידה מפתחים משחק חדש, ויש גם תרגיל שבו מקבלים משחק דומה לזה שפיתחנו עם המדריך אבל עם מספר שגיאות שנשתלו בו שיש לתקן.
 |
סומו כדורים. אחד מהמשחקים שפותחו בלומדה |
הלומדה נבנתה לכאורה כך שתתאים לאנשים ללא ידע תכנותי כלל, ובגלל זה הרצתי את קטעי הוידאו במהירות של פי 1.5, אבל לדעתי זו דרך איומה ללמוד תכנות. המשחקים בלומדה דרשו מעט קוד יחסית, ומישהו שמגיע עם אפס רקע בתחום יכול להסתדר עם חיפוש בפורומים באינטרנט והעתקה עוורת של שורות קוד שהוא מוצא שם (הפרקטיקה המומלצת על ידי המדריך, וגם אני השתמשתי בה) אבל בלי להבין מה עושים אפשר להתקדם עד גבול מסויים, ולא יותר. מה שכן, בשביל משחק קטן ולא מלוטש, זה יכול להספיק.
 |
הדמיית פצ'ינקו. אחד מתרגילי החובה בקורס. |
מעבר למדריכים מוקלטים, הלומדה הכילה גם מבחן בסוף כל יחידה ותרגיל מעשי להגשה, אחד או יותר. אין באמת בקרה לגבי מה מוגש, אבל עשיתי את התרגילים בלי לרמות. גם המבחן הוא קצת בלוף, כי אפשר להיבחן בו שוב ושוב והשאלות לא מתחלפות. בנוסף, לא כל החומר במבחן הופיע בקורס, כך שמי שבאמת הגיע עם אפס ידע לקורס לא היה יכול להצליח בחלק מהשאלות. המטלה האחרונה של החלק השני בלומדה הציבה דרישה די מינימלית, לעשות שימוש בכדור ולהציג מונה על המסך, אבל מה שיצא היה משחק קליעה למטרה (סרטון הדגמה מופיע בהמשך). אם הייתי רוצה הייתי להכריז על זה בתור המשחק שלי, אבל כבר היה לי משחק יותר מעניין בפיתוח שרציתי להשלים.
משהו מאוד מוצלח במהלך שני החלקים הראשונים של ההכשרה היה שבמקביל לתהליך הלמידה, התבקשתי לחשוב על משחק משלי בתור פרוייקט סיום, ומדי פעם לפתח חלק ממנו. התקשיתי מאוד בבחירת המשחק. הלומדה כוונה אותי, בצדק, לא להסתבך במשהו מתוחכם מדי ולהשתדל לפשט כמה שיותר. רוב המשחקים שהוצגו בלומדה, למרות שהיו שונים מאוד זה מזה, היו מאוד דומים באופי שלהם: השחקן שולט בדמות מסויימת ומנסה להתחמק ממכשולים, או לחלופין לפגוע בהם. ניסיתי לחשוב על אלמנט מקורי משלי, וכיוונתי למשחק שיהיה מבוסס על מחשבה ולא על מהירות תגובה. את התוצאה אציג בהמשך, אבל בכל מקרה השלבים הראשונים בפיתוח נבנו כך שיתאימו לכל משחק: להציב על המסך גופים כמו כדורים וקוביות שהם ממלאי מקום של האלמנטים במשחק; להגדיר איך הם נעים ואיך השחקן שולט בדמות שלו; להגדיר את הלוגיקה הפיזיקלית: מה קורה כשמישהו נוגע במשהו. בסופו של דבר הגיע השלב הכיפי: להיכנס לחנות הדיגיטלית של unity ולהוריד "נכסים גראפיים" שיחליפו את הכדורים והקוביות. ל-unity יש מאגר עצום של אלמטנטים גראפיים ואנימציות שיצרו המשתתפים. רוב הנכסים האלו נמכרים בכסף, אבל יש גם לא מעט חופשיים לשימוש בחינם. החלק השני של הלומדה הסתיים כשיש לי התחלה של משחק, אבל רחוק מלהיות גמור. יש דמויות, יש תנועה, אבל אין לוחות, אין תפריטים, אין אפקטים ויזואליים וקוליים.
החלק השלישי של הלומדה היה חשוב עבורי, אבל בנוי הרבה פחות טוב. הוא עסק באלמנטים עמוקים יותר של הנדסת תוכנה שרלוונטים (גם) לפיתוח משחקים, כמו ממשקי משתמש או ניהול אירועים (אם קרה משהו במשחק שצריך להשפיע על משהו אחר, איך חלקים שונים בקוד יתקשרו ביניהם ויעבירו ביניהם את המידע הזה). הבעיה היא שהחלק הזה לא נבנה כקורס אחד אלא היה הדבקה של לומדות שונות ולא קשורות. בנוסף, לא היה תרגול עצמי נוח אלא פשוט וידאו של מדריך שמסביר מה הוא עושה, מבלי להנחות אותי איך לעקוב אחרי הפעולות שלו. בנוסף, המדריכים השונים השתמשו בכלים שונים לפתור בעיות דומות, דבר מבלבל שלא נתן כיוון לגבי הפרקטיקה המומלצת.
תרגיל הגמר של החלק השלישי היה לבנות ממשק משתמש, שחייב להכיל כל מיני אלמנטים כמו שינוי גודל, צבע וצורה של גופן. לא משהו שהייתי צריך למשחק שלי, אבל החלטתי לממש את התרגיל על גבי המשחק הלא גמור שלי ואז לשנות את התפריטים למה שבאמת אצטרך. אני מצרף כאן סרטון של התוצאה, שבסופה מופעל המשחק הלא גמור, שלא נגעתי בו במהלך החלק השלישי של ההכשרה, וניתן לראות מה מומש בשלב הזה:
החלק הרביעי והאחרון של ההכשרה היה קצר יחסית ודי מיותר. הוא עסק בדברים חשובים כמו אופטימיזציה של ביצועים ומערכות לניהול גרסאות, אבל ממש לא דברים שהייתי צריך למשחק הקטן שלי. מיהרתי לסיים את החלק הזה. בגלל שאלות שלא כוסו בחלק הזה, הייתי צריך שני נסיונות כדי לעבור את הבחינה ולהגיש מסמך אפיון שאף אחד לא בודק אותו כדי לסיים את ההכשרה שלי.
עכשיו התפניתי לחזור למשחק שלי, A-Maze Me. זה מבוך שכחלק מהפיתרון שלו צריך לשנות חלקים מהמבוך: להזיז מכשולים ולפתוח שערים. מראש החלטתי להסתפק בשלושה שלבים, ולוותר על גירסה למובייל, נושא שלא כוסה בהכשרה שלקחתי. נדרשו עוד כמה ימים לתכנון הלוחות, סידור התפריטים, ליטושים אחרונים ותיקונים שונים. היות שהמשחק פותח תוך כדי למידה, הקוד שלו מכיל הרבה בלאגן והוא לא מופת להנדסת תוכנה איכותית, אבל הוא עובד. ביום רביעי סיימתי אותו והכרזתי ניצחון, אם כי כשנתתי לילדים שלי לשחק בו ביום שישי, התגלה באג שדרש תיקון.
אם תרצו (ואתם רוצים), תוכלו להוריד את המשחק מהקישור הזה. אני מזכיר, מחשבים בלבד, לא מובייל. אם האנטי וירוס שלכם מתרה בכם לא לפתוח את הקובץ, תסמכו עלי ותתעלמו ממנו בהפגנתיות. הרצת הקובץ תתין ספריה על המחשב וממנה יש להריץ את הקובץ Personal Project - Amaze Me. לעצלנים, יש סרטון שמדגים את פתרון הלוח הראשון של המשחק (הרמה עולה, הלוח השלישי והאחרון כבר קצת מאתגר).
אחד מהדברים ששמתי לב אליהם כשנתתי לאנשים אחרים לשחק במשחק הוא שהשליטה בדמות היא לא אינטואיטיבית. בעיקרון זה היה אמור לשלוח אותי לחשוב על ממשק המשתמש מחדש, אבל ממש לא התחשק לי ולכן תוך שימוש בתרוץ ש"כשמבינים איך זה עובד מתרגלים די מהר", אני אסביר כאן: השליטה בשחקן היא בעזרת מקשי החיצים. כדי שהדמות תנוע קדימה, צריך ללחוץ על החץ "למעלה" לחיצה רציפה, והוא יזוז כל עוד המקש לחוץ. אם תלחצו לחיצה מהירה וקצרה, לא יקרה כלום. בנוסף, כיוון התנועה הוא לפי המבט של הדמות. "למעלה", יגרום לו לנוע לכיוון אליו הוא מסתכל (שאינו בהכרח כלפי מעלה במסך המחשב), ו"למטה" יזיז אותו אחורה (לאט יותר, במכוון). החיצים לימין ולשמאל יסובבו אותו במקום.
בזמן הפיתוח לא יכולתי להתנתק מהמשחק. ממש הרגשתי שאני יכול להמשיך לעשות רק את זה לתמיד. כשהגעתי לשלב שבו החלטתי שהמשחק מוכן, הרגשתי אחרת, הרגשה של מיצוי, לפחות בינתיים. אם שיחקתם במשחק, או לפחות צפיתם בסרטון, ספרו לי בתגובות מה חשבתם.
תהנו.