使用Unity在游戏过程中随时加载.fbx对象

时间:2013-10-31 09:31:09

标签: c# unity3d

我想在C#中使用Unity制作类似Minecraft的游戏,其中包含普通物理(冰块在地板上滑动时)。

现在我正试图摧毁玻璃立方体。 我已经有了.fbx(使用Blender创建的立方体爆炸动画),当我在场景中拖动并播放它时,它可以正常工作,但我想在某个时间播放它。 这不仅仅是一个动画。它在.fbx

中有对象

我的玻璃立方体是GameObject。我有一个类GenMap(MonoBehaviour),我读了一个配置文件,知道立方体的位置和立方体的类型(污垢/冰/玻璃/石头)。

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

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

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

我尝试了一个公共Transform对象并将我的.fbx拖入Unity但是因为我使用了addComponent(“Breakable”),所以当我的对象生成时,我的公共变量为null。 据我所知,当我添加组件时,我附加.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 个答案:

答案 0 :(得分:0)

创建多维数据集的预制件。

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

现在,您需要的任何时候都可以实例化预制件的副本:

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