Menu
CoddyTech

תנועה לכיוון המבט

חלק מהיחידה בניית משחקים אמיתיים במסלול ה-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.

challenge icon

אתגר

בינוני

גרום למקשי החצים להניע את השחקן ביחס למצלמה המסתובבת.

  1. ב־Update(), העתק את cam.forward ואת cam.right, עם y בערך 0, ונרמל אותם.
  2. dir הוא forward כפול ציר "Vertical" הגולמי ועוד right כפול "Horizontal", ומנורמל כשהאורך שלו גדול מ־1.
  3. כאשר 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);
    }
}

כל השיעורים ביחידה בניית משחקים אמיתיים

תרגלו בעצמכם: Unity אונליין