سرعت و جهت (velocity) در یونیتی+نحوه محاسبه

بسم الله الرحمن الرحیم

چیست velocity


در دنیای سه بعدی یک وکتور 3 است که نشان می دهد جسم با چه سرعتی و در چه جهتی حرکت می کند .

مثلا وقتی می گوییم velocity یک ماشین => ( car_velocity = 3,0,0) است به این معنی است که این ماشین در جهت مثبت محور x با سرعت 3 در حال حرکت است که به زبان ساده می شود ماشین در حال حرکت به سمت راست با سرعت 3 است .

چه استفاده هایی از velocity میشود

در جاهای زیادی velocity به کارتان خواهد امد مثلا فرض کنید میخواید اگر کارکتر بی حرکت بود انیمیشن ایدل اجرا شود در این صورت کافی است بگویید

if (player_Velocity == vector3.zero) idle_Animtion.play();

چگونه velocity را در یونیتی به دست بیاوریم؟

  • راه های مختلفی برای اینکار وجود دارد . اگر ابجکت شما از سیستم فیزیک یونیتی استفاده می کند میتوانید از rigidbody برای گرفتن یا تنظیم کردن velocity استفاده کنید (rigidbody .velocity).
using UnityEngine;
using System.Collections;

// کد زیر ابجکت را با استفاده از  
//حرکت می دهدvelocity 

public class ExampleClass : MonoBehaviour
{
    public Rigidbody rb;

    private float time = 0.0f;
    private bool isMoving = false;
    private bool isJumpPressed = false;


    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        isJumpPressed = Input.GetButtonDown(&quotJump&quot);
    }

    void FixedUpdate()
    {
        if (isJumpPressed)
        {
            //ابجکت با سرعت ده واحد در ثانیه به سمت بالا می رود
            rb.velocity = new Vector3(0, 10, 0);
            isMoving = true;
            Debug.Log(&quotjump&quot);
        }

        if (isMoving)
        {
            // when the cube has moved for 10 seconds, report its position
            time = time + Time.fixedDeltaTime;
            if (time > 10.0f)
            {
                Debug.Log(gameObject.transform.position.y + &quot : &quot + time);
                time = 0.0f;
            }
        }
    }
}
https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html

اما اگر از navmesha استفاده میکنید با استفاده از NavMeshAgent.velocity به آن دسترسی پیدا کنید.

محاسبه velocity بدون Rigidbody

  1. پوزیشن کارکتر در فریم قبلی را از فریم فعلی کم کنید
  2. مقدار به دست امده را تقسیم بر دلتا تایم کنید

محاسبه بالا به شما velocity را به نسبت World شما نشان میدهد. اما برای بدست اوردن velocity نبست به لوکال ابجکت از transform.InverseTransformDirection(WorldSpace_Vlocity); استفاده کنید

مثال :

// کد زیر را در اپدیت اجرا کنید 
// این کد سرعت حرکت ابجکت به جلو را بدون نیاز به فیزیک محاسبه کی کند.

Vector3 previous_frame = Vector3.zero;
private void _velocity()
{
var current_frame = transform.localPosition;
var WorldSpace_velocity= (current_frame - previous_frame);
var Local_velocity = transform.InverseTransformDirection(WorldSpace_Vlocity);
print(Local_velocity.z / Time.deltaTime + &quotdif&quot);
previous_frame = current_frame;
}