Unity自带地形中改树预制体的材质,并显示到场景中

场景中的树木不同种类,在场景中不存在实例,只有去更改预制体的材质。

如果树木是由两个材质球组成,更改循环的条件,控制循环,然后将预制体材质球数组替换掉,拖拽会比较多,材质球也会太多。

public class TwoSceneTreeTextureControl : MonoBehaviour {
    public List<GameObject> treeOneMatObj = new List<GameObject>();
    public List<Material> treePingChangOneMat = new List<Material>();
    public List<Material> treeHongWaiOneMat = new List<Material>();
    private bool isIR = false;
    // Use this for initialization
    void Start () {
        
        
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.C))
        {
            if (!isIR)
            {
                ChangeHong();
                isIR = true;
            }
            else
            {
                ChangePing();
                isIR = false;
            }
            Terrain.activeTerrain.terrainData.RefreshPrototypes();
        }
    }
    
    void ChangeHong()
    {
        for (int i = 0; i < treeHongWaiOneMat.Count; i++)
        {
            treeOneMatObj[i].GetComponent<MeshRenderer>().sharedMaterial = treeHongWaiOneMat[i];
        }
      


    }
    void ChangePing()
    {


        for (int i = 0; i < treePingChangOneMat.Count; i++)
        {
            treeOneMatObj[i].GetComponent<MeshRenderer>().material = treePingChangOneMat[i];
        }
        
    }
    
}

最后更改预制体材质之后,要调用刷新的函数。然后就会得到改变。

注意一点是,获取到预制体后是不能直接获取到材质球里面的mainTexture的,报空。

换树木的图片代码如下:

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;

public class ChangeTreeMaterial : MonoBehaviour {
    public GameObject terrain;
    public Material Bush;
    public Material Birch;
    public Material Pine;
    public Texture PingBush;
    public Texture PingBirch;
    public Texture PingPine;
    public Texture HongBush;
    public Texture HongBirch;
    public Texture HongPine;

    private List<GameObject> selectedsGameobject = new List<GameObject>();

    public List<GameObject> BushGame = new List<GameObject>();
    public List<GameObject> BirchGame = new List<GameObject>();
    public List<GameObject> PineGame = new List<GameObject>();
    private List<string> BushName = new List<string>();
    private List<string> BirchName = new List<string>();
    private List<string> PineName = new List<string>();
    // Use this for initialization
    void Start () {
        for (int i = 0; i < Terrain.activeTerrain.terrainData.treePrototypes.Length; i++)
        {
            selectedsGameobject.Add(Terrain.activeTerrain.terrainData.treePrototypes[i].prefab);
        }
        for (int i = 0; i < BushGame.Count; i++)
        {
            BushName.Add(BushGame[i].ToString());
        }
        for (int i = 0; i < BirchGame.Count; i++)
        {
            BirchName.Add(BirchGame[i].ToString());
        }
        for (int i = 0; i < PineGame.Count; i++)
        {
            PineName.Add(PineGame[i].ToString());
        }
        //运行使场景恢复到原始状态
        ChangePing();
        Refresh();
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.H))
        {
            ChangeHong();
            Refresh();
        }
        if(Input.GetKeyDown(KeyCode.P))
        {
            ChangePing();
            Refresh();
        }
    }
    void ChangeHong()
    {
        for (int i = 0; i < selectedsGameobject.Count; i++)
        {
            GameObject obj = selectedsGameobject[i];
            if (BushName.Contains(obj.name + " (UnityEngine.GameObject)"))
            {
                Bush.mainTexture = HongBush;
            }
            else if (BirchName.Contains(obj.name + " (UnityEngine.GameObject)"))
            {
                Birch.mainTexture = HongBirch;
            }
            else if (PineName.Contains(obj.name + " (UnityEngine.GameObject)"))
            {
                Pine.mainTexture = HongPine;
            }

        }
    }
    void ChangePing()
    {
        for (int j = 0; j < selectedsGameobject.Count; j++)
        {
            GameObject obj = selectedsGameobject[j];
            if (BushName.Contains(obj.name + " (UnityEngine.GameObject)"))
            {
                Bush.mainTexture = PingBush;

            }
            else if (BirchName.Contains(obj.name + " (UnityEngine.GameObject)"))
            {
                Birch.mainTexture = PingBirch;
            }
            else if (PineName.Contains(obj.name + " (UnityEngine.GameObject)"))
            {
                Pine.mainTexture = PingPine;
            }

        }
    }
    void Refresh()
    {
        Terrain.activeTerrain.terrainData.RefreshPrototypes();
    }
}


猜你喜欢

转载自blog.csdn.net/lei_7103/article/details/70047875