【问题标题】:Change GameObject's material during runtime在运行时更改游戏对象的材质
【发布时间】:2020-04-26 14:36:19
【问题描述】:

我想实例化四个新的游戏对象。我想分配从网络服务器接收到的四种材料。现在,我可以创建四种材质并将图像存储到它们中。但是,我无法更改四个游戏对象的材质。例如,我想将第一个游戏对象的材质更改为 image0,然后第二个游戏对象为 image1,以此类推。任何人都可以帮助我吗?这是我的代码:

public int k = 0;
public string filename;
public string url;
public string path;
public GameObject newpaper;
public Material material;
public GameObject newObject ;



[MenuItem("GameObject/Create Material")]

void Start () {
    StartCoroutine (LoadImage ());
}


void Update () {

    GetComponent<Renderer> ().material = material;


}

IEnumerator LoadImage(){
    for (int i = 0; i < 4; i++) {

        Instantiate (newpaper);

        filename = "image" + k.ToString () + ".png";
        Debug.Log (k);
        url = "https://wwwfoodparadisehk.000webhostapp.com/" + filename; 
        WWW www = new WWW (url);
        yield return www;

        path = "Assets/MyMaterial" + k.ToString () + ".mat";

        k = k + 1;

        material = new Material (Shader.Find ("Sprites/Default"));
        AssetDatabase.CreateAsset (material, path);


        Debug.Log (AssetDatabase.GetAssetPath (material));

        material.mainTexture = www.texture;

        //GetComponent<Renderer> ().material = material;
        yield return 0;

    }

}

【问题讨论】:

    标签: c# unity3d runtime


    【解决方案1】:

    你需要存储newpaper的新实例,然后设置它的材质如下-

    public int k = 0;
    public string filename;
    public string url;
    public string path;
    public GameObject newpaper;
    public Material material;
    public Material planeMaterial;
    public GameObject newObject ;
    
    [MenuItem("GameObject/Create Material")]
    
    void Start () {
        StartCoroutine (LoadImage ());
    }
    
    
    void Update () {
    
    }
    
    IEnumerator LoadImage(){
        for (int i = 0; i < 4; i++) {
    
            GameObject newPaperInstance = Instantiate (newpaper) as GameObject;
    
            filename = "image" + k.ToString () + ".png";
            Debug.Log (k);
            url = "https://wwwfoodparadisehk.000webhostapp.com/" + filename; 
            WWW www = new WWW (url);
            yield return www;
    
            path = "Assets/MyMaterial" + k.ToString () + ".mat";
    
            k = k + 1;
    
            material = new Material (Shader.Find ("Sprites/Default"));
            AssetDatabase.CreateAsset (material, path);
    
    
            Debug.Log (AssetDatabase.GetAssetPath (material));
    
            material.mainTexture = www.texture;
    
            newPaperInstance.GetComponent<Renderer> ().material = material;
    
            // set newpaper's child "Plane"'s material
            newPaperInstance.transform.Find("Plane").gameObject.GetComponent<Renderer>().material = planeMaterial;
            //GetComponent<Renderer> ().material = material;
            yield return 0;
    
        }
    
    }
    

    【讨论】:

    • 还有一个问题。 gameobject newpaper 有父级,它是平面。我想更改平面材料。我怎样才能改变它?
    • 您可以使用newPaperInstance.transform.parent.gameObject 访问游戏对象的父级,然后访问它的Renderer 组件并更改它的材质。 :)
    • 你能帮我编辑一下代码吗?我做不到。我不知道脚本是否正确粘贴。
    • newPaperInstance.transform.parent.gameObject.GetComponent&lt;Renderer&gt;().material = PlaneMaterial; 在要设置newpaper 材质的任何位置添加此行。确保设置newPaperInstance 的父级并且PlaneMaterial 包含所需的材料。
    • 我想为我的错误道歉。实例 newpaper 是父级,而平面是子级。我想改变平面材料。我是初学者,对不起!
    猜你喜欢
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多