سكربت لتحريك الكاميرا للتتبع حركة اللاعب " CameraFollow "

تعد تحريك الكاميرا بشكل إحترافي داخل أي لعبة، من الأمور الهامة جدا لنجاح تلك اللعبة، فهو ما يضيف إلى أي لعبة شكلها الأحترافي الجميل، وهو كذلك ما يظهر ما في داخل اللعبة من عناصر.




عبر هذا المقال سنعرض لكم سكربت بسيط لتحريك الكاميرا داخل اللعبة لتتبع حركة اللاعب بشكل إحترافي داخل لعبتك، والسكربت كما تعودنا هو سكربت بسيط للتحريك، يمكن إعادة إستخدامه في أي لعبة، حيث يمكن التحكم في متغيرات السكربت من خارج محرر الأكواد عبر نوافذ اليونتي، ودون أي خبرة في البرمجة، ولكن رغم ذلك سوف نقدم لكم بعض من شرح الأكواد لهذا السكربت.

شرح الأكواد:

في البداية سنقوم بتعريف متغير نخصص له حفظ اللاعب الأساسي في اللعبة، وهو ما سوف تقوم الكاميرا بتحديد مكانه، ثم تقوم بعد ذلك بالتحرك لتكون متابعة دائما لحركته داخل اللعبة.

public GameObject followObject;

سنقوم بعد ذلك بتعريف متغير جديد من النوع فيكتور، وهو سوف يكون مخصص من أجل أن نحفظ بداخلة مقدار الإزاحة المطلوبة أو مقدار الإنتظار الذي سوف تنتظره الكاميرا قبل أن تبدأ في التحرك.

public Vector2 followOffset

وبعد ذلك سوف نقوم بتعريف متغير من النوع ''  float  '' حيث سيتم حفظ مقدار سرعة '' speed '' تحرك الكاميرا داخل اللعبة.

    public float speed = 3f;

بعد ذلك سوف نقوم بتعريف متغير خاص من النوع '' private  '' وهو متغير داخلى فقط يتم بتحديد قيمته من داخل السكربت وسوف نطلق عليه أسم ''threshold  '' وهو من النوع فيكتور '' Vector 2''.

private Vector2 threshold;

وفي هذا السطر البرمجي سوف نقوم بتعريف متغير من النوع ''  Rigidbody2D '' وهو سيكون خاص بتعريف وأضافة بعض من الخصائص الفيزيائية لللاعب داخل لعبتنا.

    private Rigidbody2D rb;


أما في الدالة "  Start " وهي الدالة التي تحتوي على الكود البرمجي الذي سيتم تنفيذه مرة واحدة فقط في بداية تشغيل اللعبة، فأننا هنا قمنا بتعريف قيم للمتغييرين "  threshold ، rb  " وهما خاصان بكل من تخصسص القيم الفيزيائة عبر تعريف " Rigidbody " وكذلك تخصيص متغير للداله " calculateThreshold ".

threshold = calculateThreshold();
rb = followObject.GetComponent<Rigidbody2D>();


الكود النهائي للسكربت:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour{
    public GameObject followObject;
    public Vector2 followOffset;
    public float speed = 3f;
    private Vector2 threshold;
    private Rigidbody2D rb;

    // Start is called before the first frame update
    void Start(){
        threshold = calculateThreshold();
        rb = followObject.GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void FixedUpdate(){
        Vector2 follow = followObject.transform.position;
        float xDifference = Vector2.Distance(Vector2.right * transform.position.x, Vector2.right * follow.x);
        float yDifference = Vector2.Distance(Vector2.up * transform.position.y, Vector2.up * follow.y);

        Vector3 newPosition = transform.position;
        if(Mathf.Abs(xDifference) >= threshold.x){
            newPosition.x = follow.x;
        }
        if(Mathf.Abs(yDifference) >= threshold.y){
            newPosition.y = follow.y;
        }
        float moveSpeed = rb.velocity.magnitude > speed ? rb.velocity.magnitude : speed;
        transform.position = Vector3.MoveTowards(transform.position, newPosition, moveSpeed * Time.deltaTime);
    }
    private Vector3 calculateThreshold(){
        Rect aspect = Camera.main.pixelRect;
        Vector2 t = new Vector2(Camera.main.orthographicSize * aspect.width / aspect.height, Camera.main.orthographicSize);
        t.x -= followOffset.x;
        t.y -= followOffset.y;
        return t;
    }
    private void OnDrawGizmos() {
        Gizmos.color = Color.blue;
        Vector2 border = calculateThreshold();
        Gizmos.DrawWireCube(transform.position, new Vector3(border.x * 2, border.y * 2, 1));
    }
}

نهاية وبعد ما قدمناه لكم هنا من هذا السكربت الصغير فأننا نأمل في أن ما يكون قد قدمناه قد كان مفيد، وللأسئلة واللإستفسارات يمكنكم ترك تعليق لنا أسفل أي من مقالاتنا وسوف نقوم بالرد عليه.

.

إرسال تعليق

1 تعليقات

Emoji
(y)
:)
:(
hihi
:-)
:D
=D
:-d
;(
;-(
@-)
:P
:o
:>)
(o)
:p
(p)
:-s
(m)
8-)
:-t
:-b
b-(
:-#
=p~
x-)
(k)