挖土功能,非webgl平台的话,简单的方法是:挖土后地形和挖掉的地形叠加,挖土事件触发后,挖掉的地形.setActive(false)即可
但是发布webgl平台,需要尽量减少unity堆大小,多个地形导致文件太大,用代码修改会大大提高加载速度。
新建Resources文件夹,地形数据,贴图数据放在其下,1、2 为地形数据,3、4为地形贴图数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;
public class TerrianDig : MonoBehaviour {
public Terrain terrains;
public Terrain terraind;
StreamWriter writer;
StreamReader reader;
void OnGUI()
{
//if (GUI.Button(new Rect(150, 100, 120, 20), "设置地形_1"))
//{
// setTeData1();
//
//}
//if (GUI.Button(new Rect(250, 100, 120, 20), "设置地形_2"))
//{
// setTeData2();
//
//}
//if (GUI.Button(new Rect(150, 200, 120, 20), "设置材质_1"))
//{
// setTeMat1();
//
//}
//if (GUI.Button(new Rect(250, 200, 120, 20), "设置材质_2"))
//{
// setTeMat2();
//
//
}
// Use this for initialization
void Start () {
}
//把所有的数据写入文本中
public void WriteIntoTxt(string message,string path)
{
FileInfo file = new FileInfo(Application.dataPath + "/Resources/"+ path);
if (!file.Exists)
{
writer = file.CreateText();
}
else
{
writer = file.AppendText();
}
writer.WriteLine(message);
writer.Flush();
writer.Dispose();
writer.Close();
}
public void setTeData1(){
TextAsset textFile = Resources.Load("1") as TextAsset;
string tdata = textFile.text;
string[] tar_data = tdata.Split(',');
float[,] heightMapBackup = new float[200, 200];//
//int alength = heightMapBackup.GetLength(0);
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
heightMapBackup[i, j] = float.Parse(tar_data[(j+i*200)]);
}
}
//terrains.heightmapPixelError = 5;
//terrains.basemapDistance = 2000; //解决地形使用prfab会变黑的情况
terraind.terrainData.SetHeights(520, 1440, heightMapBackup);
}
public void setTeData2()
{
TextAsset textFile = Resources.Load("2") as TextAsset;
string tdata = textFile.text;
string[] tar_data = tdata.Split(',');
float[,] heightMapBackup = new float[200, 200];//
//int alength = heightMapBackup.GetLength(0);
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
heightMapBackup[i, j] = float.Parse(tar_data[(j + i * 200)]);
}
}
//terrains.heightmapPixelError = 5;
//terrains.basemapDistance = 2000; //解决地形使用prfab会变黑的情况
terraind.terrainData.SetHeights(520, 1440, heightMapBackup);
}
public void getTedata1() {
float[,] testdata = terrains.terrainData.GetHeights(520, 1440, 200, 200);
int length = testdata.GetLength(0);
string str = "";
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
str += testdata.GetValue(i, j) + ",";
}
}
WriteIntoTxt(str,"1.txt");
}
public void getTedata2()
{
float[,] testdata = terraind.terrainData.GetHeights(520, 1440, 200, 200);
int length = testdata.GetLength(0);
string str = "";
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
str += testdata.GetValue(i, j) + ",";
}
}
WriteIntoTxt(str, "2.txt");
}
public void getTeMat1()
{
int awidth = 100; //terraind.terrainData.alphamapWidth;
int aheight = 100;//terraind.terrainData.alphamapHeight;
float[,,] testdata = terraind.terrainData.GetAlphamaps(520 / 2, 1440 / 2, awidth, aheight);
string str = "";
// print(testdata.GetValue(1023,1023,3));
for (int i = 0; i < awidth; i++)
{
for (int j = 0; j < aheight; j++)
{
for (int k = 0; k < 4; k++)
{
// print(i + "," + j + "," + k);
str += testdata.GetValue(new int[] { i, j, k }).ToString() + ",";
}
}
}
WriteIntoTxt(str, "3.txt");
}
public void getTeMat2()
{
int awidth = 100; //terraind.terrainData.alphamapWidth;
int aheight = 100;//terraind.terrainData.alphamapHeight;
float[,,] testdata = terrains.terrainData.GetAlphamaps(520 / 2, 1440 / 2, awidth, aheight);
string str = "";
// print(testdata.GetValue(1023,1023,3));
for (int i = 0; i < awidth; i++)
{
for (int j = 0; j < aheight; j++)
{
for (int k = 0; k < 4; k++)
{
// print(i + "," + j + "," + k);
str += testdata.GetValue(new int[] { i, j, k }).ToString() + ",";
}
}
}
WriteIntoTxt(str, "4.txt");
}
public void setTeMat1()
{
TextAsset textFile = Resources.Load("3") as TextAsset;
string tdata = textFile.text;
string[] tar_data = tdata.Split(',');
float[,,] heightMapBackup = new float[100, 100,4];//
//int alength = heightMapBackup.GetLength(0);
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
for (int k=0;k<4;k++) {
heightMapBackup[i, j,k] = float.Parse(tar_data[i*400+j*4+k]);
}
}
}
terraind.terrainData.SetAlphamaps(520 / 2, 1440 / 2, heightMapBackup);
}
public void setTeMat2()
{
TextAsset textFile = Resources.Load("4") as TextAsset;
string tdata = textFile.text;
string[] tar_data = tdata.Split(',');
float[,,] heightMapBackup = new float[100, 100,4];//
//int alength = heightMapBackup.GetLength(0);
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
for (int k=0;k<4;k++) {
heightMapBackup[i, j,k] = float.Parse(tar_data[i*400+j*4+k]);
}
}
}
terraind.terrainData.SetAlphamaps(520 / 2, 1440 / 2, heightMapBackup);
}
}
效果如下:(恢复至初始:setTeData2() + setTeMat1())
经过挖土动画后:(setTeData1() + setTeMat2())
地形: