@sssunny
2019-01-17T13:42:27.000000Z
字数 2546
阅读 176
Pokémon
Unity
场景
美术制作场景-->程序对原始资源进行减面,mesh合并,生存场景.prefab文件-->策划编辑场景文件,生成可行走区域,高度数据,地图数据-->游戏调用
在路径 assets/Map_Raw/Demo 下创建原始的.untiy场景文件。 场景文件主要包含 Light,FX,Terrain三部分,其中Terrain地形相关的内容会经过程序优化处理(包括减面,mesh合并等)。Light,FX以美术制作效果为准,不会进行优化处理
- Terrain 内主要有 Walkable 可行走区域,Building 建筑,Tree 树, thing 摆件物体 和 其他的场景元素组成。
- Walkable 游戏内可行走区域,需要添加meshcollider
- Building 游戏内建筑,有剪影处理,将会剔除meshcollider
- Tree,Thing 游戏内树木,车子等摆件,将会剔除meshcollider
读取 assets/Map_Raw/Demo 的场景文件,优化并且输出新的场景和 .prefab 文件到 assets/Map 路径下
先场景优化主要有两个方面:
1. 剔除不可见的三角形面
2. mesh合并
后场景处理:
1. 多余物件删除
2. 烘焙光照贴图
3. 冗余素材删除
4. 关mipmap
- 场景优化处类
public static class SceneBaker
{
const int MAX_TRIGLE_COUNT_PER_SQUARE = 10000;
const string ASSETS_CACHE_PATH = "Assets/SceneBakeCache/";
const string MAP_PATH = "Assets/Map/";
const string MAP_RAW_PATH = "Assets/Map_Raw";
const string FX_PATH = "Assets/Effects/";
static List<string> RAW_MAP_ROOTS = new List<string>() { "Terrain", "FX", "Light" };
const string MAP_BAKER_WALK_ABLE = "walkable";
const string MAP_BAKER_BUILDING = "building";
const string MAP_BAKER_TREE = "tree";
const string MAP_BAKER_THING = "thing";
const string MAP_BAKER_OTHER = "other";
[MenuItem("SuperMobs/Utils/Bake Raw Scenes")]
static void Test()
{
EditorCoroutine.StartEditorCoroutine(CheckAndDo());
}
...
}
- 多余面剔除
射线剔除法(可以优化)
其他方向:面重合部分裁剪删除,复杂度较高。
public static class SceneBaker
{
...
public static IEnumerator ModifySceneMesh()
{
...
// 删除隐藏的面
SceneMeshSimple.CleanSceneTerrainHiddenTris();
// ClearExcessMesh.CleanSceneTerrainHiddenTris();
yield return null;
EditorSceneManager.SaveScene(SceneManager.GetActiveScene());
AssetDatabase.SaveAssets();
...
}
...
}
public class SceneMeshSimple
{
...
[MenuItem("SuperMobs/Utils/CheckSceneTerrain")]
static void CheckSceneUV()
[MenuItem("SuperMobs/Utils/CleanSceneTerrainHiddenTris")]
public static void CleanSceneTerrainHiddenTris()
...
}
- mesh合并
public static class SceneBaker
{
...
static MB3_TextureBaker BakeMaterial(GameObject terrain){...}
static GameObject BakeMesh(GameObject terrain, MB2_TextureBakeResults textureResult){...}
...
public static IEnumerator ModifySceneMesh()
{
...
// 合并贴图
MB3_TextureBaker mtBaker = BakeMaterial(terrain);
// 合并模型
terrain.name += "_raw";
terrain = BakeMeshs(terrain, mtBaker);
//地形要加碰撞
Transform walk = terrain.transform.Find(MAP_BAKER_WALK_ABLE);
if (walk != null)
{
foreach (var renderer in walk.GetComponentsInChildren<MeshRenderer>())
{
renderer.gameObject.AddComponent<MeshCollider>();
renderer.tag = "TownRoad";
}
}
yield return null;
// 地形要设置为static
foreach (var trans in terrain.GetComponentsInChildren<Transform>())
trans.gameObject.isStatic = true;
}
...
}
不使用传统的 unity 场景切换,而是生成场景 .prefab 文件,通过加载场景的 .prefab 文件代替 SceneManager.LoadScene("scene")
- 减面算法
- mesh 合并规则
- 无缝大世界
- 寻路处理