Menu
CoddyTech

أدر بسلاسة

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 45 من 71.

إن ضبط transform.rotation مباشرةً على دوران جديد يجعل الجسم يدور في إطار واحد. تُرجع Quaternion.RotateTowards(current, goal, maxDegrees) قيمة current بعد تدويرها باتجاه goal بمقدار لا يتجاوز maxDegrees، ولا تتجاوز الهدف أبدًا. باستخدام turnSpeed * Time.deltaTime كخطوة، يدور الجسم بمعدل ثابت ويتوقف عند هدفه تمامًا، كما تفعل MoveTowards مع المواضع. تتبع زهرة عباد الشمس هذه الشمس بمعدل 30 درجة في الثانية:

public Transform sun;
public float turnSpeed = 30f;

void Update()
{
    Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
    transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}

تستغرق زهرة عباد الشمس 3 ثوانٍ لتدور نحو شمس تبعد عنها 90 درجة، بمعدل 30 درجة في كل ثانية. إنها تدور في الاتجاه الأقصر، ويُعاد حساب الهدف في كل إطار، لذا فهي تتابع الشمس المتحركة.

Quaternion.Slerp(a, b, t) هو الدوران الذي يقطع جزءًا t من المسافة من a إلى b، كما تفعل Vector3.Lerp مع النقاط. عند كتابة Slerp(transform.rotation, goal, 5f * Time.deltaTime) في Update()، فإنه يقطع جزءًا من الزاوية المتبقية في كل إطار: سريعًا في البداية، ثم أبطأ فأبطأ كلما اقترب من الهدف، ولا يدور أبدًا بسرعة ثابتة ولا يصل إليه تمامًا. يناسب هذا التدرج دوران كاميرا أو رأس. عندما يكون معدل الدوران قاعدة في اللعبة، مثل مدفع يدور 60 درجة في الثانية، استخدم RotateTowards.

challenge icon

التحدي

متوسط

اجعل البومة تدور بسلاسة نحو الاتجاه الذي يشير إليه كل سهم.

  1. أضف Quaternion goal; واجعل قيمته transform.rotation في Start().
  2. عند Input.GetKeyDown لكل سهم، عيّن قيمة goal، على سبيل المثال goal = Quaternion.LookRotation(Vector3.right);: الأعلى +z، واليمين +x، والأسفل -z، واليسار -x.
  3. في كل إطار، عيّن transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.

اضغط على «العب» ثم اضغط على الأسهم. بعد ذلك اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class Owl : MonoBehaviour
{
    public float turnSpeed = 180f;

    void Update()
    {
        // أعلى، يمين، أسفل، يسار: استدر لتواجه +z، +x، -z، -x بسرعة turnSpeed درجة في الثانية.
    }
}

جميع دروس الفيزياء وأسلوب اللعب

تدرّب بنفسك: Playground لـ Unity