Пример #1
0
        IEnumerator Start()
        {
            GLTFSceneImporter sceneImporter = null;
            ILoader           loader        = null;

            if (UseStream)
            {
                // Path.Combine treats paths that start with the separator character
                // as absolute paths, ignoring the first path passed in. This removes
                // that character to properly handle a filename written with it.
                GLTFUri = GLTFUri.TrimStart(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
                string fullPath      = Path.Combine(Application.streamingAssetsPath, GLTFUri);
                string directoryPath = URIHelper.GetDirectoryName(fullPath);
                loader        = new FileLoader(directoryPath);
                sceneImporter = new GLTFSceneImporter(
                    Path.GetFileName(GLTFUri),
                    loader
                    );
            }
            else
            {
                string directoryPath = URIHelper.GetDirectoryName(GLTFUri);
                loader        = new WebRequestLoader(directoryPath);
                sceneImporter = new GLTFSceneImporter(
                    URIHelper.GetFileFromUri(new Uri(GLTFUri)),
                    loader
                    );
            }

            sceneImporter.SceneParent = gameObject.transform;
            sceneImporter.Collider    = Colliders;
            sceneImporter.MaximumLod  = MaximumLod;
            yield return(sceneImporter.LoadScene(-1, Multithreaded));
        }
Пример #2
0
        public IEnumerator Load()
        {
            GLTFSceneImporter sceneImporter = null;
            ILoader           loader        = null;

            try
            {
                if (UseStream)
                {
                    // Path.Combine treats paths that start with the separator character
                    // as absolute paths, ignoring the first path passed in. This removes
                    // that character to properly handle a filename written with it.
                    GLTFUri = GLTFUri.TrimStart(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
                    string fullPath      = Path.Combine(Application.streamingAssetsPath, GLTFUri);
                    string directoryPath = URIHelper.GetDirectoryName(fullPath);
                    loader        = new FileLoader(directoryPath);
                    sceneImporter = new GLTFSceneImporter(
                        Path.GetFileName(GLTFUri),
                        loader
                        );
                }
                else
                {
                    string directoryPath = URIHelper.GetDirectoryName(GLTFUri);
                    loader        = new WebRequestLoader(directoryPath);
                    sceneImporter = new GLTFSceneImporter(
                        URIHelper.GetFileFromUri(new Uri(GLTFUri)),
                        loader
                        );
                }

                sceneImporter.SceneParent      = gameObject.transform;
                sceneImporter.Collider         = Collider;
                sceneImporter.MaximumLod       = MaximumLod;
                sceneImporter.Timeout          = Timeout;
                sceneImporter.isMultithreaded  = Multithreaded;
                sceneImporter.CustomShaderName = shaderOverride ? shaderOverride.name : null;
                yield return(sceneImporter.LoadScene(-1));

                // Override the shaders on all materials if a shader is provided
                if (shaderOverride != null)
                {
                    Renderer[] renderers = gameObject.GetComponentsInChildren <Renderer>();
                    foreach (Renderer renderer in renderers)
                    {
                        renderer.sharedMaterial.shader = shaderOverride;
                    }
                }
            }
            finally
            {
                if (loader != null)
                {
                    sceneImporter.Dispose();
                    sceneImporter = null;
                    loader        = null;
                }
            }
        }
Пример #3
0
        public IEnumerator Load()
        {
            GLTFSceneImporter sceneImporter = null;
            ILoader           loader        = null;

            try
            {
                string directoryPath = URIHelper.GetDirectoryName(GLTFUri);
                loader        = new WebRequestLoader(directoryPath);
                sceneImporter = new GLTFSceneImporter(
                    URIHelper.GetFileFromUri(new Uri(GLTFUri)),
                    loader
                    );

                sceneImporter.SceneParent      = gameObject.transform;
                sceneImporter.Collider         = Collider;
                sceneImporter.MaximumLod       = MaximumLod;
                sceneImporter.Timeout          = Timeout;
                sceneImporter.isMultithreaded  = Multithreaded;
                sceneImporter.CustomShaderName = shaderOverride ? shaderOverride.name : null;
                yield return(sceneImporter.LoadScene(-1));

                // Override the shaders on all materials if a shader is provided
                if (shaderOverride != null)
                {
                    Renderer[] renderers = gameObject.GetComponentsInChildren <Renderer>();
                    foreach (Renderer renderer in renderers)
                    {
                        renderer.sharedMaterial.shader = shaderOverride;
                    }
                }

                if (gameObject.GetComponentInChildren <Animation>() != null)
                {
                    anim = gameObject.GetComponentInChildren <Animation>();
                }
                if (anim != null)
                {
                    anim.Play();
                }
            }
            finally
            {
                if (loader != null)
                {
                    sceneImporter.Dispose();
                    sceneImporter = null;
                    loader        = null;
                }
            }
        }
Пример #4
0
        public async Task Load()
        {
            asyncCoroutineHelper = gameObject.GetComponent <AsyncCoroutineHelper>() ?? gameObject.AddComponent <AsyncCoroutineHelper>();
            GLTFSceneImporter sceneImporter = null;
            ILoader           loader        = null;

            try
            {
                if (UseStream)
                {
                    // Path.Combine treats paths that start with the separator character
                    // as absolute paths, ignoring the first path passed in. This removes
                    // that character to properly handle a filename written with it.
                    GLTFUri = GLTFUri.TrimStart(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
                    string fullPath;
                    if (AppendStreamingAssets)
                    {
                        fullPath = Path.Combine(Application.streamingAssetsPath, GLTFUri);
                    }
                    else
                    {
                        fullPath = GLTFUri;
                    }
                    string directoryPath = URIHelper.GetDirectoryName(fullPath);
                    loader        = new FileLoader(directoryPath);
                    sceneImporter = new GLTFSceneImporter(
                        Path.GetFileName(GLTFUri),
                        loader,
                        asyncCoroutineHelper
                        );
                }
                else
                {
                    string directoryPath = URIHelper.GetDirectoryName(GLTFUri);
                    loader = new WebRequestLoader(directoryPath);

                    sceneImporter = new GLTFSceneImporter(
                        URIHelper.GetFileFromUri(new Uri(GLTFUri)),
                        loader,
                        asyncCoroutineHelper
                        );
                }

                sceneImporter.SceneParent      = gameObject.transform;
                sceneImporter.Collider         = Collider;
                sceneImporter.MaximumLod       = MaximumLod;
                sceneImporter.Timeout          = Timeout;
                sceneImporter.isMultithreaded  = Multithreaded;
                sceneImporter.CustomShaderName = shaderOverride ? shaderOverride.name : null;

                if (MaterialsOnly)
                {
                    var mat = await sceneImporter.LoadMaterialAsync(0);

                    var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    cube.transform.SetParent(gameObject.transform);
                    var renderer = cube.GetComponent <Renderer>();
                    renderer.sharedMaterial = mat;
                }
                else
                {
                    await sceneImporter.LoadSceneAsync();
                }

                // Override the shaders on all materials if a shader is provided
                if (shaderOverride != null)
                {
                    Renderer[] renderers = gameObject.GetComponentsInChildren <Renderer>();
                    foreach (Renderer renderer in renderers)
                    {
                        renderer.sharedMaterial.shader = shaderOverride;
                    }
                }

                if (PlayAnimationOnLoad)
                {
                    Animation[] animations = sceneImporter.LastLoadedScene.GetComponents <Animation>();
                    foreach (Animation anim in animations)
                    {
                        anim.Play();
                    }
                }
            }
            finally
            {
                if (loader != null)
                {
                    sceneImporter?.Dispose();
                    sceneImporter = null;
                    loader        = null;
                }
            }
        }
Пример #5
0
        public async Task Load()
        {
            var importOptions = new ImportOptions
            {
                AsyncCoroutineHelper = gameObject.GetComponent <AsyncCoroutineHelper>() ?? gameObject.AddComponent <AsyncCoroutineHelper>()
            };

            GLTFSceneImporter sceneImporter = null;

            try
            {
                Factory = Factory ?? ScriptableObject.CreateInstance <DefaultImporterFactory>();

                if (UseStream)
                {
                    string fullPath;
                    if (AppendStreamingAssets)
                    {
                        // Path.Combine treats paths that start with the separator character
                        // as absolute paths, ignoring the first path passed in. This removes
                        // that character to properly handle a filename written with it.
                        fullPath = Path.Combine(Application.streamingAssetsPath, GLTFUri.TrimStart(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }));
                    }
                    else
                    {
                        fullPath = GLTFUri;
                    }
                    string directoryPath = URIHelper.GetDirectoryName(fullPath);
                    importOptions.DataLoader = new FileLoader(directoryPath);
                    sceneImporter            = Factory.CreateSceneImporter(
                        Path.GetFileName(GLTFUri),
                        importOptions
                        );
                }
                else
                {
                    string directoryPath = URIHelper.GetDirectoryName(GLTFUri);
                    importOptions.DataLoader = new WebRequestLoader(directoryPath);

                    sceneImporter = Factory.CreateSceneImporter(
                        URIHelper.GetFileFromUri(new Uri(GLTFUri)),
                        importOptions
                        );
                }

                sceneImporter.SceneParent      = gameObject.transform;
                sceneImporter.Collider         = Collider;
                sceneImporter.MaximumLod       = MaximumLod;
                sceneImporter.Timeout          = Timeout;
                sceneImporter.IsMultithreaded  = Multithreaded;
                sceneImporter.CustomShaderName = shaderOverride ? shaderOverride.name : null;

                if (MaterialsOnly)
                {
                    var mat = await sceneImporter.LoadMaterialAsync(0);

                    var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    cube.transform.SetParent(gameObject.transform);
                    var renderer = cube.GetComponent <Renderer>();
                    renderer.sharedMaterial = mat;
                }
                else
                {
                    await sceneImporter.LoadSceneAsync();
                }

                // Override the shaders on all materials if a shader is provided
                if (shaderOverride != null)
                {
                    Renderer[] renderers = gameObject.GetComponentsInChildren <Renderer>();
                    foreach (Renderer renderer in renderers)
                    {
                        renderer.sharedMaterial.shader = shaderOverride;
                    }
                }

                print("model loaded with vertices: " + sceneImporter.Statistics.VertexCount.ToString() + ", triangles: " + sceneImporter.Statistics.TriangleCount.ToString());
                LastLoadedScene = sceneImporter.LastLoadedScene;

                Animations = sceneImporter.LastLoadedScene.GetComponents <Animation>();

                if (PlayAnimationOnLoad && Animations.Any())
                {
                    Animations.FirstOrDefault().Play();
                }
            }
            finally
            {
                if (importOptions.DataLoader != null)
                {
                    sceneImporter?.Dispose();
                    sceneImporter            = null;
                    importOptions.DataLoader = null;
                }

                if (onLoadFinished != null)
                {
                    onLoadFinished.Invoke(this);
                }

                if (loadingIndicaor)
                {
                    loadingIndicaor.SetActive(false);
                }
            }
        }