场景中的树木不同种类,在场景中不存在实例,只有去更改预制体的材质。
如果树木是由两个材质球组成,更改循环的条件,控制循环,然后将预制体材质球数组替换掉,拖拽会比较多,材质球也会太多。
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();
}
}