آموزش تصویری ساخت بازی اتومبیل رانی توسط یونیتی – قسمت دوازدهم

آموزش تصویری ساخت بازی اتومبیل رانی توسط یونیتی – قسمت دوازدهم

  مشخصات آموزش

  •   مدت زمان 36 دقیقه و 45 ثانیه
      حجم فایل 85.7 مگابایت
      زبان آموزش فارسی

making car game in unity3dبا سلام خدمت دوستداران LearningTV

امروز هم قسمت دوازدهم این مجموعه رو آماده کردم تا بتونید ازش استفاده کنید.

توی این قسمت ما روی اصطکاک لاستیک ها و همچنین لیز خوردن خودرو هنگام ترمز کردن بحث خواهیم کرد. در ابتدای کار یک سری از تنظیمات Wheel Colider رو بهتون توضیح می دم و در ادامه ی کار با یک سری کد ساده به شما آموزش می دم که چگونه فیزیک خودرو هنگام ترمز کردن رو شبیه سازی کنید.

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

در قسمت های بعدی روی چرخش خودرو ، صدای خودرو هنگام ترمز، صدای موتور خودرو و اعمال یک تکسچر به عنوان خط ترمز روی زمین بحث خواهیم نمود.

making car game in unity3d

[stextbox id=”black”]کدهای #C استفاده شده در این آموزش در قسمت زیر قرار داده شده اند. می توانید از این کد ها استفاده کنید.[/stextbox]

کدهای #C استفاده شده در این آموزش:

using UnityEngine;
using System.Collections;

