2013-12-18 3 views
2

Hello Stack Overflow сообщество.Как создать белый прямоугольник в Unity 2D?

Я только начал использовать Unity для переноса своей видеоигры на несколько платформ. У меня возник вопрос о создании объектов программно в Unity. Это то, что это моя игра выглядит в настоящее время:

enter image description here

Когда пользователь нажимает на кнопку камеры, изображение с камеры весы больше OnTap и offTap. Я хочу, чтобы весь экран был белым только на короткую секунду, но я не знаю, как это сделать. Вот код C#, который у меня уже есть по этому вопросу:

using UnityEngine; 
using System.Collections; 

public class question3 : MonoBehaviour { 
    int cameraTaps = 0; 
    // Use this for initialization 
    void Start() { 

    } 

    IEnumerator CameraCoroutine() { 
     Debug.Log("Before Waiting 3 seconds"); 
     yield return new WaitForSeconds(3); 
     Debug.Log("After Waiting 3 Seconds"); 
     Application.LoadLevel("question4"); 
    } 
    // Update is called once per frame 
    void Update() { 
     if (Input.GetMouseButtonDown(0)) 
     { 
      RaycastHit hit; 
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

      if (Physics.Raycast(ray, out hit)) 
      { 
       if (hit.collider.gameObject.name == "camera") 
       { 
        var camera = (hit.collider.gameObject); 
        camera.transform.localScale += new Vector3(.1f, .1f, 0); 
       } 
      } 
     } 
     if (Input.GetMouseButtonUp(0)) 
     { 
      RaycastHit hit; 
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

      if (Physics.Raycast(ray, out hit)) 
      { 
       if (hit.collider.gameObject.name == "camera") 
       { 
        var camera = (hit.collider.gameObject); 
        camera.transform.localScale -= new Vector3(.1f, .1f, 0); 
        cameraTaps = cameraTaps + 1; 
        print (cameraTaps); 
        if (cameraTaps == 5) 
        { 
         StartCoroutine(CameraCoroutine()); 

        } 
        if (cameraTaps > 5) 
        { 
         Application.LoadLevel("fail"); 
        } 

       } 
       if (hit.collider.gameObject.name == "turtle") 
       { 

       } 
      } 
     } 
    } 
} 

Любая помощь будет очень признательна. Я действительно не знаю, как вставлять PNG или создавать прямоугольник, который накладывается на короткую секунду.

+1

Вам нужно ввести данные за это время? Если нет, вы можете создать объект с помощью OnGUI, который рисует белую прямоугольную полосу полного экрана, пока вам это не понадобится, а затем скройте или уничтожьте объект gameObject. Если вам нужна интерактивность во время белого, вы можете создать объект с вершинным шейдером, который рисует полноэкранный квадрат и присоединяет его к четвертому объекту Unity. – theodox

+0

Мне не нужен ввод. В принципе, мне нужен весь экран, чтобы на мгновение вспыхнуть белым. Весь экран должен быть белым на GetMouseButtonUp каждый раз, когда hit.collider активирован. Не могли бы вы помочь мне? Я очень новичок в единстве, и я не понимаю, как я мог написать этот код: D –

+4

Все, что вам действительно нужно сделать, это создать квадрат единицы и прикрепить его к своей камере, чтобы он отображался перед всем остальным. Дайте ему простой шейдер, такой как Unlit, и расположите его так, чтобы он полностью закрывал видоискатель камеры (вы можете установить его на камеру, чтобы он постоянно следил за камерой). Затем просто включите/отключите его из сценария – theodox

ответ

5

Это старый вопрос, никогда не менее я здесь с 2-решений для Вас: (Они были закодированы в C#)

Решение # 1: это именно то, что вы просили в формате кода. Я вполне уверен, что вы уже решили эту проблему (но это для всех, кто наткнулся на эту проблему).

//bFlashed is a boolean (you can name it what ever you like) 
void OnGUI() 
{ 
    if (bFlashed) 
    { 
     Texture2D tx2DFlash = new Texture2D(1,1); //Creates 2D texture 
     tx2DFlash.SetPixel(1,1,Color.white); //Sets the 1 pixel to be white 
     tx2DFlash.Apply(); //Applies all the changes made 
     GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), tx2DFlash); //Draws the texture for the entire screen (width, height) 
     StartCoroutine(SetFlashFalse()); 
    } 
} 
IEnumerator SetFlashFalse() 
{ 
    yield return new WaitForSeconds(1); //Waits 1 second before setting boolean to false 
    bFlashed = false; 
} 

Другой способ заключается в том, чтобы на самом деле обманывать огни Unity. Это мой любимый вариант, потому что вы сможете манипулировать местоположением света, интенсивности, дальности (при использовании spot/point light), цвета и многих других опций.

Для следующего решения я подключил простой компонент Light к основной камере.

  • Тип: Направленная
  • Цвет: Белый
  • Интенсивность: 8
  • Включено: Ложные

Решение # 2: Просто позвоните StartCoroutine(CameraFlash());, когда вы хотите, чтобы произойти вспышка

IEnumerator CameraFlash() //You can name this however you like 
{ 
    //Wait for 1/4 of a second (maybe you want a small sound to play before screen flashes) 
    yield return new WaitForSeconds(0.25f); 
    //Gets the light component from Main Camera 
    Light cameraFlash = GameObject.FindWithTag("MainCamera").GetComponent<Light>(); 
    //Enable the cameras Flash 
    cameraFlash.enabled = true; 

    //This will decrease the intensity every 0.05 of a second by 2 
    for (float f = 8; f >= 0; f -= 2) 
    { 
     cameraFlash.intensity = f; //Intensity takes in a float so you can really change this up nicely 
     //Just be sure that it sets to 0.0f at some point (so that there is no more excess light 
     yield return new WaitForSeconds(0.05f); 
    } 

    yield return new WaitForSeconds(2); 
    cameraFlash.enabled = false; //Be sure to disable it again (until you need it) 
    cameraFlash.intensity = 8; //And reset the intensity back to 8 
} 
Смежные вопросы