C# 在Unity中使用事件触发器SetGazedAt进行着色

C# 在Unity中使用事件触发器SetGazedAt进行着色,c#,unity3d,google-cardboard,lerp,C#,Unity3d,Google Cardboard,Lerp,我正在使用CardwardSDK,并且我正在尝试在使用CardwardSDK for Unity查看对象时调整对象的颜色。我正在使用下面的lerping脚本,当我将它附加到对象时,它的功能独立于凝视,但当我试图使它的一个版本在SetGazedAt中工作时,它不起作用 下面是更改对象颜色的SetGazedAt代码。我将如何替换此脚本或调用我拥有的名为fill的Lerp脚本 Fill.cs using UnityEngine; using System.Collections; public cl

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

下面是更改对象颜色的SetGazedAt代码。我将如何替换此脚本或调用我拥有的名为fill的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);
}
使用UnityEngine;
使用系统集合;
公共类填充:单一行为{
浮动时间=2f;
浮动时间;
//浮动距离=5f;
Color startColor=Color.clear;
Color endColor=Color.clear;
公开作废开始(){
startColor=Color.clear;
//endColor=新颜色(0.0f、0.0f、1.0f、0.5f);
}
公共无效更新(){
//按空格键时重置
if(Input.GetKeyDown(KeyCode.Space)){
CurrentLerOptime=0f;
startColor=Color.clear;
endColor=新颜色(0.0f、0.0f、1.0f、0.5f);
}
//每帧递增一次计时器
currentLerpTime+=Time.deltaTime;
如果(currentLerpTime>lerpTime){
currentLerpTime=lerpTime;
}
//勒普!
float perc=currentLerpTime/lerpTime;
GetComponent().material.color=color.Lerp(startColor、endColor、perc);
}
}

传送脚本中的SetGazedAt方法

public void SetGazedAt(bool gazedAt) { 


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


}
public void SetGazedAt(bool gazedAt){
GetComponent().material.color=gazedAt?color.clear:color.red;
}

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

我推测您实际上不需要
fill
类,但您只想修改
SetGazedAt
以使用百分比或时间,而不是bool(插值而不是颜色开/关)

既然lerp没那么复杂,我建议你丢掉另一门课。您需要开始/结束/当前时间,以及开始和结束值。lerp函数将开始/结束颜色作为第一个参数,百分比(作为
[0,1]
范围内的分数)作为第三个参数。分数为
(当前开始)/(结束开始)
(更改完成一半时为0.5,或50%颜色A、50%颜色B。)

因此,
SetGazedAt
可以非常简单:

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

当然,您需要将计时信息作为参数传入,以便计算分数。另外请注意,分数被钳制为
[0,1]
,因此您不必担心越界。

我在@piojo的帮助下解决了这个问题。我使用协同程序来处理lerping更新,并删除了fill脚本。我现在只是在我更大的传送脚本中调用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;
        }


    }
public void SetGazedAt(bool gazedAt){
如果(gazedAt==true){
aniTrigger=true;
startColor=Color.clear;
endColor=新颜色(0.0f、0.0f、1.0f、0.8f);
Start例程(FillObject(startColor,endColor,3));
//GetComponent().material.color=color.blue;
}否则{
GetComponent().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);

    }
IEnumerator填充对象(颜色开始颜色、颜色结束颜色、浮点超时)
{
浮动开始时间=Time.Time;
while(Time.Time
我不得不保留bool,但我将其改为if-else循环,该循环有效。但是我如何在这个函数中倒计时Lerp呢?在我的fill脚本中,我有一个负责时间的更新函数;GetComponent().material.color=color.Lerp(startColor、endColor、perc)@user808996感谢您对参数的更正。就时间而言,您是否只调用了一次此函数,并且希望颜色在之后动画化一段时间?这通常被称为
tween
,有很多库可以帮助实现这一点。但是要自己做,您需要启动一个协同程序,它的作用类似于update函数。协同路由是一个很大的主题,太窄了,无法包含。@user808996并且如果您打算多次调用它(可能是从另一个类的
Update
函数调用),则调用方或
Teleport
类都需要跟踪时间。没有性感的技术(不等同于C++函数-<代码>静态< /COD>变量),只需要在类中存储值。哦,您可能知道这一点,但是获取当前时间(以秒为单位)的字段是
time.time
。谢谢您的帮助。我发布了最终有效的答案。