unity3d教程使用photoShop绘制2D图编辑地形贴图

2015年03月21日 13:40 0 点赞 0 评论 更新于 2025-11-21 17:57

本文将详细介绍如何在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图来编辑地形贴图。

作者信息

menghao

menghao

共发布了 3994 篇文章