תנועה לכיוון המבט
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 42 מתוך 60.
כשהמצלמה מסתכלת על השחקן מזווית, החצים צריכים להזיז את השחקן כפי שהמסך מציג זאת: למעלה גורם לו להתרחק מהמצלמה, וימינה גורם לו לנוע ימינה ביחס למצלמה. צירי העולם עושים זאת רק כשהמצלמה מסתכלת לאורך +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.
אתגר
בינוניגרום למקשי החצים להניע את השחקן ביחס למצלמה המסתובבת.
- ב־
Update(), העתק אתcam.forwardואתcam.right, עםyבערך 0, ונרמל אותם. dirהואforwardכפול ציר"Vertical"הגולמי ועודrightכפול"Horizontal", ומנורמל כשהאורך שלו גדול מ־1.- כאשר
dir != Vector3.zero, הגדר אתtransform.rotation = Quaternion.LookRotation(dir);. צור אתmoveמתוךdir * speed.
לחץ על "שחק": לחיצה למעלה מניעה את השחקן הרחק מהמצלמה, לכל כיוון שהיא פונה. לאחר מכן לחץ על "בדיקה".
נסו בעצמכם
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פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעותתרגלו בעצמכם: Unity אונליין