public class CarControll : MonoBehaviour {
    public WheelCollider WheelFL;
    public WheelCollider WheelFR;
    public WheelCollider WheelRL;
    public WheelCollider WheelRR;
    public Transform WheelFLTrans;
    public Transform WheelFRTrans;
    public Transform WheelRLTrans;
    public Transform WheelRRTrans;
    public float LowestSteerAtSpeed = 50;
    public float LowSpeedSteerAngle = 10;
    public float HighSpeedSteerAngle = 1;
    public float Deceleration = 40;
    public float TopSpeed = 150;
    public float CurrentSpeed;
    public float MaxReverseSpeed = 50;
    public float maxTorque = 50;
    public GameObject BackLightOBJ_Right;
    public GameObject BackLightOBJ_Left;
    public Material IdleBackLightMaterial;
    public Material BrakeBackLightMaterial;
    public Material ReverseBackLightMaterial;
    private bool Braked = false;
    public float MaxBrakedTorque = 100;
	private float MyForwardFriction;
	private float MySideWayFriction;
	private float SlipForwardFriction;
	private float SlipSideWayFriction;
	// Use this for initialization
	void Start () {
        rigidbody.centerOfMass = new Vector3(0,0,0);
		SetValues();
	}
	void SetValues(){
		MyForwardFriction=WheelRR.forwardFriction.stiffness;
		MySideWayFriction=WheelRR.sidewaysFriction.stiffness;
		SlipForwardFriction=0.04f;
		SlipSideWayFriction=0.08f;
	}
	// Update is called once per frame
	void FixedUpdate () {
        HandBrake();
        float SpeedFactor = rigidbody.velocity.magnitude / LowestSteerAtSpeed;
        float CurrentSteerAngle = Mathf.LerpAngle(LowSpeedSteerAngle,HighSpeedSteerAngle,SpeedFactor);
        if (Input.GetButton("Vertical") == false)
        {
            WheelRR.brakeTorque = Deceleration;
            WheelRL.brakeTorque = Deceleration;
        }
        else
        {
            WheelRR.brakeTorque =0;
            WheelRL.brakeTorque =0;
        }
        CurrentSteerAngle *= Input.GetAxis("Horizontal");
        CurrentSpeed = 2 * 3.14f* WheelRL.radius * WheelRR.rpm * 60 / 1000;
        CurrentSpeed = Mathf.Round(CurrentSpeed);
        if (CurrentSpeed < TopSpeed && CurrentSpeed>-MaxReverseSpeed && Braked==false)
        {
            WheelRR.motorTorque = maxTorque * Input.GetAxis("Vertical");
            WheelRL.motorTorque = maxTorque * Input.GetAxis("Vertical");
        }
        else
        {
            WheelRR.motorTorque =0;
            WheelRL.motorTorque =0;
        }
        WheelFL.steerAngle = CurrentSteerAngle;
        WheelFR.steerAngle = CurrentSteerAngle;
	}
    void Update()
    {
        BackLight();
        WheelPosition();
        WheelFLTrans.Rotate(WheelFL.rpm*360/60*Time.deltaTime,0,0);
        WheelFRTrans.Rotate(WheelFR.rpm * 360 / 60 * Time.deltaTime, 0, 0);
        WheelRLTrans.Rotate(WheelRL.rpm * 360 / 60 * Time.deltaTime, 0, 0);
        WheelRRTrans.Rotate(WheelRR.rpm * 360 / 60 * Time.deltaTime, 0, 0);
        WheelFLTrans.localEulerAngles = new Vector3(WheelFLTrans.localEulerAngles.x,WheelFL.steerAngle-WheelFLTrans.localEulerAngles.z,WheelFLTrans.localEulerAngles.z);
        WheelFRTrans.localEulerAngles = new Vector3(WheelFRTrans.localEulerAngles.x, WheelFR.steerAngle - WheelFRTrans.localEulerAngles.z, WheelFRTrans.localEulerAngles.z);
    }
    void BackLight()
    {
        if (CurrentSpeed > 0 && Input.GetAxis("Vertical") < 0 && Braked == false)
        {
            BackLightOBJ_Left.renderer.material = BrakeBackLightMaterial;
            BackLightOBJ_Right.renderer.material = BrakeBackLightMaterial;
        }
        else if (CurrentSpeed < 0 && Input.GetAxis("Vertical") > 0 && Braked == false)
        {
            BackLightOBJ_Left.renderer.material = BrakeBackLightMaterial;
            BackLightOBJ_Right.renderer.material = BrakeBackLightMaterial;
        }
        else if (CurrentSpeed < 0 && Input.GetAxis("Vertical") < 0 && Braked == false)
        {
            BackLightOBJ_Left.renderer.material = ReverseBackLightMaterial;
            BackLightOBJ_Right.renderer.material = ReverseBackLightMaterial;
        }
        else if(Braked==false)
        {
            BackLightOBJ_Left.renderer.material = IdleBackLightMaterial;
            BackLightOBJ_Right.renderer.material = IdleBackLightMaterial;
        }
    }
    void WheelPosition()
    {
        RaycastHit hit;
        Vector3 WheelPos;
        if (Physics.Raycast(WheelFL.transform.position, -WheelFL.transform.up, out hit, WheelFL.radius + WheelFL.suspensionDistance))
        {
            WheelPos = hit.point + WheelFL.transform.up * WheelFL.radius;
        }
        else
        {
            WheelPos = WheelFL.transform.position - WheelFL.transform.up * WheelFL.suspensionDistance;
        }
        WheelFLTrans.position = WheelPos;

        if (Physics.Raycast(WheelFR.transform.position, -WheelFR.transform.up, out hit, WheelFR.radius + WheelFR.suspensionDistance))
        {
            WheelPos = hit.point + WheelFR.transform.up * WheelFR.radius;
        }
        else
        {
            WheelPos = WheelFR.transform.position - WheelFR.transform.up * WheelFR.suspensionDistance;
        }
        WheelFRTrans.position = WheelPos;

        if (Physics.Raycast(WheelRL.transform.position, -WheelRL.transform.up, out hit, WheelRL.radius + WheelRL.suspensionDistance))
        {
            WheelPos = hit.point + WheelRL.transform.up * WheelRL.radius;
        }
        else
        {
            WheelPos = WheelRL.transform.position - WheelRL.transform.up * WheelRL.suspensionDistance;
        }
        WheelRLTrans.position = WheelPos;

        if (Physics.Raycast(WheelRR.transform.position, -WheelRR.transform.up, out hit, WheelRR.radius + WheelRR.suspensionDistance))
        {
            WheelPos = hit.point + WheelRR.transform.up * WheelRR.radius;
        }
        else
        {
            WheelPos = WheelRR.transform.position - WheelRR.transform.up * WheelRR.suspensionDistance;
        }
        WheelRRTrans.position = WheelPos;
    }
    void HandBrake()
    {
        if (Input.GetButton("Jump"))
        {
            Braked = true;
        }
        else
        {
            Braked = false;
        }

        if (Braked == true)
        {
			if(rigidbody.velocity.magnitude>1)
			{
				SetSlip(SlipForwardFriction,SlipSideWayFriction);
			}
			else
			{
				SetSlip(1,1);
			}
            WheelFR.brakeTorque = MaxBrakedTorque;
            WheelFL.brakeTorque = MaxBrakedTorque;
            WheelRR.brakeTorque = 0;
            WheelRL.brakeTorque = 0;
			if (CurrentSpeed < 1 && CurrentSpeed > -1)
        {
            BackLightOBJ_Left.renderer.material = IdleBackLightMaterial;
            BackLightOBJ_Right.renderer.material = IdleBackLightMaterial;
        }
        else 
        {
            BackLightOBJ_Left.renderer.material = BrakeBackLightMaterial;
            BackLightOBJ_Right.renderer.material = BrakeBackLightMaterial;
        }
        }
		else
		{
			SetSlip(MyForwardFriction,MySideWayFriction);
			WheelFR.brakeTorque =0;
            WheelFL.brakeTorque = 0;
		}
    }

