- Home /
 
Make something change color for a set amount of time
Hello, I am trying to create a game that involves the player being hit and damaged by enemies. However, since I'm a beginner to Unity's C# library, I do not know how I can make it so that the player will change color for a set amount of time (in order to show that damage has been dealt). Would somebody mind giving me some advice on how to do this? Thanks!
Answer by Zeusko · Aug 04, 2017 at 11:08 PM
Since I think that you want to wait just a few frames, you could do something like this:
 int i = 0;
 bool timeIt = false;
 void Update () {
     if (beenHit){
         // change color
         timeIt = true;
     }
     if (timeIt)
         i++
     if (i==30) {
        // change color back
         i=0;
         timeIt = false;
     }
 }
 
              Answer by Awanonimik · Aug 05, 2017 at 12:08 AM
Or if you want to wait a set amount of seconds you can do something like this:
 public class ExampleClass : MonoBehaviour {
     public float waitTime = 1;
     private float timeAtStart;
     private bool first = true;
     void Update () {
         if (first) {
 
             // Change the colour
 
             timeAtStart = Time.time;
             first = false;
         }
         if (first == false && Time.time > timeAtStart + waitTime) {
 
             // Change the colour back
 
             first = true;
         }
     }
 
 }
 
               Note: the float value waitTime can be smaller than 1, allowing for short wait times.
Hope this helps,
Awanonimik
Answer by Dreadnought404 · Aug 05, 2017 at 01:46 AM
Ok, so far I have been able to register it to change the color of the player when he is hit, but I still can't figure out how to change him back.
Here's the complete PlayerController script:
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class PlayerControl : MonoBehaviour {
 
     public int moveSpeed;
     public int hitPoints;
     
     private Rigidbody rb;
     private bool playerControl = true;
         //The Boolean that detects if the player is hit or not
     private bool hitDetector = false;
 
     void Start () 
     {
         rb = GetComponent<Rigidbody>();
     }
  
     void Update () 
     {
         if (playerControl == true) 
         {
             float h = Input.GetAxis("Horizontal") * moveSpeed;
             float v = Input.GetAxis("Vertical") * moveSpeed;
             
             Vector3 vel = rb.velocity;
             vel.x = h;
             vel.z = v;
             rb.velocity = vel;
             
             if (hitPoints == 0)
             {
                 GetComponent<Renderer>().material.color = Color.grey;
                 playerControl = false;
             }
         }
                 //This script changes the color
         if (hitDetector == true)
         {
             for (int i = 0; i <= 300; i = i + 1)
             {
                 GetComponent<Renderer>().material.color = Color.yellow;
                 
             }
         }
                 //End of aforementioned script
     }
     
     void OnTriggerEnter (Collider other) 
     {
         if (other.gameObject.CompareTag("Enemy")) 
         {
             hitPoints = hitPoints - 1;
             hitDetector = true;
         }
         if (other.gameObject.CompareTag("Collectable"))
         {
             other.gameObject.SetActive (false);
         }
     }
 }
 
 
              Your answer
 
             Follow this Question
Related Questions
Time.deltaTime making color lerp appear fast, but won't reach 1 1 Answer
Distribute terrain in zones 3 Answers
How to change fall delay of a gameobject by time? 2 Answers
Is it possible to give certain number to Time.deltaTime? 1 Answer
change color of a cube having touched by Line Renderer 0 Answers