• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Ediezac · Dec 13, 2017 at 12:58 PM · frameratetime.time

How to create a framerate independent time delay in Update() without coroutines

I'm creating a turn based board game and trying to create a small pause between the cpu and human player. All my logic is in the Update() function so I can't use coroutines to simulate the pause so I created a method to try delay the time.

 void miniPause ()
     {
         maxPauseTime = Time.realtimeSinceStartup + 2.5f;
         while (Time.realtimeSinceStartup < maxPauseTime) {
             /*
              *Empty loop to create a time delay
              *between the Player && CPU turns
              */
             print ("Time  = " + Time.realtimeSinceStartup);
         }//end loop
     }

 void Update(){
    if(cpu.turn){
    
     miniPause();
     
     //instantiate cpu's piece on the board
      humanPlayer.turn = true;
      cpu.turn = false
    }
    if(humanPlayer.turn){   
       if(Input.Input.GetMouseButtonDown (0)){
         
         //Instantiate human player's piece on the board here
            humanPlayer.turn = false;
            cpu.turn = true
         }
    }
 }

The delay is created alright, problem is everything else pauses as well, like the the board piece stays suspended in mid-air until delay elapses then falls to the board with the cpu's piece.

Is there a way to halt the cpu player without stopping everything else like navmesh motion, particle effects.

Comment
Add comment · Show 3
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Zetya96 · Dec 13, 2017 at 01:29 PM 0
Share

You have a loop in the update, that blocks the whole update loop until 2.5s. Thats why your program freeze.

You could make a something like this:

 bool wait = false;
 
 
 void Update() {
 
    if(!pause) {
 
       /*GA$$anonymous$$E LOGIC*/
 
       if([PLAYER ENDTURN]) {
          pause = true;
          StartCoroutine(Count());
 }
 
 Ienumerator Count() {
   yield return new WaitforSeconds(2.5f);
   pause = false;
 }
avatar image Ediezac Zetya96 · Dec 13, 2017 at 04:32 PM 0
Share

I've been trying the subroutine way but it didn't work because of my approach. I wasn't forcing the cpu to stop I was just running the subroutine. That "pause" variable did the trick! Thank you kind sir! ...or maam, it works like a charm now.

avatar image Zetya96 Ediezac · Dec 13, 2017 at 05:32 PM 0
Share

Oops, I messed up the variable name.. Glad it works!

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by Larry-Dietz · Dec 13, 2017 at 04:47 PM

try something like this.

In the declarations section at the top`...

 public float CPUMoveTimer;

then in your update ...

  if(cpu.turn){
         
         if (CPUMoveTimer>0){
               CPUMoveTimer-=Time.deltaTime;
         } else {
           //instantiate cpu's piece on the board
             humanPlayer.turn = true;
             cpu.turn = false
         }         
     }
 if(humanPlayer.turn){   
        if(Input.Input.GetMouseButtonDown (0)){
          
          //Instantiate human player's piece on the board here
             humanPlayer.turn = false;
             cpu.turn = true
             CPUMoveTimer=2.5f;
          }
     }
  }

Might be a better way of doing it, but this is what I normally do in this situation, and it works.

Hope it helps, -Larry

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



Follow this Question

Answers Answers and Comments

73 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Heavy Processing Messes With Time.time 1 Answer

Physics behaviour changing with framerate - Is FixedUpdate() actually working properly? 3 Answers

iOS Keyboard makes performance suffer 3 Answers

How can I calculate the frame rate? I have some misunderstandings with deltaTime. 1 Answer

Camera.Render progressively takes longer if I stop and start game in Unity Editor 0 Answers

  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges