Làm thế nào để tôi chờ để thực thi mã?


7

Tôi đang cố gắng tạo ra một thang máy tương đối đơn giản (về cơ bản là dịch chuyển tức thời người chơi), nhưng tôi không muốn nó dịch chuyển tức thời chúng. Tôi muốn người chơi vào máy va chạm, đợi 2-3 giây và sau đó thực hiện để làm cho nó có vẻ tự nhiên hơn.

Mã của tôi cho đến nay:

using UnityEngine;
using System.Collections;

public class Teleporter : MonoBehaviour
{
    public GameObject TeleportTo;
    //public Material NewSkybox;

    void TimerInvoke()
    {

    }

    void OnTriggerEnter(Collider other)
    {

        Vector3 displacement = other.transform.position - this.transform.position;

        other.transform.position = TeleportTo.transform.position;
        other.transform.position += displacement;

        //RenderSettings.skybox = NewSkybox;
    }
}

Ngoài ra nếu có thể tôi muốn đi lạc khỏi coroutines. Làm thế nào tôi nên làm điều này?



4
Tôi tò mò về lý do tại sao bạn muốn tránh công cụ được thiết kế để phục vụ cho kịch bản chính xác này?
Bóng tối

Câu trả lời:


5

Tôi thường làm điều đó với Coroutines, nhưng vì bạn rất cụ thể rằng bạn muốn tránh chúng, nên trong trường hợp của bạn, bạn có thể thử một thứ khá đơn giản như:

float delay = 0;
bool trigger = false;

public Update()
{
    if (delay > 0) delay -= Time.deltaTime;
    if (delay <= 0 && trigger) TeleportPlayer();
}

void OnTriggerEnter(Collider other)
{
    delay = 3;
    trigger = true;
}

void TeleportPlayer()
{
    Vector3 displacement = other.transform.position - this.transform.position;
    other.transform.position = TeleportTo.transform.position;
    other.transform.position += displacement;
    trigger = false;
}

Tất nhiên, điều chỉnh có thể được thực hiện tùy thuộc vào thời gian bạn muốn chờ đợi. Ngoài ra, hãy xem xét rằng deltaTime không giống nhau ở mọi khung hình, vì vậy nếu bạn cần độ chính xác ở mức độ khoa học cho sự chờ đợi của mình, một số điều chỉnh có thể sẽ được yêu cầu. Nhưng tôi nghĩ rằng bạn đã có ý tưởng về những gì mã đang làm.

Cuối cùng, có lẽ cũng quan tâm của bạn, xem thi này của một hàm WaitUntil được tạo ra một cách chính xác để tránh coroutines: http://theinstructionlimit.com/a-replacement-for-coroutines

EDIT: mặc dù câu trả lời chỉ có ý định đưa ra một ý tưởng cơ bản về cách xử lý những gì OP cần, tôi đã quyết định đưa vào biến "bool" như một cách đơn giản để tránh mã bắt đầu hành động mong muốn (trong trường hợp này là , fucntion "TeleporPlayer") khi mã được khởi tạo. Bằng cách đó, cuộc sống của độc giả học tập trong tương lai trở nên dễ dàng hơn.


Tôi đã thử kịch bản của bạn, nhưng tôi nhận được "tên 'khác' không tồn tại trong bối cảnh hiện tại.
Sie

@KernelPanic Ồ, lý do cho điều đó là tất cả chức năng "TeleportPlayer" chỉ là một phần của câu hỏi OP vì mục đích minh họa việc sử dụng mã. Thay vào đó, bạn chỉ nên thay thế nó cho bất kỳ chức năng nào bạn muốn thực hiện sau thời gian trì hoãn đã cho.
MA

1
Không phải mã này bị bắn ngay lập tức độ trễ quảng cáo là = 0?
Leggy7

@ Leggy7 Chắc chắn, đó là một ý tưởng cơ bản đơn giản chỉ để OP nắm bắt. Trong một câu trả lời cho một câu trả lời tương tự, tôi đã quan tâm đến những gì bạn nói: gamedev.stackexchange.com/questions/111275/ Nhưng Nhưng trong mọi trường hợp, tôi sẽ chỉnh sửa câu trả lời này ở đây để giúp mọi người đọc dễ dàng hơn trong tương lai. Cám ơn nhận xét của bạn
mand

4

Bạn cũng có thể sử dụng Invoke để đạt được.

void OnTriggerEnter(Collider other)
{
    Invoke("TeleportPlayer", 3f);
}
 void TeleportPlayer()
{

    Vector3 displacement = other.transform.position - this.transform.position;

    other.transform.position = TeleportTo.transform.position;
    other.transform.position += displacement;

    //RenderSettings.skybox = NewSkybox;
}

3

Sử dụng quân đoàn. Bạn có thể thấy yield return new waitforseconds(3);trong phương thức TeleportPlayer. Điều đó sẽ đợi 3 giây trước khi dịch chuyển tức thời người chơi. Tuy nhiên, hãy nhớ rằng nó chỉ dừng thực thi dòng tiếp theo trong coroutine. Tất cả các phương pháp khác tiếp tục được thực hiện.

 void OnTriggerEnter(Collider other)
        {
           StartCoRoutine("TeleportPlayer");

        }

IEnumerator TeleportPlayer()
{

            Vector3 displacement = other.transform.position - this.transform.position;
      Yield return new waitforseconds(3);

            other.transform.position = TeleportTo.transform.position;
            other.transform.position += displacement;

}

1
Chỉ cần lưu ý rằng OP đã đề cập rằng nếu có thể, Coroutines nên tránh. Không phải là câu trả lời của bạn sai hay không hữu ích.
MA

@ Tôi xấu không đọc được dòng cuối cùng
SanSolo

2

Tất nhiên, bạn có thể làm điều đó bằng mã, nhưng cách tiếp cận của tôi là "tự nhiên" hơn một chút.

Trong ví dụ của bạn - thang máy - tôi sẽ làm một cái gì đó như sau:

  • Khi người chơi vào thang máy, chơi hoạt hình (đóng cửa)
  • Trong hình ảnh động này, cuối cùng tôi sẽ đặt mã cho trình phát "dịch chuyển tức thời".

Vì vậy, bạn không cần phải điều chỉnh mọi thứ bằng mã, nhưng bạn sẽ làm điều này trong hoạt hình, vì vậy nó dễ dàng và tự nhiên hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.