2015-08-31 13 views
0

je l'animation suivante:Unity3D - Comment contrôler Light.Intensity sans animation

Voir sur la vidéo: Animation Light

Note: Ci-dessous l'image du contrôle d'animation

enter image description here

Comment puis-je obtenir le même résultat en utilisant un script? Mon intention est que le script n'a pas de "si".

Ne pas comme ça:

public float minIntensity; 
    public float maxIntensity; 

    public float intensityAmount; 

    private Light light; 

    void Awake(){ 
     light = GetComponent<Light>(); 
    } 

    void Update(){ 

     if (light.intensity > maxIntensity) { 
      light.intensity -= intensityAmount * Time.deltaTime; 
     } 
     else if (light.intensity < minIntensity) { 
      light.intensity += intensityAmount * Time.deltaTime; 
     } 


    } 

Je me demande s'il y a une possibilité de le faire en utilisant une fonction native ... comme: (Math.Clamp, Math.Lerp, Quaternion .Slerp) sans condition comme "si" dans le code.

Merci d'avance.

Répondre

1

Eh bien, comme vous l'avez mentionné, vous pouvez simplement utiliser un collier de serrage:

light.intensity = Mathf.Clamp(value, minIntensity, maxIntensity) 

Cependant, malgré l'absence de détails sur ce type d'animation que vous voulez, je suppose que vous voulez « ping pong » entre les min et le max. Si tel est le cas, nous pouvons utiliser notre onde sinusoïdale de voisinage amical pour cela.

public float Frequency = 10f; 
public float Magnitude = 2f; 

void Update() { 
    light.Intensity = Magnitude + Mathf.Sin(Time.timeSinceLevelLoad * Frequency) * Magnitude; 
} 

L'onde sinusoïdale va de -1 à 1, la valeur d'amplitude va le faire passer de (-magnitude à + magnitude) Étant donné que nous ne voulons pas une intensité lumineuse négative, on ajoute l'ampleur au début , donc le résultat final est (0 à 2 * magnitude) Vous pouvez changer cela pour travailler comme vous le souhaitez, mais le point devrait être clair.

La variable de fréquence va changer la vitesse à laquelle nous animons d'avant en arrière.

+0

Merci pour la réponse, ce n'est pas clair pour vous? S'il vous plaît voir la vidéo et voir le contrôle du rétroéclairage. Il fonctionne partiellement, il a besoin de la valeur pour travailler à partir de 4! intensité MIN = 4 intensité MAX = 7. Interpole entre ces valeurs. – IgoR

+1

@igao, vous pouvez utiliser une 'baseMagnitude' de 5.5 et une 'varMagnitude' de 1.5, donc: light.Intensity = baseMagnitude + Mathf.Sin (Time.timeSinceLevelLoad * Frequency) * varMagnitude; // De cette façon, la valeur de l'équation sera sur votre plage désirée (5.5 - 1.5 = 4 et 5.5 + 1.5 = 7) – mayo