[关闭]
@sssunny 2019-01-17T13:42:27.000000Z 字数 2546 阅读 176

Pokémon 场景梳理

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

  • 场景优化处类
  1. public static class SceneBaker
  2. {
  3. const int MAX_TRIGLE_COUNT_PER_SQUARE = 10000;
  4. const string ASSETS_CACHE_PATH = "Assets/SceneBakeCache/";
  5. const string MAP_PATH = "Assets/Map/";
  6. const string MAP_RAW_PATH = "Assets/Map_Raw";
  7. const string FX_PATH = "Assets/Effects/";
  8. static List<string> RAW_MAP_ROOTS = new List<string>() { "Terrain", "FX", "Light" };
  9. const string MAP_BAKER_WALK_ABLE = "walkable";
  10. const string MAP_BAKER_BUILDING = "building";
  11. const string MAP_BAKER_TREE = "tree";
  12. const string MAP_BAKER_THING = "thing";
  13. const string MAP_BAKER_OTHER = "other";
  14. [MenuItem("SuperMobs/Utils/Bake Raw Scenes")]
  15. static void Test()
  16. {
  17. EditorCoroutine.StartEditorCoroutine(CheckAndDo());
  18. }
  19. ...
  20. }
  • 多余面剔除
    射线剔除法(可以优化)
    其他方向:面重合部分裁剪删除,复杂度较高。
  1. public static class SceneBaker
  2. {
  3. ...
  4. public static IEnumerator ModifySceneMesh()
  5. {
  6. ...
  7. // 删除隐藏的面
  8. SceneMeshSimple.CleanSceneTerrainHiddenTris();
  9. // ClearExcessMesh.CleanSceneTerrainHiddenTris();
  10. yield return null;
  11. EditorSceneManager.SaveScene(SceneManager.GetActiveScene());
  12. AssetDatabase.SaveAssets();
  13. ...
  14. }
  15. ...
  16. }
  17. public class SceneMeshSimple
  18. {
  19. ...
  20. [MenuItem("SuperMobs/Utils/CheckSceneTerrain")]
  21. static void CheckSceneUV()
  22. [MenuItem("SuperMobs/Utils/CleanSceneTerrainHiddenTris")]
  23. public static void CleanSceneTerrainHiddenTris()
  24. ...
  25. }
  • mesh合并
  1. public static class SceneBaker
  2. {
  3. ...
  4. static MB3_TextureBaker BakeMaterial(GameObject terrain){...}
  5. static GameObject BakeMesh(GameObject terrain, MB2_TextureBakeResults textureResult){...}
  6. ...
  7. public static IEnumerator ModifySceneMesh()
  8. {
  9. ...
  10. // 合并贴图
  11. MB3_TextureBaker mtBaker = BakeMaterial(terrain);
  12. // 合并模型
  13. terrain.name += "_raw";
  14. terrain = BakeMeshs(terrain, mtBaker);
  15. //地形要加碰撞
  16. Transform walk = terrain.transform.Find(MAP_BAKER_WALK_ABLE);
  17. if (walk != null)
  18. {
  19. foreach (var renderer in walk.GetComponentsInChildren<MeshRenderer>())
  20. {
  21. renderer.gameObject.AddComponent<MeshCollider>();
  22. renderer.tag = "TownRoad";
  23. }
  24. }
  25. yield return null;
  26. // 地形要设置为static
  27. foreach (var trans in terrain.GetComponentsInChildren<Transform>())
  28. trans.gameObject.isStatic = true;
  29. }
  30. ...
  31. }

场景应用

不使用传统的 unity 场景切换,而是生成场景 .prefab 文件,通过加载场景的 .prefab 文件代替 SceneManager.LoadScene("scene")

研究方向

  • 减面算法
  • mesh 合并规则
  • 无缝大世界
  • 寻路处理

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注