unity3d教程使用photoShop绘制2D图编辑地形贴图
本文将详细介绍如何在Unity3D中动态创建地形,设置splatPrototypes,并使用Photoshop绘制2D图来编辑地形贴图。
步骤
1. 创建新场景和脚本
首先,创建一个新场景并将其命名为Tutor_4_CreateTerrainWithSplat。接着,新建一个GameObject,将其命名为Manager。然后,创建一个名为Tutor_4_CreateTerrainWithSplat.cs的脚本,并将其拖到Manager对象上。
2. 编写基础脚本
将以下脚本粘贴并覆盖到Tutor_4_CreateTerrainWithSplat.cs文件中。该脚本与上个例子的脚本基本一致:
using UnityEngine;
using System.Collections;
using UnityEditor;
public class Tutor_4_CreateTerrainWithSplat : MonoBehaviour {
public AnimationCurve animationCurve;
void Start() {
CreateTerrain();
}
public Terrain CreateTerrain() {
TerrainData terrainData = new TerrainData();
terrainData.heightmapResolution = 513;
terrainData.baseMapResolution = 513;
terrainData.size = new Vector3(50, 50, 50);
terrainData.alphamapResolution = 512;
terrainData.SetDetailResolution(32, 8);
ModifyTerrainDataHeight(terrainData);
GameObject obj = Terrain.CreateTerrainGameObject(terrainData);
AssetDatabase.CreateAsset(terrainData, "Assets/Tutorial/Tutor_4_TerrainWithSplats.asset");
AssetDatabase.SaveAssets();
return obj.GetComponent<Terrain>();
}
public void ModifyTerrainDataHeight(TerrainData terrainData) {
int width = terrainData.heightmapWidth;
int height = terrainData.heightmapHeight;
float[,] array = new float[width, height];
print("width:" + width + " height:" + height);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
float f1 = j;
float f2 = height;
array[i, j] = animationCurve.Evaluate(f1 / f2);
}
}
terrainData.SetHeights(0, 0, array);
}
}
3. 添加地形贴图变量
在上述脚本中添加public Texture2D[] splats;,用于存储地形贴图变量。然后在Inspector面板里指定任意一张贴图。
4. 添加Splat
现在开始添加Splat。核心是SplatPrototype,它包含了Splat原型的信息,包括贴图信息和地形块的信息。
SplatPrototype outSplatPrototype = new SplatPrototype();
设置SplatPrototype的属性:
outSplatPrototype.texture:指定贴图。outSplatPrototype.tileOffset:地形块的偏移。outSplatPrototype.tileSize:地形块的尺寸。
以下是完整的添加Splat后的脚本:
using UnityEngine;
using System.Collections;
using UnityEditor;
public class Tutor_4_CreateTerrainWithSplat : MonoBehaviour {
public AnimationCurve animationCurve;
public Texture2D[] splats;
void Start() {
CreateTerrain();
}
public Terrain CreateTerrain() {
TerrainData terrainData = new TerrainData();
terrainData.heightmapResolution = 513;
terrainData.baseMapResolution = 513;
terrainData.size = new Vector3(50, 50, 50);
terrainData.alphamapResolution = 512;
terrainData.SetDetailResolution(32, 8);
terrainData.splatPrototypes = CreateSplatPrototypes(splats, new Vector2(15, 15), new Vector2(0, 0));
ModifyTerrainDataHeight(terrainData);
GameObject obj = Terrain.CreateTerrainGameObject(terrainData);
AssetDatabase.CreateAsset(terrainData, "Assets/Tutorial/Tutor_4_TerrainWithSplats.asset");
AssetDatabase.SaveAssets();
return obj.GetComponent<Terrain>();
}
public void ModifyTerrainDataHeight(TerrainData terrainData) {
int width = terrainData.heightmapWidth;
int height = terrainData.heightmapHeight;
float[,] array = new float[width, height];
print("width:" + width + " height:" + height);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
float f1 = j;
float f2 = height;
array[i, j] = animationCurve.Evaluate(f1 / f2);
}
}
terrainData.SetHeights(0, 0, array);
}
public SplatPrototype[] CreateSplatPrototypes(Texture2D[] tmpTextures, Vector2 tmpTileSize, Vector2 tmpOffset) {
SplatPrototype[] outSplatPrototypes = new SplatPrototype[tmpTextures.Length];
for (int i = 0; i < tmpTextures.Length; i++) {
outSplatPrototypes[i] = CreateSplatPrototype(tmpTextures[i], tmpTileSize, tmpOffset);
}
return outSplatPrototypes;
}
public SplatPrototype CreateSplatPrototype(Texture2D tmpTexture, Vector2 tmpTileSize, Vector2 tmpOffset) {
SplatPrototype outSplatPrototype = new SplatPrototype();
outSplatPrototype.texture = tmpTexture;
outSplatPrototype.tileOffset = tmpOffset;
outSplatPrototype.tileSize = tmpTileSize;
return outSplatPrototype;
}
}
通过以上步骤,你就可以在Unity3D中动态创建地形,并使用Photoshop绘制的2D图来编辑地形贴图。