آموزش یونیتی unity قسمت چهارم

آقای پیر 1395/1/12 1988

آموزش قسمت چهارم یونیتی Unity

آموزش یونیتی unity قسمت چهارم

خوب درود خدمت همه شما دوستان عزیز،

علیرضا پیر هستم و با جلسه چهارم از سری آموزش های موتور بازیسازی یونیتی در خدمت شما هستم.

در قسمت قبل ما در ادامه مراحل ساخت بازی دو بعدیمون، کاراکتر، و زمین رو ساختیم، و همینطور برای کاراکترمون، عملکردهای مورد نیاز رو پیاده سازی کردیم، قبل از ادامه، به توضیح بخش کوچکی از کدِ جلسه ی قبل که بدون توضیح مونده بود میپردازیم، پس وارد محیط یونیتی بشید، و پروژه ی خودتون رو باز کنید و کد movement رو باز کنید.

بخشی از کد که توضیح داده نشده بود، این قسمت بود:

IEnumerator SitDown()
  {
    GetComponent().height=Sit;
    yield return new WaitForSeconds(1f);
    GetComponent().height=height;
  }

اگر دقت کرده باشید، ما وقتی بازیمون رو اجرا می کنیم و دکمه ی C رو میزنیم، کاراکتر چند ثانیه میشینه، و دوباره بلند میشه، در مواقعی که ما بخوایم که برای تابعمون زمان اجرا مشخص کنیم، میبایست که خروجی اون رو از اون IEnumerator قرار بدیم، به همین دلیله که خروجی این تابع رو از این نوع گذاشتیم؛

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

بنابراین با دستور:

GetComponent().height=Sit;

ابتدا مقدار ارتفاع کاراکتر رو کم می کنیم (به اندازه متغیر sit)

و سپس با دستور :

yield return new WaitForSeconds(1f);

به کامپایلر میگیم که 1 ثانیه صبر کنه

و در نهایت با دستور آخر مقدار ارتفاع کاراکتر رو به حالت عادی بر میگردونیم

این از این، حالا بیاید مشکل بعدی رو برطرف کنیم، یعنی مشکل اینکه دوربین با کاراکتر حرکت نمی کنه، ببینید ما برای اینکه جای دوربین رو تغییر بدیم، باید کدی برای دوربینمون بنویسیم، حالا، داخل این کدی که مینویسیم، باید جایِ دقیق خودِ کاراکتر رو بدونیم، و به مکانِ دوربین بر اساس مکانِ کاراکتر مقدار دهی کنیم، درسته؟

ما برای دسترسی در داخل یک کد به یک شیء داخل صحنه، چند تا راه داریم، یکی از اصلی ترین و بهترین راه ها، استفاده از تگ گذاری هست،

برای مثال ما به کاراکترمون، تگ Player رو میدیم، و بعد داخل کدهامون، میگیم شی ای که تگ Player داره ذو پیدا کن، و جاش رو تغییر بده، و یا مثلا بچرخونش، یا منفجرش کن یا هرکاری

پس اول باید برای کاراکترمون یک تگ مشخص کنیم، برای ایجاد یک تگ هم، روی کاراکتر کلیک کنید، و از پنجره ی Inspector و بخش Tag،

یک تگ رو به کاراکترتون نسبت بدید، میتونید یکی از گزینه های پیشفرض رو انتخاب کنید و یا اینکه با استفاده از گزینه ی Add tag... یک تگ جدید اضافه کنید و نسبتش بدید به شیءتون، من تگ Player که جزء گزینه های پیشفرض خودِ یونیتی هست رو به کاراکترم نسبت میدم:

آموزش یونیتی

با اینکار، مجوز دسترسی من در کد به شیء کاراکترم ایجاد شد،

حالا میتونم در کدم، با استفاده از این تگ، به کاراکترم دسترسی داشته باشم و ببینم مکانش کجاست که دوربین رو هم ببرم همونجا، خوب پس باز در پوشه ی Scripts کلیک راست کنید و یک کد سی شارپِ جدید ایجاد کنید، من اسمش رو میزارم CameraBehaviour

دوتا تابع دیگه رو بهتون معرفی می کنم، یکی تابع Awake و دیگری تابع LateUpdate

اگه یادتون باشه قسمت پیش یه تابع داشتیم به اسم start، تا اونجایی که اطلاعات احتمالا ناقصِ بنده قد میده و جستجو کردم در موردش،

تابع Start فقط وقتی فراخوانی میشه که کد شروع به کار کرده باشه، ولی awake قبل از اون فراخوانی میشه،

در واقع میتونیم بگیم تابع awake یه تابع سازندست، ولی تابع Start یعنی: این کار رو یک بار انجام بده برام

تابع بعدی LateUpdate هست، قسمت گذشته تابع Update رو داشتیم که متوالین اجرا میشد، ولی تابع LateUpdate در هر فریم فقط یکبار اجرا میشه.

ما از این دو تابع در داخل کدمون استفاده می کنیم؛ پس کدتون رو باز کنید، و کد زیر رو جایگزین کنید تا با هم بررسیش کنیم:

using UnityEngine;
using System.Collections;
  public class CameraBehaviour : MonoBehaviour {
   
    public float zDistance=-20f; // distance z
    public float camSpeed=3f; //camera movement speed
    private Transform mytransform; //temp for position
    private Transform target; // player transform
    private Vector3 camPosition; // new camera position
    
    void Awake ()
{
      mytransform=transform;
}
        // Use this for initialization
    void Start ()
    {
      target=GameObject.FindGameObjectWithTag("Player").transform; //find player position
}
    
    // Update is called once per frame
    void LateUpdate () 
{
      //make new position of camera with new y and z 
      camPosition=new Vector3(target.position.x,target.position.y,target.position.z+zDistance);
      //set new position 
      mytransform.position=Vector3.Lerp(mytransform.position,camPosition,Time.deltaTime*camSpeed);
    }
  }

ما دو تا متغیر از نوع float در کدمون قرار دادیم، به اسم های zDistanse که فاصله ی دوربین رو از هدف که همون کاراکتر باشه مشخص می کنه، و همینطور camSpeed که سرعت دنبال کردن کاراکتر رو مشخص می کنه.

متغیر mytransform برای مشخص شدن مکانِ اولیه دوربین هست، target برای مشخص کردن مکان هدف، یعنی همون کاراکتر، و camPosition برای مشخص کردن مکان جدید دوربین.

قبل از اجرای کد و در تابع Awake مقدار myTransform رو برابر مقدار فعلی Transform شیءمون که همون دوربین خواهد بود قرار میدیم.

کد مهم ولی این هست:

target=GameObject.FindGameObjectWithTag("Player").transform;

این کد میاد میگه از توی GameObject ها (اشیاء توی صحنه) ، شیء با تگ Player رو پیدا کن، و پیدا که کردی، مشخصات transformش رو بردار و بریز توی target

در واقع ما در این خط ، مشخصات مکانی کاراکترمون رو در داخل متغیر target ریختیم

حالا در تابع آپدیتمون، باید بگیم از مکانِ فعلی، برو به اون مکانی که ما میخوایم.

بنابراین در آپدیت، هربار مکان مورد نظر رو مشخص می کنیم با دستور:

camPosition=new Vector3(target.position.x,target.position.y,target.position.z+zDistance);

یعنی یه وکتور 3 دقیقا با مشخصات همون پلیر، با این تفاوت که مقدار zش با متفیر zDistanse جمع شده تا فاصلش از دوربین قابل کنترل باشه ایجاد می کنیم.

بعد از اینکار، باید دوربینمون رو از جایی که هست، ببریم به جای مورد نظرمون، یعنی camPosition.

ما میخوایم دوربیینمون نرم این حرکت رو انجام بده، و اینکار با تابع Lerp انجام میشه.

این تابع سه تا ورودی داره، مبدأ، مقصد، و سرعت، که میاد جسم رو از مبدأ با سرعت مشخص شده به مقصد میبره،

بنابراین داریم:

mytransform.position=Vector3.Lerp(mytransform.position,camPosition,Time.deltaTime*camSpeed);

و لزومی نداره تکرار کنم که اون ضریب Time.delteTime از تیک تیک (عبارت مناسب تری پیدا نکردم) شدن بازی ما جلوگیری می کنه.

حالا کدتون رو به دوربین نسبت بدید ( با همون روش درگ اند دراپ)

ولی قبل از تست بازی، اجازه بدید برای اینکه کمی بازیمون واقعی تر بشه، یه سری تغییراتی روی دوربینمون اعمال کنیم، روی دوربین کلیک کنید و از بخش Inspector و بخش Projection، مقدار رو به Orthographic تغییر بدید تا دید به شکل دو بعدی تغییر پیدا کنه، و مقدار Near رو 10 و Far رو 1000 قرار بدید:

آموزش یونیتی

حالا بازی رو اجرا کنید...

و این عالیه! حالا دوربین به همراه کاراکتر حرکت می کنه!

اما بعد از چند ثانیه که زمینمون تموم میشه! کاراکتر باز هم به اعماق منفی بی نهایت سقوط می کنه!

پیشنهاد شما چیه برای حل مشکل؟ ما میخوایم بازیمون و به تبع اون زمینمون تا بینهایت ادامه داشته باشه. سایز زمینمون رو بینهایت کنیم؟

یا هِی پشت هم زمین ایجاد کنیم روبروی کاراکتر؟

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

انشاألله این قسمت مفید بوده باشه، تا قسمت آینده خدانگهدار

دانلود دانلود PDF قسمت چهارم Unity

قسمت قبلی