【问题标题】:Create material from code and assign it to an object从代码创建材料并将其分配给对象
【发布时间】:2022-05-22 03:13:39
【问题描述】:

我对 Unity3d 很陌生。我有一个包含 6 个四边形的预制件,使其成为一个立方体。我想为立方体的不同面添加图像纹理。 我从 Web 服务获取图像,因此我必须在脚本中添加或更改材料。 我面临的问题是,我无法在游戏对象中找到材质属性。

我试过下面的代码:

using UnityEngine;
using System.Collections;

public class shelfRuntime : MonoBehaviour {
    public GameObject bottle;
    public GameObject newBottle;
    // Use this for initialization
    void Start () {
   
            iterateChildren(newBottle.transform.root);
        
        GameObject rocketClone = (GameObject)Instantiate(bottle, bottle.transform.position, bottle.transform.rotation);
        rocketClone.transform.localScale += new Vector3(1, 1, 1);
        GameObject newBottleInMaking = (GameObject)Instantiate(newBottle, newBottle.transform.position, newBottle.transform.rotation);

        Transform[] allChildren = newBottleInMaking.GetComponentsInChildren<Transform>();
        foreach (Transform child in allChildren)
        {
            // do whatever with child transform here
        }
    }
    void iterateChildren(Transform trans)
    {
        Debug.Log(trans.name);
        if (trans.name == "Back") {
            var ting = trans.gameObject.GetComponent<Renderer>();
        //   trans.renderer.material  // there is no material property here 
        }

        // Do whatever logic you want on child objects here
        if (trans.childCount == 0) return;

        foreach (Transform tran in trans)
        {
            iterateChildren(tran);
        }
    }

    // Update is called once per frame
    void Update () {
    
    }
}

如何将材质设置为四边形?我的预制件中有 6 个四边形。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您无法再直接在 Unity 中访问某些组件。您必须使用GetComponent 获取组件(Renderer)然后从中访问材料。

    trans.renderer.material = ....
    

    应该改为

    trans.GetComponent<Renderer>().material = yourNewMaterial;
    

    最后,当在 Unity 中创建 Cube 或 Quad 时,MeshRenderer 会自动附加到它们而不是 Renderer。因此,您可能会遇到GetComponent&lt;Renderer&gt;() 的运行时错误。请改用MeshRenderer

    trans.GetComponent<MeshRenderer>().material = yourNewMaterial;
    

    在运行时创建材质:

    Material myNewMaterial = new Material(Shader.Find("Standard"));
    

    下面的示例将创建一个材质,为其分配标准着色器,然后将纹理从 myTexture 变量更改为纹理,然后再将其应用于游戏对象。

    public Texture myTexture;
    void Start()
    {
        //Find the Standard Shader
        Material myNewMaterial = new Material(Shader.Find("Standard"));
        //Set Texture on the material
        myNewMaterial.SetTexture("_MainTex", myTexture);
        //Apply to GameObject
        trans.GetComponent<MeshRenderer>().material = myNewMaterial;
    }
    

    【讨论】:

    • var temp = trans.GetComponent().material ;返回 null ,即使它包含材质(将图像拖放到四边形上)
    • 您的评论令人困惑。您不能将图像拖动到四边形。您将图像插入到连接到四边形的 MeshRenderer 的材质中。你现在有什么问题?
    • 当我点击我的预制件时,我有四边形,我将图像从 assest 文件夹中拖放到相应的四边形上,并将其创建的材质与图像纹理分配给它
    • 但是谢谢,这是可行的,var ting = trans.gameObject.GetComponent().material.color = Color.black;现在我唯一需要做的就是创建一个使用图像的材料。我相信互联网会帮助我,谢谢,接受你的回答
    • 我认为你的问题不清楚。它说“无法设置材料”而不是“无法设置颜色”。再说一次,"trans.renderer.material // there is no material property here"。此解决方案展示了如何更改材质。如果颜色是您想要更改的,那么上面评论中的代码应该可以做到。不客气,编码愉快。这是 Unity 新用户的tutorial
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多