2

私は cardboard sdk を使用しており、Unity 用の cardboard sdk を使用してオブジェクトを見つめたときに、オブジェクトの色を lerp しようとしています。以下の 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);
}

}

Teleport スクリプトの SetGazedAt メソッド

public void SetGazedAt(bool gazedAt) { 


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


}
4

3 に答える 3

2

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


    }

そして、これは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);

    }
于 2015-08-13T20:44:42.137 に答える
0

このクラスは実際には必要ないと思いますが、bool (色のオン/オフの代わりに補間) ではなく、パーセントまたは時間を取得するFillように変更したいだけです。SetGazedAt

lerp はそれほど複雑ではないので、他のクラスを失うことをお勧めします。開始/終了/現在の時刻が必要で、開始値と終了値が必要です。lerp 関数は、開始色と終了色を最初のパラメーターとして受け取り、パーセント ([0,1]範囲内の分数として) を 3 番目のパラメーターとして受け取ります。分数は(current-start)/(end-start)(変更が半分完了した場合は0.5、またはA色50%、B色50%)

とてもSetGazedAt簡単です:

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

もちろん、分数を計算できるように、タイミング情報をパラメーターとして渡す必要があります。また、分数は にクランプされる[0,1]ため、範囲外になることを心配する必要はありません。

于 2015-08-12T08:21:47.410 に答える
0

bool GazedAt を静的に設定し、次のように GasedAt を宣言したクラスを指定することにより、フィル クラスで使用します。. また、塗りつぶしスクリプトがシーン内のゲームオブジェクトにアタッチされていることを確認してください。

于 2015-08-12T07:51:09.650 に答える