תנועה לכיוון המבט
חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 41 מתוך 56.
כשהמצלמה מביטה בשחקן מזווית, החצים צריכים להזיז את השחקן כפי שהמסך מציג זאת: למעלה הולכים הרחק מהמצלמה, ימינה הולכים ימינה ביחס למצלמה. צירי העולם עושים זאת רק כשהמצלמה מביטה לאורך +z. לכן בונים את התנועה מכיווני המצלמה עצמה, cam.forward ו־cam.right.
תחילה צריך לנקות אותם. למצלמה שמביטה מטה אל השחקן יש forward שמצביע אל תוך האדמה, לכן מגדירים את y ל־0 כדי להשאיר רק את החלק לאורך הקרקע. מה שנשאר קצר מ־1, בערך 0.87 עבור מצלמה שמוטה מטה ב־30 מעלות, ולכן השחקן היה הולך לאט יותר; לכן מנרמלים אותו. הדמות הזו עוקבת אחרי המצלמה הראשית, שמביטה בפינה של השלב:
Transform cam = Camera.main.transform;
Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();
Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize(); // תנועה באלכסון אינה מהירה יותר
controller.Move(move * speed * Time.deltaTime);Camera.main היא המצלמה שמתויגת MainCamera. שני הכיוונים נקראים בכל פריים, כך שהפקדים נשארים נכונים כשהמצלמה מסתובבת. למעלה וימינה יחד מחברים שני וקטורי יחידה שניצבים זה לזה, שאורכם יחד בערך 1.41, ולכן התנועה מנורמלת כשהיא ארוכה מ־1.
אתגר
בינוניהמצלמה מסתובבת לאט סביב השחקן (CameraRig.cs, מוכן), כך שצירי העולם ממשיכים להסתובב על המסך. גרמו לחץ להזיז את השחקן ביחס למצלמה בתוך Mover.cs, שבו כוח הכבידה כבר כתוב. בחלון Inspector מגדירים את speed (4) ואת cam, ה-Transform של המצלמה.
- למעלה מזיז את השחקן הרחק מהמצלמה לאורך הקרקע, למטה לכיוונה, ימינה ושמאלה לצדדים המתאימים ביחס למצלמה:
speedיחידות בשנייה בכל כיוון, כולל באלכסון, אף שהמצלמה מביטה מטה אל השחקן. - בזמן שהוא זז, השחקן מסתובב ופונה לכיוון התנועה. כשהוא עוצר, הוא ממשיך לפנות לאותו כיוון.
לחצו על Play, הסתובבו בזמן שהמצלמה מסתובבת, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
public class Mover : MonoBehaviour
{
public float speed = 4f;
public float gravity = -15f;
public Transform cam;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
verticalSpeed += gravity * Time.deltaTime;
// נע לאורך צירי העולם: יש לגרום לו לנוע ביחס ל-cam ולפנות לכיוון התנועה
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה בונים משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעות