اجرای کد بعد از گذشت یک زمان در یونیتی با متد StartCoroutine

اجرای کد بعد از گذشت یک زمان در یونیتی با متد StartCoroutine
یک روش دیگری که ساده‌تر است به انتهای مطلب لینک شد


ممکن است در پروژه‌ی خود نیاز داشته باشید که یک کدی بعد از گذشت یک یا دو یا چند ثانیه، اجرا شود؛ در این مطلب آموزشی روشی را به صورت کلیشه‌ای توضیح خواهیم داد که می‌توانید با استفاده از این روش، کدی را بعد از گذشت یک زمانی مشخص اجرا کنید.

متد StartCoroutine

کد زیر را در نظر بگیرید:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class RotateDelay : MonoBehaviour {
 
void Start() {
            StartCoroutine (FuLLKade());
}
 
void Update() {

}
 
private IEnumerator FuLLKade() {
            yield return new WaitForSeconds(5.0f);
            print(“FuLLKade.COM”);
}
 
}

متد StartCoroutine، نام یک متد دیگری را از ما دریافت کرده و سپس آن را اجرا می‌کند. همچنین متد بایسیتی IEnumerator را برگرداند. و داخل متد از دستور yield طبق کد بالا، برای ایجاد وقفه استفاده می‌کنیم. در کد بالا، ما 5 ثانیه وقفه ایجاد کرده و سپس عبارت «FuLLKade.COM» را پرینت کرده‌ایم.

یک مثال پیچیده

مثال: فرض کنید می‌خواهیم یک آبجکتی در صحنه‌ی خود قرار دهیم و اسکریپتی برای آن بنویسیم که در هر 2 ثانیه، 10 درجه در راستای محور y ها بچرخد!

  1. یک صحنه‌ی جدید ایجاد کرده و اسم آن را برای مثال TimeDelay بگذارید.
  2. یک GameObject از نوع Cube در صحنه‌ی خود قرار دهید.
  3. یک اسکریتپ سی‌شارپ به اسم RotateDelay ایجاد کرده و آن را به صورت زیر کامل کنید:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class RotateDelay : MonoBehaviour {
 
public float ySpeed = 10f;
public float delayTime = 2.0f;
public bool haveRotate = true;
 
void Start() {
check();
}
 
void Update() {
if (Input.GetKeyUp (KeyCode.R)) {
haveRotate = !haveRotate;
check ();
}
}
 
private void check() {
if (haveRotate) {
StartCoroutine (delay());
}
}
 
private IEnumerator delay() {
while (haveRotate) {
yield return new WaitForSeconds(delayTime);
transform.Rotate (new Vector3(0, ySpeed , 0));
}
}
 
}

پروپرتی ها

  • ySpeed: مشخص می‌کند که در هربار چه اندازه در راستای محور y ها چرخش داشته باشد.
  • dealyTime: مشحص می‌کند که در هربار، چقدر برای چرخش بعدی تاخیر داشته باشد.
  • haveRotate: مشخص می‌کند که آیا چرخشی داریم یا خیر. (برای توقف چرخش)

متد Check

این متد که خودمان آن را نوشته‌ایم، مقدار haveRotate را بررسی کرده و سپس چرخش را شروع می کند. یعنی اگر haveRoate برابر true باشد، بنابراین چرخش داشته و StartCoroutine را برای تابعی به نام delay ایجاد می‌کند.

متد delay

در داخل متد delay، یک حلقه‌ی while با شرط true بودن haveRotate وجود دارد و داخل این متد به مدت delayTime و با استفاده از yield مکث می‌کنیم و سپس به اندازه‌ی ySpeed چرخشی انجام می‌دهیم؛ همچنین متد delay را در متد check، پس از بررسی کردن haveRotate، توسط StartCoroutine، فراخوانی می‌کنیم.

درمورد StartCoroutine  و yield و IEnumerator و … بعدا در پست‌های جدایی توضیحات کاملی خواهیم داد و فعلا به صورت کلیشه‌ای بدانید که در هربار مکث داخل متد delay از کد زیر استفاده می کنیم.

1 yield return new WaitForSeconds(delayTime);

که به جای delayTime ، آن زمانی که می‌خواهیم مکث صورت گیرد را قرار می‌دهیم؛ این زمان نیز برحسب ثانیه است.

متد Update

در این متد بررسی کرده‌ایم که اگر کلید R فشرده شود، مقدار haveRotate برعکس شود؛ و سپس متد check فراخوانی شود.

تمرین

  1. یک ساعت با استفاده از این روش بنویسید.
  2. یک اسکریپتی بنویسید که با استفاده از متد MoveTowards ای که در کلاس Vector ها قرار دارد، از یک نقطه به یک نقطه‌ی دیگری حرکت کرده و برگردد و سپس همین عمل را از نو شروع کند و در هربار که به مقصد می‌رسد، تاخیری داشته باشد و سپس به نقطه قبلی خود برگردد. (آموزش تابع MoveTowards در یونیتی | حرکت مستقیم به یک نقطه مشخص)

مطالب مرتبط

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *