代码之家  ›  专栏  ›  技术社区  ›  Md Monjur Ul Hasan

在Unity C中动态呈现游戏对象#

  •  0
  • Md Monjur Ul Hasan  · 技术社区  · 6 年前

    我正在开发一个AR项目,在这个项目中,虚拟对象将根据文本文件中的信息显示/隐藏在场景中。文本文件将从外部服务更新。所以我需要频繁地读取文件并更新场景。因此,我只有相机对象,我正在渲染场景 OnPreCull() 方法。

    文本文件包含许多对象,但并非所有对象在任何时间都在场景中。我在寻找一种只渲染场景中那些对象的方法。

    将创建和放置游戏对象 初始化() 方法板条箱是否存在性能问题?

    2 回复  |  直到 6 年前
        1
  •  1
  •   derHugo    6 年前

    在onPreCull()方法中创建和放置游戏对象是否会带来性能问题?

    是的,当然……如果你在 Update 或任何其他重复调用的方法。

    相反,您应该在 Awake 只激活或停用它们。

    假设你有3个物体 A , B C 比我做一个控制器类

    public class ObjectsController : MonoBehaviour
    {
        // Define in which intervals the file should be read/ the scene should be updated
        public float updateInterval;
    
        // Prefabs or simply objects that are already in the Scene
        public GameObject A;
        public GameObject B;
        public GameObject C;
        /* Etc ... */
    
        // Here you map the names from your textile to according object in the scene
        private Dictionary<string, GameObject> gameObjects = new Dictionary<string, gameObjects>();
    
        private void Awake ()
        {
            // if you use Prefabs than instantiate your objects here; otherwise you can skip this step
            var a = Instantiate(A);
            /* Etc... */
    
            // Fill the dictionary
            gameObjects.Add(nameOfAInFile, a);
    
            // OR if you use already instantiated references instead
            gameObjects.Add(nameOfAInFile, A);
        }
    }
    
    private void Start()
    {
        // Start the file reader
        StartCoroutine (ReadFileRepeatedly());
    }
    
    // Read file in intervals
    private IEnumerator ReadFileRepeatedly ()
    {
        while(true)
        {
            //ToDo Here read the file
    
            //Maybe even asynchronous?
            // while(!xy.done) yield return null;
    
            // Now it depends how your textile works but you can run through 
            // the dictionary and decide for each object if you want to show or hide it
            foreach(var kvp in gameObjects)
            {
                bool active = someConditionDependingOnTheFile;
    
                kvp.value.SetActive(active);
    
                // And e.g. position it only if active
                if (active)
                {
                    kvp.value.transform.position = positionFromFile;
                }
            }
    
            // Wait for updateInterval and repeat
            yield return new WaitForSeconds (updateInterval);
        }
    }
    

    如果你有同一个预制件的多个实例,你也应该看看 Object Pooling

        2
  •  0
  •   Monza    6 年前

    我建议将每个游戏对象添加到注册表中,并通过注册表类的update()循环打开或关闭它们(d i s/enable setactive)。

    一个update()进程用于检索和处理服务器文件,另一个update()进程用于禁用/启用对象。可能听起来过于简单化了,但这是我认为获得结果的最快方式。

    祝你好运!