Мигание источников света

Программирование на Юнити.

Мигание источников света

Сообщение Sasha 23 авг 2011, 19:54

Привет всем.Я написал скрипт по автоматическому включению выключения источников света.Свет автоматичски включается выключается каждую минуту.Но мне нужно что бы он включался выключался каждую секунду.Всем спасибо за помощь.
Вот исходник

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PovL : MonoBehaviour
{
    public Light light;
    private float curTime = 0;

   void Start ()
    {
    curTime = Time.time;
   }
   void Update ()
    {
        curTime += Time.deltaTime;
        if (curTime / 60 >= 1)
        {
            light.enabled = !light.enabled;
            curTime = 0;
        }
   }
}
Sasha
UNец
 
Сообщения: 16
Зарегистрирован: 21 авг 2011, 10:01
Откуда: Одесса

Re: Мигание источников света

Сообщение defint 23 авг 2011, 20:02

Синтаксис:
Используется csharp
        if (curTime / 3600 >= 1)
 


ну судя по скрипту.
defint
UNIт
 
Сообщения: 94
Зарегистрирован: 10 авг 2009, 12:17

Re: Мигание источников света

Сообщение gnoblin 24 авг 2011, 00:14

скорее if (curTime/1 >= 1) ? :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Мигание источников света

Сообщение alexjmp 24 авг 2011, 07:14

Как я помню, компъютер отсчитывает время в миллисекундах...0.001 сек.
Тогда if (curTime >= (curTime + 1))
Независимый разработчик.
alexjmp
UNец
 
Сообщения: 19
Зарегистрирован: 05 май 2011, 23:24
Откуда: Питер

Re: Мигание источников света

Сообщение raul82 24 авг 2011, 07:37

Вроде Time.deltaTime равен параметру "Fixed Timestep" который по умолчанию 0.02
незнаю корректно ли использовать Time.deltaTime в апдейте? поэтому
высунув код из апдейта и заусунув в фиксед апдейт получам:
...
curTime = 0;
....

curTime += Time.deltaTime;
if (curTime >= 1)
{
light.enabled = !light.enabled;
curTime = 0;
}
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы

Re: Мигание источников света

Сообщение raul82 24 авг 2011, 07:41

а воопще наверно лучше через коротину, если точность не важна