	void SetSlip(float CurrentForwardFriction,float CurrentSidWayFriction)
	{
		WheelFrictionCurve RR_Side=WheelRR.sidewaysFriction;
		WheelFrictionCurve RL_Side=WheelRL.sidewaysFriction;
		WheelFrictionCurve FR_Side=WheelFR.sidewaysFriction;
		WheelFrictionCurve FL_Side=WheelFL.sidewaysFriction;

		WheelFrictionCurve RR_Forward=WheelRR.forwardFriction;
		WheelFrictionCurve RL_Forward=WheelRL.forwardFriction;
		WheelFrictionCurve FR_Forward=WheelFR.forwardFriction;
		WheelFrictionCurve FL_Forward=WheelFL.forwardFriction;

		RR_Forward.stiffness=CurrentForwardFriction;
		RL_Forward.stiffness=CurrentForwardFriction;
		FR_Forward.stiffness=CurrentForwardFriction;
		FL_Forward.stiffness=CurrentForwardFriction;

		RR_Side.stiffness=CurrentSidWayFriction;
		RL_Side.stiffness=CurrentSidWayFriction;
		FR_Side.stiffness=CurrentSidWayFriction;
		FL_Side.stiffness=CurrentSidWayFriction;

		WheelRR.forwardFriction=RR_Forward;
		WheelRL.forwardFriction=RL_Forward;
		//WheelFR.forwardFriction=FR_Forward;
		//WheelFL.forwardFriction=FL_Forward;

		WheelRR.sidewaysFriction=RR_Side;
		WheelRL.sidewaysFriction=RL_Side;
		//WheelFR.sidewaysFriction=FR_Side;
		//WheelFL.sidewaysFriction=FL_Side;
	}

}

[stextbox id=”Account_Sale”] جهت خرید این آموزش به مبلغ ۶۰۰ تومان می توانید از فرم زیر استفاده کنید.[/stextbox]

[parspalpaiddownloads id=”29″]

[stextbox id=”black”]

 

!!!!!!!!!!!!!!!!!!!!!!  در ضمن نظر یادتون نره ها  !!!!!!!!!!!!!!!!!!!!!!

[/stextbox]

 

۲ Responses to “آموزش تصویری ساخت بازی اتومبیل رانی توسط یونیتی – قسمت دوازدهم”

  1. مهدی گفت:

    سلام اقا سید میشه اموزش کامل را در یک مجموعه قرار بدید و ما از شما خرید پستی کنیم اینجوری ادم مخش هنگ میکنه .لطفا جوابشو بدید.

ارسال دیدگاه

نام (*)
پست الکترونیکی (*)
وبسایت

  مشخصات مدرس

سید حامد محمودزاده
دانشجوی رشته مهندسی مکانیک از دانشگاه سیستان وبلوچستان علاقه مند به مباحث گرافیکی انجام چندین طراحی شامل: طراحی تیزر - کلیپ - سایت و.... در حال حاضر مدیریت سایت Learningtv.ir رو برعهده دارم. در کل عاشق بازی سازی با یونیتی هستم.

  دوره‌های پیشنهادی

لوگوی جشنواره وب و موبایل ایران