当自己真正一步一步去做的时候,才发现以前都是在别人铺好的路上行走,现在到了自己去铺路的时候,却发现自己却连一块儿砖都找不到......
现在做的是类似于皇室战争玩法的游戏,大致描述一下游戏的玩法:
AB双方各自有一个老窝,各自可以派兵去攻击对方的老窝,一方的老窝先被拆掉,另一方就胜出,游戏结束。AB双方派出去的兵会优先去打对方的小兵,直到目标被打死,换下一个目标。(大致先描述到这里,之后做的过程中再补充)
下面说一下做法,因为想用到热更新,所以采用了现有的基于tolua的框架LuaFramework,LuaFramework框架下载地址:https://github.com/jarjin/LuaFramework_UGUI
1,打开项目,遇到的第一个问题就是打包问题,发现这个框架竟然采用的手动打包,于是对比了一下公司项目的打包方式,在Package.cs中的BuildAssetResource方法加了下面的代码,打包问题搞定。
string resPath = "Assets/" + AppConst.AssetDir;
BuildPipeline.BuildAssetBundles(resPath, maps.ToArray(), BuildAssetBundleOptions.None, target);
BuildPipeline.BuildAssetBundles(resPath, BuildAssetBundleOptions.DeterministicAssetBundle, target);
2,动态加载模型时,发现材质丢失,原来unity在编辑器环境下,动态加载模型会有bug,所以为了解决这个问题需要添加几行代码:
void CreateHero(EventObj obj)
{
AppFacade.Instance.GetManager<ResourceManager>(ManagerName.Resource).LoadPrefab("model/warrior" + AppConst.ExtName, "warrior", delegate (UnityEngine.Object[] objs)
{
if (objs.Length == 0)
{
Debug.LogError("load fail");
return;
}
hero = objs[0] as GameObject;
if (hero == null)
{
Debug.LogError("hero init fail");
return;
}
GameObject gameobj = GameObject.Instantiate(hero);
#if UNITY_EDITOR
CommonUtil.InitGameObject(gameobj);
#endif
Debug.LogError("hero instantiate");
gameobj.transform.SetParent(GameObject.Find("TargetHeroPos").transform);
gameobj.transform.localPosition = Vector3.zero;
gameobj.transform.localScale = Vector3.one;
});
}
public static void InitGameObject(GameObject obj)
{
Renderer[] renders = obj.GetComponentsInChildren<Renderer>();
Renderer render;
for (int i = 0; i < renders.Length; i++)
{
render = renders[i];
if (null == render) continue;
int nMaterialLen = render.materials.Length;
for (int j = 0; j < nMaterialLen; j++)
{
Shader shader = Shader.Find(render.materials[j].shader.name);
if (null != shader) render.materials[j].shader = shader;
}
}
}
3,游戏启动就开始用ResourceManager去load资源,导致ResourceManager还没实例出来就被调用,碰了次壁,才发现不从头开始做,永远都不知道什么时候该做什么事情。这个问题的解决方法是 等所有游戏初始化完之后再去执行,游戏初始化完的函数是GameManager.cs ->OnInitialize()方法,在该方法下面发一个游戏初始化结束的事件就可以了。