Синтаксис:
Используется csharp
    IEnumerator MyFunc()
    {
      while (true)
      {

        yield return new WaitForSeconds(1f);

      light.enabled = !light.enabled;
...
 
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы

Re: Мигание источников света

Сообщение seaman 24 авг 2011, 12:25

Вроде Time.deltaTime равен параметру "Fixed Timestep" который по умолчанию 0.02
незнаю корректно ли использовать Time.deltaTime в апдейте?

Это не совсем верно.
Это
time in seconds it took to complete the last frame
Т.е. зависит от FPS. И обычно вызывается как раз в Update. Но вот если вызывать в FixedUpdate, тогда да -
When called from inside MonoBehaviour's FixedUpdate, returns the fixed framerate delta time.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Мигание источников света

Сообщение raul82 24 авг 2011, 12:45

seaman писал(а):
Вроде Time.deltaTime равен параметру "Fixed Timestep" который по умолчанию 0.02
незнаю корректно ли использовать Time.deltaTime в апдейте?

Это не совсем верно.
Это
time in seconds it took to complete the last frame
Т.е. зависит от FPS. И обычно вызывается как раз в Update. Но вот если вызывать в FixedUpdate, тогда да -
When called from inside MonoBehaviour's FixedUpdate, returns the fixed framerate delta time.

говорила мне мама "прежде чем чонить написать, сверся с референсом" :-B .
ну и ладно зато код правильно написал
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы

Re: Мигание источников света

Сообщение ScorpionMax 24 авг 2011, 12:53

Вот три скрипта, выбирай любой для себя. Каждый из них по разному реагирует.

Тут можно выстовить время. Кстати, если его поставить на Directional Light и выстовить допустим 30, то получится простая смена времени..

FlickeringLight.js
Синтаксис:
Используется javascript
var duration : float= 1.0;
function Update()
{
         // argument for cosine
         var phi : float = Time.time / duration * 2 * Mathf.PI;
         // get cosine and transform from -1..1 to 0..1 range
         var amplitude : float = Mathf.Cos( phi ) * 0.5 + 0.5;
         // set light color
         light.intensity = amplitude;
}
 



В этом скрипте вообще много всего, только настраивать нужно, есть звук но не играет.

flickeringLight.cs
Синтаксис:
Используется csharp
/* ----------------------------------------------
 *
 * Flickering Lights * (C)2010 Rouhee - Games
 *
 * timo.anttila@rouheegames.com
 *
 * http://www.rouheegames.com
 *
 * - Provided as is.
 * - You can change and distribute as you like.
 *
 * ------------------------------------------ */


using UnityEngine;
using System.Collections;

[RequireComponent( typeof( Light ) )]

public class flickeringLight : MonoBehaviour
{
    // Flickering Styles
    public enum flickerinLightStyles { CampFire = 0, Fluorescent = 1 };
    public flickerinLightStyles flickeringLightStyle = flickerinLightStyles.CampFire;

    // Campfire Methods
    public enum campfireMethods { Intensity = 0, Range = 1, Both = 2 };
    public campfireMethods campfireMethod = campfireMethods.Intensity;

    // Intensity Styles
    public enum campfireIntesityStyles { Sine = 0, Random = 1 };
    public campfireIntesityStyles campfireIntesityStyle = campfireIntesityStyles.Random;

    // Range Styles
    public enum campfireRangeStyles { Sine = 0, Random = 1 };
    public campfireRangeStyles campfireRangeStyle = campfireRangeStyles.Random;

    // Base Intensity Value
    public float CampfireIntensityBaseValue = 0.5f;
    // Intensity Flickering Power
    public float CampfireIntensityFlickerValue = 0.1f;

    // Base Range Value
    public float CampfireRangeBaseValue = 10.0f;
    // Range Flickering Power
    public float CampfireRangeFlickerValue = 2.0f;
   
    // If Style is Sine
    private float CampfireSineCycleIntensity = 0.0f;
    private float CampfireSineCycleRange = 0.0f;

    // "Glow" Speeds
    public float CampfireSineCycleIntensitySpeed = 5.0f;
    public float CampfireSineCycleRangeSpeed = 5.0f;

    public float FluorescentFlickerMin = 0.4f;
    public float FluorescentFlickerMax = 0.5f;
    public float FluorescentFlicerPercent = 0.95f;

    // NOT IMPLEMENTED YET !!!!
    public bool FluorescentFlickerPlaySound = false;
    public AudioClip FluorescentFlickerAudioClip;
    // ------------------------


        // Use this for initialization
        void Start () {
       
        }
       
        // Update is called once per frame
        void Update () {

        switch( flickeringLightStyle )
        {
            // If Flickering Style is Campfire
            case flickerinLightStyles.CampFire:

                // If campfire method is Intesity OR Both
                if( campfireMethod == campfireMethods.Intensity || campfireMethod == campfireMethods.Both )
                {
                    // If Intensity style is Sine
                    if( campfireIntesityStyle == campfireIntesityStyles.Sine )
                    {
                        // Cycle the Campfire angle
                        CampfireSineCycleIntensity += CampfireSineCycleIntensitySpeed;
                        if( CampfireSineCycleIntensity > 360.0f ) CampfireSineCycleIntensity = 0.0f;

                        // Base + Values
                        light.intensity = CampfireIntensityBaseValue + ( ( Mathf.Sin( CampfireSineCycleIntensity * Mathf.Deg2Rad ) * ( CampfireIntensityFlickerValue / 2.0f ) ) + ( CampfireIntensityFlickerValue / 2.0f ) );
                    }
                    else light.intensity = CampfireIntensityBaseValue + Random.Range( 0.0f, CampfireIntensityFlickerValue );
                }

                // If campfire method is Range OR Both
                if( campfireMethod == campfireMethods.Range || campfireMethod == campfireMethods.Both )
                {
                    // If Range style is Sine
                    if( campfireRangeStyle == campfireRangeStyles.Sine )
                    {
                        // Cycle the Campfire angle
                        CampfireSineCycleRange += CampfireSineCycleRangeSpeed;
                        if( CampfireSineCycleRange > 360.0f ) CampfireSineCycleRange = 0.0f;

                        // Base + Values
                        light.range = CampfireRangeBaseValue + ( ( Mathf.Sin( CampfireSineCycleRange * Mathf.Deg2Rad ) * ( CampfireSineCycleRange / 2.0f ) ) + ( CampfireSineCycleRange / 2.0f ) );
                    }
                    else light.range = CampfireRangeBaseValue + Random.Range( 0.0f, CampfireRangeFlickerValue );
                }
                break;

            // If Flickering Style is Fluorescent
            case flickerinLightStyles.Fluorescent:
                if( Random.Range( 0.0f, 1.0f ) > FluorescentFlicerPercent )
                {
                    light.intensity = FluorescentFlickerMin;

                    // Check Audio - NOT IMPLEMENTED YET
                    if( FluorescentFlickerPlaySound )
                    {

                    }
                }
                else light.intensity = FluorescentFlickerMax;
                break;

            default:
                // You should not be here.
                break;
        }
       
        }
}
 



А вот на мой взгляд самый простой и лучший способ мигания света.

LightinterlaceRoller.js
Синтаксис:
Используется javascript
var scrollSpeed = 0.1;

// flickerIntensity controlls the brightness value of the flickering light.  Default value is set to 0.2
var flickerIntensity = 0.2;

private var initialColor : Color;

private var flicker = 0.0;


function Start()
{
        initialColor = renderer.material.GetColor("_TintColor");
}

function Update ()
{  
        var offset = Time.time * scrollSpeed;
    renderer.material.SetTextureOffset ("_Interlace", Vector2(0.0, offset));
   
    var scaleY = Mathf.Sin (Time.time) * 0.2;
    renderer.material.SetTextureScale ("_Interlace", Vector2(2.0,scaleY  + 1.6));
   
    if (Random.value >= 0.7)
        {
                flicker = Random.value + flickerIntensity;
               
                light.intensity = flicker;
               
                renderer.material.SetColor ("_TintColor", Color(initialColor.r * flicker, initialColor.g * flicker, initialColor.b * flicker));
        }
       
        audio.pitch = scaleY + 1.0;    
}


Эти Скрипты всегда пригодятся.
3D max 2011, Photoshop CS и CS5. Game Develop Unity3D...
Аватара пользователя
ScorpionMax
UNIт
 
Сообщения: 61
Зарегистрирован: 28 дек 2010, 11:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7