برنامه نویس hossien014.github.io
سرعت و جهت (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("Jump");
}
void FixedUpdate()
{
if (isJumpPressed)
{
//ابجکت با سرعت ده واحد در ثانیه به سمت بالا می رود
rb.velocity = new Vector3(0, 10, 0);
isMoving = true;
Debug.Log("jump");
}
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 + " : " + time);
time = 0.0f;
}
}
}
}
https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html
اما اگر از navmesha استفاده میکنید با استفاده از NavMeshAgent.velocity به آن دسترسی پیدا کنید.
محاسبه velocity بدون Rigidbody
- پوزیشن کارکتر در فریم قبلی را از فریم فعلی کم کنید
- مقدار به دست امده را تقسیم بر دلتا تایم کنید
محاسبه بالا به شما 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 + "dif");
previous_frame = current_frame;
}
مطلبی دیگر از این انتشارات
معماری Scriptable Object بخش چهارم - معرفی نمونه کامل
مطلبی دیگر از این انتشارات
ساخت سرور بازی برای یونیتی
مطلبی دیگر از این انتشارات
ساخت بازی ساده با پایتون