【问题标题】:Lerping Color using Event Trigger SetGazedAt in Unity在 Unity 中使用事件触发器 SetGazedAt 处理颜色
【发布时间】:2015-08-12 04:58:14
【问题描述】:

我正在使用 cardboard sdk,并且在使用用于 Unity 的 cardboard sdk 时,我试图调整对象的颜色。我正在使用下面的 lerping 脚本,当我将它附加到对象时,它的功能独立于凝视,但是当我尝试使它的一个版本在 SetGazedAt 内工作时它不起作用。

以下是用于更改对象颜色的 SetGazedAt 代码。我将如何替换它或调用我拥有的 Lerp 脚本,我将其命名为填充?

填充.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;


}

【问题讨论】:

    标签: c# unity3d google-cardboard lerp


    【解决方案1】:

    在@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);
    
        }
    

    【讨论】:

      【解决方案2】:

      将 bool GazedAt 设置为静态并在填充类中使用它,方法是指定您在其中声明 GazedAt 的类,如下所示 if(classNAME.gazedAt == true){lerp code goes here}; .还要确保填充脚本附加到场景中的游戏对象。

      【讨论】:

        【解决方案3】:

        我推测您实际上并不需要 Fill 类,但您只想修改 SetGazedAt 以获取百分比或时间,而不是布尔值(插值而不是颜色开/关)。

        既然 lerp 没那么复杂,我建议你丢掉其他类。您需要开始/结束/当前时间,并且需要开始和结束值。 lerp 函数将开始/结束颜色作为第一个参数,百分比(作为[0,1] 范围内的分数)作为第三个参数。分数是(current-start)/(end-start)(当更改完成一半时,这是 0.5,或 50% 颜色 A,50% 颜色 B。)

        所以SetGazedAt可以很简单:

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

        当然,你需要时间信息作为参数传入,这样你就可以计算分数了。另请注意,分数被限制为[0,1],因此您无需担心超出范围。

        【讨论】:

        • 我必须保留布尔值,但我将其更改为一个有效的 if else 循环。但是我如何倒计时这个函数内部的 Lerp 呢?在我的填充脚本中,我有一个更新函数来处理时间。
        • 我正在使用 float perc = currentLerpTime / lerpTime; GetComponent().material.color = Color.Lerp(startColor, endColor, perc);
        • @user808996 感谢您对参数的更正。至于时间,你是不是只调用了一次这个函数,然后你想让颜色动画片刻?这通常称为tween,并且有很多库可以帮助解决这个问题。但是要自己做,你需要启动一个协程,它的作用类似于更新函数。协程是一个很大的话题,太窄了,无法容纳。
        • @user808996 如果您打算多次调用它(可能来自另一个类的Update 函数),则调用者或Teleport 类都需要跟踪时间。没有性感的技术(不等同于 c++ 函数-static 变量),您只需将值存储在类中。哦,您可能知道这一点,但获取当前时间(以秒为单位)的字段是 Time.time
        • 感谢您的帮助。我发布了最终有效的答案。
        猜你喜欢
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多