Thực hiện một chức năng trong mười giây và vô hiệu hóa nó trong hai giây


10

Tôi có một chức năng cụ thể mà tôi đang gọi trong chức năng Cập nhật. Trong mười giây đầu tiên, chức năng sẽ được gọi trong chức năng Cập nhật, sau đó chức năng này sẽ bị vô hiệu hóa trong hai giây tiếp theo, sau đó kích hoạt lại trong mười giây tiếp theo. Chu kỳ này có nên lặp lại? Làm thế nào tôi có thể thực hiện nó?

Câu trả lời:


15

Ngoài ra, có một lớp lót sử dụng mô-đun:

void Update()
{
    //if you want it loop from specific start time rather than from start of the game, 
    //subtract said time value from Time.time argument value
    if(Mathf.Repeat(Time.time, execDuration + sleepDuration) < execDuration)
        executeFunction();
}

1
Có sự khác biệt giữa Repeat()%(mô-đun)? Tài liệu nói rằng "điều này tương tự như toán tử modulo nhưng nó hoạt động với số dấu phẩy động" , nhưng mô đun hoạt động với phao ...
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft có và không - theo như tôi biết trong các ngôn ngữ khác nhau, %toán tử thường hành động kỳ lạ - hoặc không hoạt động với các số dấu phẩy động, mang lại kết quả không chính xác hoặc bất ngờ cho hoạt động mô đun theo nghĩa toán học của nó (phản ánh bản chất phần cứng của các hoạt động trên số nguyên). Repeat()đã được chọn chỉ là một tùy chọn an toàn hơn để tránh sự cần thiết phải tìm kiếm triển khai chính xác của %toán tử trong C # / mono.
wonderra

3
Tôi nghĩ rằng mọi ngôn ngữ đều thực hiện tiêu chuẩn IEEE 754, nhưng TIL định nghĩa "modulo" của tiêu chuẩn là không trực quan nên hầu như không có ngôn ngữ nào thực hiện nó.
BlueRaja - Daniel Pflughoeft

Sẽ tốt hơn nếu bạn triển khai nhận xét qua mã dưới dạng một khối mã khác và đặt tiêu đề cho chúng phù hợp.
S. Tarık Çetin

6

Tôi đã không kiểm tra mã sau đây, nhưng bạn sẽ có ý tưởng:

public float wakeUpDuration = 10.0f ;
public float sleepDuration = 2.0f;
private bool callFunction = true ;
private float time = 0 ;

void Update()
{
    time += Time.deltaTime;
    if( callFunction )
    {
         if( time >= wakeUpDuration )
         {
             callFunction = false;
             time = 0 ;
         }
         else
         {
             foo(); // Your function
         }
    }
    if( !callFunction && time >= sleepDuration )
    {
        callFunction = true;
        time = 0 ;
    }
}

Điều đó chỉ nên làm việc nếu deltaTimetương đối ngắn. Nếu đồng bằng dài hơn sleepDurationthì điều này sẽ thất bại.
James Curran

nếu ngủDuration> Time.deltaTime, thì bạn không cần hệ thống như vậy.
Hellium

Không. Nói deltaTime là 2,75 giây. Bạn sẽ có 3 hoặc 4 cuộc gọi "hoạt động" sau đó một cuộc gọi "ngủ", cho đến khi hết 50 giây, khi đó bạn sẽ có 8 cuộc gọi hoạt động liên tiếp. Ngoài ra, trong trường hợp đó, cuộc gọi ngủ đầu tiên diễn ra ở mức 11 giây - bạn đặt lại thời gian về 0 - nên đặt thành 1.
James Curran

2
Trong Unity, Time.deltaTime biểu thị thời gian đã trôi qua giữa khung hiện tại của công cụ trò chơi và khung cuối cùng (do đó, tôi hy vọng cho người dùng cuối cùng rằng Time.deltaTime sẽ không bao giờ là 2,75 giây, ....). Trong ngữ cảnh này , bạn có thể "bỏ lỡ" một cuộc gọi đến chức năng hoặc "không" - gọi cho chức năng, đây không phải là vấn đề ở đây IMHO.
Hellium

4

Bạn có thể làm điều này với một coroutine cũng. Cái gì đó như

public class Comp : MonoBehaviour
{
  private bool _shouldCall;

  Start() 
  {
    StartCoroutine(UpdateShouldCall)
  }

  Update() 
  {
    if(_shouldCall)
        CallTheFunction();
  }

  IEnumerator UpdateShouldCall()
  {
    while(true) 
    {
        _shouldCall = true;
        yield return new WaitForSeconds(10);
        _shouldCall = false;
        yield return new WaitForSeconds(2);
    }
  }

}
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.