مسار الكرة الوحدة 2d للمبتدئين

تحية للجميع. ستكرس هذه المقالة لكتابة تنبؤات لمسار الكرة في الوحدة. إصدار الوحدة 2019.0.6f

سنستخدم LineRenderer لرسم خط.

أولاً ، قم بإعداد LineRenderer:



ما الذي يجب تغييره:

  1. سمك الخط
  2. لون الخط
  3. مواد

لرسم LineRenderer في ثنائي الأبعاد ، تحتاج إلى إنشاء مادة باستخدام تظليل "العفريت / الافتراضي":



إنشاء برنامج نصي BallTrajectory وتحديد الحقول الضرورية.

تعريف المجال
public class TrajectoryRenderer : MonoBehaviour
{
      [SerializeField] LineRenderer lineRenderer; //  LineRenderer
      [SerializeField] int lineCount; // ,  ,     
      [SerializeField] float lineLenght; // 
      [SerializeField] Ball ball; //   
}


في البداية ، قمنا بتعيين العدد المطلوب من النقاط لـ LineRenderer.

  ابدأ الفراغ الخاص ( )
{
      lineRenderer . positionCount  =  lineCount ؛
}}

في المستقبل ، سنكتب رمزًا في وظيفة التحديث.

تحتاج أولاً إلى تحديد موضع الماوس في الإطار الحالي في إحداثيات العالم ، لذلك سنستخدم طريقة ScreenToWorldPoint لفئة الكاميرا.

Vector2 mousePos  =  الكاميرا . الرئيسية . ScreenToWorldPoint ( الإدخال . MousePosition ) ؛

بعد ذلك ، تحتاج إلى العثور على المتجه العادي القادم من مركز الكرة وتوجيهه إلى موضع الماوس.
اتجاه Vector2  =  mousePos  -  تحويل ( Vector2 ) . موقف .
الاتجاه . تطبيع ( ) ؛

بعد ذلك ، تحتاج إلى تحديد المكون الرأسي والأفقي لسرعة الكرة.

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

نص الكرة
public class Ball : MonoBehaviour
{
    Rigidbody2D rb;
    [SerializeField] float velocityScaler;
    public float velocity;
 
    Vector2 mousePos;
 
    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }
 
    private void Update()
    {
        mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        velocity = Vector2.Distance(transform.position, mousePos) * velocityScaler;
 
        if (Input.GetMouseButtonUp(0))
        {
            Vector2 direction = (mousePos - (Vector2)rb.transform.position);
            direction.Normalize();
            rb.velocity = direction * velocity;
        }
    }
}


تحديد سرعة الكرة
var vx = ball.velocity * direction.x;
var vy = ball.velocity * direction.y;


وأخيرًا ، نحتاج إلى مراجعة جميع نقاط LineRenderer وتحديد موضعها وفقًا للبيانات المستلمة.

تموضع نقطة
for (int i = 0; i < lineCount; i++)
{
      float t = i * lineLenght;
      var nextPos = new Vector2(vx * t, vy * t - (-Physics2D.gravity.y * t*t) / 2);
      lineRenderer.SetPosition(i, (Vector2)transform.position + nextPos);
}


يمكن عرض الرمز الكامل

هنا
public class BallTrajectory : MonoBehaviour
{
      [SerializeField] LineRenderer lineRenderer;
      [SerializeField] int lineCount;
      [SerializeField] float lineLenght;
      Ball ball;
 
      private void Start()
      {
            ball = GetComponent<BallController>();
            lineRenderer.positionCount = lineCount;
      }
 
      private void Update()
      {
            Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector2 direction = mousePos - (Vector2)transform.position;
            direction.Normalize();
 
            var vx = ball.velocity * direction.x;
            var vy = ball.velocity * direction.y;
 
            for (int i = 0; i < lineCount; i++)
            {
                  float t = i * 0.1f;
                  var nextPos = new Vector2(vx * t, vy * t - (-Physics2D.gravity.y * t*t) / 2);
                  lineRenderer.SetPosition(i, (Vector2)transform.position + nextPos);
            }
      }
 
}


لقطات الشاشة



شكرا لك على لونيبيتس العفاريت .

All Articles