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是其中一个预制件的位置。在您当前的代码中,您实例化对象,然后从不与实例化对象交互。

您应该通过将移动逻辑分离到不同的脚本并将脚本附加到列表中的每个预制件来让每个对象处理自己的移动。您可以使用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 回答