1

このコードは、連続ループでゲーム オブジェクトを移動するのに役立ちます。ランダムに生成されたキューブも同じパターンに従うようにします。1ラウンドが終わったらゲームオブジェクトの生成を止める条件をつけていませんでした。現在、生成されたゲーム オブジェクトは動きません。

究極のアイデアは、スプラッシュ シーンを生成することです。次の方法もgpu効率的かどうか知りたいです!

using UnityEngine;
using System.Collections.Generic;

public class IntegratedScrpt : MonoBehaviour
{
    public List<GameObject> splashImagesGOList;

    public float InvokeRate = 10f;
    public GameObject cube01;

    private int selection;

    // Loop mode variables
    private Vector3 startPosition;
    private Vector3 endPosition;
    private float distance = 54f;
    private float distanceCovered;
    private float currentDistance;

    //for Vector Lerp
    private float currentLerpTime = 0f;
    private float lerpTime = 9f;
    private float t;


    void Start()
    {
        startPosition = splashImagesGOList[1].transform.position;
        Debug.LogError("selection VALUE AT" + selection);

        endPosition = Vector3.back * distance;
    }

    void Update()
    {
        InvokeRepeating("pickpoints", 1.0f, InvokeRate);

        //loop mode
        distanceCovered = Vector3.Distance(startPosition, endPosition);
        currentDistance = distanceCovered * t;

        currentLerpTime += Time.deltaTime;
        if (currentLerpTime == lerpTime)
        {
            currentLerpTime = lerpTime;
        }
        if (currentLerpTime > lerpTime)
        {
            currentLerpTime = 0f;
        }
        t = currentLerpTime / lerpTime;

        Move();

        if (currentDistance == 64)
        {
            splashImagesGOList[selection].transform.position = startPosition;

            Move();
        }

        Debug.LogError("SELECTION" + selection);

    }

    // method for making the gameobjects move
    public void Move() 
    {
        splashImagesGOList[selection].transform.position = Vector3.Lerp(startPosition, endPosition, t);
    }

    // code for instantiating the gameobjects
    void pickpoints()  
    {
        foreach (GameObject cube01 in splashImagesGOList)
        {
            int selection = UnityEngine.Random.Range(0, splashImagesGOList.Count);
            // Instantiate(splashImagesGOList[selection], cube01.transform.position, cube01.transform.rotation);
            Instantiate(splashImagesGOList[selection], startPosition, cube01.transform.rotation);

        }
    }
}
4

1 に答える 1

0

インスタンス化されたゲームオブジェクトが動かない理由は、それらの位置に割り当てていないからです! プレハブsplashImagesGOList[selection].transform.positionの 1 つの位置です。現在のコードでは、オブジェクトをインスタンス化し、インスタンス化されたオブジェクトと対話することはありません。

移動ロジックを別のスクリプトに分離し、そのスクリプトをリスト内の各プレハブにアタッチすることで、各オブジェクトが独自の移動を処理するようにする必要があります。Mathf.Repeat現在のコードが行うことを意味していると思われる種類のループを行うために使用できます。

さて、繰り返される同時ランダムインスタンス化でどのようなパターンを達成しようとしているのかは明確ではありませんが、それにもかかわらず、InvokeRepeatingおそらくUpdate. PickPointsさらに、 で繰り返される呼び出しを停止するには、何らかの終了条件が必要CancelInvoke("PickPoints");です。ますます多くのオブジェクトを作成することは GPU 効率的ではありません;)

全体として、これらの変更は次のようになります。

public class SpashImageMover : MonoBehaviour
{
    public Vector3 startPosition;
    public Vector3 endPosition;
    public float3 lerpTime;

    private float t = 0; // in case code in Start is removed

    void Start()
    {
        // remove these two lines if you don't want the objects synchronized
        t = Mathf.Repeat(Time.time/lerpTime, 1f);
        transform.position = Vector3.Lerp(startPosition, endPosition, t);
    }

    void Update()
    {
        t = Mathf.Repeat(t + Time.deltaTime / lerpTime, 1f);

        transform.position = Vector3.Lerp(startPosition, endPosition, t);
    }
}

public class IntegratedScrpt : MonoBehaviour
{
    public List<GameObject> splashImagesGOList;

    public float InvokeRate = 10f;

    private int selection;

    // Loop mode variables
    private Vector3 startPosition;
    private Vector3 endPosition;

    //for Vector Lerp
    private float lerpTime = 9f;

    // end condition for PickPoints
    private bool invokingPickPoints;
    private float pickPointsTimeRemaining = 27f;


    void Start()
    {
        startPosition = splashImagesGOList[1].transform.position;
        Debug.LogError("selection VALUE AT" + selection);

        endPosition = Vector3.back * distance;

        InvokeRepeating("PickPoints", 1.0f, InvokeRate);
        invokingPickPoints = true;
    }

    void Update()
    {
        if (invokingPickPoints) 
        {
            pickPointsTimeRemaining -= Time.deltaTime;
            if (pickPointsTimeRemaining <= 0 ) 
            {
                CancelInvoke("PickPoints");
                invokingPickPoints = false;
            }
        }
    }

    // code for instantiating the gameobjects
    void PickPoints()  
    {
        foreach (GameObject cube01 in splashImagesGOList)
        {
            int selection = UnityEngine.Random.Range(0, splashImagesGOList.Count);
            // Instantiate(splashImagesGOList[selection], cube01.transform.position, cube01.transform.rotation);
            GameObject newGO = Instantiate(splashImagesGOList[selection], startPosition, cube01.transform.rotation);

            SpashImageMover mover = newGO.GetComponent<SpashImageMover>();
            mover.startPosition = startPosition;
            mover.endPosition = endPosition;
            mover.lerpTime = lerpTime;
        }
    }
}

補足として、オブジェクトをインスタンス化する方法が気に入らない場合は、達成しようとしていることの非常に説明的な説明を含む別の質問に適しています。ここでそれに対処しようとするのは、あまりにも広い質問です。

于 2019-09-06T14:30:42.667 に答える