使用 Unity 在游戏期间随时加载 .fbx 对象

Posted

技术标签:

【中文标题】使用 Unity 在游戏期间随时加载 .fbx 对象【英文标题】:Load an .fbx object any time during the game with Unity 【发布时间】:2013-11-11 05:39:01 【问题描述】:

我想用 Unity 用 C# 制作一个类似 Minecraft 的游戏,具有正常的物理特性(例如,当你推动冰块时,冰块会滑到地板上)。

现在我正试图在玻璃立方体被击中时摧毁它。 我已经有了 .fbx(使用 Blender 创建的立方体爆炸动画),当我将它拖到场景中并播放它时效果很好,但我只想在某个时间播放它。 这不仅仅是一部动画。它在 .fbx 中有对象

我的玻璃立方体是一个游戏对象。我有一个 GenMap (MonoBehaviour) 类,我阅读了一个配置文件来了解立方体的位置和立方体的种类(污垢/冰/玻璃/石头)。

如果是玻璃立方体,我会在另一个 .cs 中添加一个可破坏类的组件。

在这个类中,我有一个 OnCollisionEnter 函数来破坏我的立方体并播放动画。

我的问题是我现在不知道如何获取我的 .fbx。

我尝试了一个公共 Transform 对象并将我的 .fbx 拖到 Unity 中,但由于我使用 addComponent("Breakable") 我的公共变量在生成时在我的对象上为空。 我知道当我添加组件时,我附加了 .cs 而不是我手动分配的公共变量

void AttachTextureToObject(GameObject obj, int type) //Assign a texture to an object

    _meshrenderer = obj.GetComponent("MeshRenderer") as MeshRenderer;
    switch (type)
    
        case 1:
            _meshrenderer.material.mainTexture = textureG; //textureGrass i initialised in a special function
            break;
        case 2:
            _meshrenderer.material.mainTexture = textureD;
            break;
        case 3:
            _meshrenderer.material.mainTexture = textureS;
            break;
        case 4:
            _meshrenderer.material.mainTexture = textureW;
            break;
        case 5 :
            _meshrenderer.material.mainTexture = textureI;
            obj.collider.sharedMaterial = materialI;
            break;
        case 10: //glass type
            obj.AddComponent("SurfaceReflection"); //add a shader to get glass "texture"
            obj.AddComponent("Breakable"); //add my class breakable
            obj.renderer.material.shader = shaderG;
            obj.collider.sharedMaterial = materialI;
            break;
    

//不同的.cs

public class Breakable : MonoBehaviour 


    public Transform breaking_cube; //when i hit play the .sc attached to my gameobject is null and if i drag my .fbx  manually and hit my cube i see the animation
    Transform current_cube;

    bool broke = false;

    void Start() //when i addComponent i initialize the current cube to itself
    
        current_cube = this.transform;
        breaking_cube = Resources.Load("Blender/broken_cube") as Transform; //this doesn't work 
    

    void OnCollisionEnter(Collision other)
    
        if (other.gameObject.GetComponent<Rigidbody>())
        
            broke = true;
            Destroy(current_cube);
            Transform broken_cube = Instantiate(breaking_cube, transform.position, Quaternion.identity) as Transform;
            current_cube = broken_cube;
            if (broke)
            
                if (!current_cube.transform.animation.isPlaying)
                
                    //i will destroy my gameobject when i finish
                
            
        
    

我尝试添加一个动画组件并添加我的 .fbx,但由于它不仅仅是一个动画,它也不起作用。

我最近开始使用 Unity,所以我可能错过或误用了一个功能。 我不知道我是否足够清楚,但如果您需要截图或其他内容,请告诉我。

【问题讨论】:

【参考方案1】:

为你的 Cube 创建一个预制件。

(进入场景后,将游戏对象拖回项目层次结构中,它将成为预制件)。

现在,您可以随时实例化预制件的副本:

public Transform CubePrefab;

void Start() 

  GameObject cube = (GameObject)Instantiate(CubePrefab, new Vector3(1, 1, 0), Quaternion.identity);
  AttachTextureToObject(cube, 10/*glass*/);

请参阅Instantiating Prefabs at runtime。

【讨论】:

感谢您的时间我尝试了您所说的几种不同的方法,但我总是遇到同样的问题。当我创建我的游戏对象时,如果它是一个玻璃立方体,我会执行 obj.addComponent("breakable") // 我将脚本附加到我的对象上,当我这样做时,使用我的预制件初始化的公共变量变为 null。跨度> 我在上面添加了您的 AttachTextureToObject() 调用。你是这么叫的吗? 没有。当我点击播放时,我在一个空对象上附加了一个 GenMap 类我加载了一个文件 0 0 0 10 //glass cube at pos x=0 y=0 z=0 1 0 0 1 ...我在这些位置创建了一个 Gameobject并在我到达案例 10 时调用 AttachTextureToObject(我创建的游戏对象,10) 尝试上述方法,使用立方体的预制件,然后将组件附加到实例化副本。那应该行得通。您不能在运行时加载 FBX,您需要在编译时加载它们。 你的意思是在播放时拖动它?它可以工作,但我希望它是自动的 如果它编译时会是这样吗?

以上是关于使用 Unity 在游戏期间随时加载 .fbx 对象的主要内容,如果未能解决你的问题,请参考以下文章

Unity游戏开发初探Unity动画优化

如何在 Unity 中从 .fbx 文件创建 .anim 文件?

游戏开发实战下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)

游戏开发实战下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)

游戏开发实战下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)

unity中对导入的FBX动画进行重新编辑