@sssunny
2019-01-17T13:42:27.000000Z
字数 2546
阅读 260
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;// 地形要设置为staticforeach (var trans in terrain.GetComponentsInChildren<Transform>())trans.gameObject.isStatic = true;}...}
不使用传统的 unity 场景切换,而是生成场景 .prefab 文件,通过加载场景的 .prefab 文件代替 SceneManager.LoadScene("scene")
- 减面算法
- mesh 合并规则
- 无缝大世界
- 寻路处理