使用Unity中的事件触发器SetGazedAt来渲染颜色

时间:2015-08-12 04:58:15

标签: c# unity3d google-cardboard lerp

我正在使用纸板sdk,当我注意使用纸板sdk进行Unity时,我试图使对象颜色变亮。我使用下面的lerping脚本,当我将它附加到对象时,它的功能与注视无关,但是当我尝试使其版本在 SetGazedAt <内工作时,它不起作用/强>

以下是 SetGazedAt 的代码,用于更改对象的颜色。我该如何替换它或调用我所拥有的 Lerp 脚本,我的标题是填充?

Fill.cs

using UnityEngine;
using System.Collections;

public class Fill : MonoBehaviour {

float lerpTime = 2f;
float currentLerpTime;

//float moveDistance = 5f;



Color startColor = Color.clear;
Color endColor = Color.clear;



public void Start() {
    startColor = Color.clear;
    //endColor = new Color(0.0f,0.0f,1.0f,0.5f);
}

public void Update() {



    //reset when we press spacebar
    if (Input.GetKeyDown(KeyCode.Space)) {
        currentLerpTime = 0f;
        startColor = Color.clear;
        endColor = new Color(0.0f,0.0f,1.0f,0.5f);
    }

    //increment timer once per frame
    currentLerpTime += Time.deltaTime;
    if (currentLerpTime > lerpTime) {
        currentLerpTime = lerpTime;
    }

    //lerp!
    float perc = currentLerpTime / lerpTime;
    GetComponent<Renderer>().material.color = Color.Lerp(startColor, endColor, perc);
}

}

Teleport脚本中的SetGazedAt方法

public void SetGazedAt(bool gazedAt) { 


    GetComponent<Renderer>().material.color = gazedAt ? Color.clear : Color.red;


}

3 个答案:

答案 0 :(得分:2)

我在@piojo的帮助下想出来了。我使用Coroutines来处理lerping更新并删除了填充脚本。我现在只是在我的大型传送脚本中调用FillObject函数。

public void SetGazedAt(bool gazedAt) { 
        if (gazedAt == true) {
            aniTrigger = true;
            startColor = Color.clear;
            endColor = new Color(0.0f,0.0f,1.0f,0.8f);
            StartCoroutine(FillObject (startColor,endColor, 3 ));
            //GetComponent<Renderer>().material.color = Color.blue;
        } else {
            GetComponent<Renderer>().material.color = Color.clear;
        }


    }

和lerp函数的这个

IEnumerator FillObject(Color startColor, Color endColor, float overTime)
    {
        float startTime = Time.time;
        while(Time.time < startTime + overTime)
        {
            //transform.position = Vector3.Lerp(source, target, (Time.time - startTime)/overTime);
            GetComponent<Renderer>().material.color = Color.Lerp(startColor, endColor, (Time.time - startTime)/overTime);
            yield return null;
        }
        GetComponent<Renderer> ().material.color = endColor;
        var x = this.gameObject.name;
        TeleportNow (x);

    }

答案 1 :(得分:0)

将bool gazedAt设置为static并在fill类中使用它,方法是指定你在其中声明gazedAt的类if(classNAME.gazedAt == true){lerp code goes here}; 。还要确保填充脚本附加到场景中的gameobject。

答案 2 :(得分:0)

我认为你实际上并不需要Fill类,但你只想修改SetGazedAt来取一个百分比或一个时间,而不是一个bool(插值代替颜色/关)。

由于lerp并不复杂,我建议你输掉另一堂课。您需要开始/结束/当前时间,并且您需要开始和结束值。 lerp函数将开始/结束颜色作为第一个参数,将百分比(作为[0,1]范围中的分数)作为第三个参数。分数为(current-start)/(end-start)(当变化完成一半时为0.5,或者颜色A为50%,颜色为50%。)

所以SetGazedAt可以非常简单:

GetComponent<Renderer>().material.color = Color.Lerp(Color.clear, Color.red, fraction);

当然,您需要作为参数传递的计时信息,因此您可以计算分数。另请注意,该分数被钳制到[0,1],因此您无需担心超出范围。