2

まず何をしようとしているのかを説明します。

マテリアルが添付されたオブジェクトがあります。カメラから投影された光線があり、それがオブジェクトと衝突したときに、そのオブジェクトのマテリアルを別の 2 番目のオブジェクトに配置したいと考えています。これは私が取り組んでいるものです。

現在、マテリアルがオブジェクト 1 から離陸してオブジェクト 2 に配置される前に、ユーザーがオブジェクト上に光線を長時間保持することで、これを拡張しようとしています。いくつかの問題があります。

タイマーが割り当てられた時間に近づくと、光線が当たるのをやめたように見え、ハイライト (光線がオブジェクトに触れたときに表示される) が消えます。次に、オブジェクトから目をそらして振り返ると、時間をリセットする代わりに、マテリアルがすぐに別のオブジェクトに表示されます。そのため、タイマーを適切にリセットしていない可能性があります。

実際、これはタイマーに関係していると確信しています。レイが何もヒットしていない場合でも、マテリアル変更イベントがトリガーされるようです。

誰かが私のコードを見て教えてくれませんか?

光線が当たったオブジェクトをチェックし、そのマテリアルを正しいオブジェクトにキャストするメソッド

void CastRay()
{
    if(hit.collider.gameObject.tag == "Colour1" && change_material == true)
    {
        new_colour1.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color);

        var colums = GameObject.FindGameObjectsWithTag("column");
        foreach( GameObject c in colums)
        c.GetComponent<MeshRenderer>().materials[1].color = new_colour1.orignalMaterial;
    }
}

 void ResetTimer()
{
  start_time = Time.time;
  running_time = 0f;
  track_timer = false;

}

光線が当たったオブジェクトをハイライトするコード:

void HighLight(GameObject nextHitObject)
{   
    // Case1: Last ray and new ray both hit objects
    if(lastHitObject != null && nextHitObject != null)
    {

        //1a: same objects, do nothing
        if(lastHitObject.tag == nextHitObject.tag)return;   
        {   //1b: different objects, swap highlight texture
            lastHitObject.renderer.material = oldMat;
            lastHitObject = nextHitObject;
            oldMat = lastHitObject.renderer.material;
            lastHitObject.renderer.material = highlight_material;
            track_timer = true;
            return;
        }
    }

    // Case2: Last ray hit nothing, new ray hit object.
    if(lastHitObject == null && nextHitObject != null)
    {
        ResetTimer();
        lastHitObject = nextHitObject;
        oldMat = lastHitObject.renderer.material;
        lastHitObject.renderer.material = highlight_material;
        track_timer = true;


        if(spawned_amount == 0)
        {
            StatusBar();
        }
        return;
    }

    // Case3: Last ray hit something, new ray hit nothing
    if(lastHitObject != null && nextHitObject == null)
    {
        lastHitObject.renderer.material = oldMat;
        lastHitObject = null;
        track_timer = false;
        return;
    }

    else
    {
        spawned_amount = 0;
        Destroy (GameObject.FindWithTag("StatusBar"));
        change_material = false;
    }

}

タイマーコード

void Check(bool updateTimer)
{
    if(updateTimer)
    {
        start_time = Time.time - end_time;
        running_time += Time.deltaTime;
        if ( running_time >= end_time )
        {
            track_timer = false;
        }
    }   
    else
        end_time = Time.time;
}

start_time が 4 秒を超えたら、変更マテリアル bool を true に設定する必要がある最後のメソッド。

void StatusBar()
{

    if(start_time >= 4)
    {

        spawned_amount = 0;
        Debug.Log("status bar function");
        change_material = true;

        Debug.Log("chaging amterial");
    }
    else
    {
        change_material = false;
        ResetTimer();
        Debug.Log("resetting timer");
    }

}
4

1 に答える 1