是我的协同脚本&产卵脚本一起杀死我的游戏?

时间:2018-03-12 15:10:39

标签: c# unity3d

我很好奇,如果这两个脚本中有任何突出的东西可能导致我丢帧并导致瞬间滞后。第一个脚本用于实例化附加了第二个脚本的游戏对象(第二个脚本生成自己的克隆)。在这些游戏对象开始产生之前,我丢帧并滞后 - 当我正在为HTC Vive构建游戏时,我在HMD中得到一个蓝色的装载盒。

提前谢谢。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class publicarray : MonoBehaviour
{

public GameObject[] ThingToKill;
public float startAfterThisManySeconds;
public float endafterThisManySeconds;

void Start()
{       
   for (int i = 0; i < ThingToKill.Length; i++)
    {
        Debug.Log(ThingToKill[i].name);
        ThingToKill[i].SetActive(false);
        StartCoroutine("turnOn");
        StartCoroutine("turnOff");
    }
}

IEnumerator turnOn()
{
    yield return new WaitForSeconds(startAfterThisManySeconds);
    StartCoroutine("on");
    Debug.Log("on");
}

IEnumerator turnOff()
{
    yield return new WaitForSeconds(endafterThisManySeconds + startAfterThisManySeconds);
    StartCoroutine("off");
    Debug.Log("off");
}

IEnumerator on()
{
    for (int i = 0; i < ThingToKill.Length; i++)
    {
        ThingToKill[i].SetActive(true);
        yield return new WaitForSeconds(0f);
    }
}

IEnumerator off()
{
    for (int i = 0; i < ThingToKill.Length; i++)
    {
        ThingToKill[i].SetActive(false);
        yield return new WaitForSeconds(0f);
    }
}
}

Seconds脚本(产生)(使用正确的脚本编辑!)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TimedSpawn : MonoBehaviour {

public GameObject spawnee;
public bool stopSpawning = false;
public float spawnTime;
public float spawnDelay;
public float height;
public float x1;
public float x2;
public float z1;
public float z2;
float timer = 0f;
public float amountoftimetospawn;
// Use this for initialization
void Start () {
    InvokeRepeating("SpawnObject", spawnTime, spawnDelay);
}

public void SpawnObject() {
    timer += Time.deltaTime;
    //Instantiate(spawnee, transform.position, transform.rotation);
    Instantiate(spawnee, (new Vector3((Random.Range(x1, x2)), height, 
   (Random.Range(z1, z2)))), spawnee.transform.rotation);
    if (timer > amountoftimetospawn) {
        CancelInvoke("SpawnObject");
      }
   }
}

销毁我的游戏对象的第三个脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnGameObjects : MonoBehaviour
{    
public float killtime;

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.tag == "table")
    {            
        Destroy(gameObject, killtime);
        if (collision.gameObject.tag == "floor")
        {              
            Destroy(gameObject, killtime);
        }
     }
  }
}

1 个答案:

答案 0 :(得分:0)

是的,他们因为非常小的原因而从你的游戏中汲取了很多表现。

您正在多次迭代所有游戏对象,以激活和取消激活它们。你也不是说“实例化”它们,至少不是动态的,似乎你已经将所有游戏对象放在你的场景中并将它们全部手动放置在Inspector中可用的Gameobject阵列中。这不是很好,你失去了所有可扩展性,而且非常繁琐。

另外,你的产卵脚本实际上与任何产卵无关,它所做的一切实际上是破坏,这与产卵相反,但无论如何..

我认为拥有产卵者的道路是一个好主意。您发布的很多内容都应该废弃IMO,以获得更优化和灵活的解决方案,其中大部分都可以非常轻松地实现,您可以在Official Unity Tutorials中实际浏览大量这些实现。

我真的建议通过他们中的一些,或者至少查看他们提供的所有类型的章节,通常你会得到很好的实践和相关的经验。

IMO,您应该引用您希望在游戏中实例化的所有游戏对象,对它们进行分类(如果适用于您的情况)并使用产生系统,以便在需要它们的时间/地点正确地实例化它们。

此外,如果你有具体的实体(例如:子弹,暴徒等......),那真的会更好。

例如,这些可以说是一个名为IMortal的接口,以便您的实体可以访问void DieAnim() { Destroy(gameObject, deathTime) }。这将减轻你的“产卵”脚本的负担,不管理破坏,每个实体都有能力处理它自己的死亡。你的产卵者行为最多只能是触发器。