Build应用
AssetBundle打包好后,还需要真正地把游戏Build出来,Unity也提供了BuildPlayer的API,我们可以根据需要进行处理。比如将APK打在哪里,打包APK前需要设置哪些参数等等。这些也是公共打包机的主要工作。
文件夹准备首先我们要在Unity工程文件夹下新建几个文件夹,注意Unity工程文件夹是Asset文件夹的父文件夹,没有meta文件。
新建BuildTarget文件夹,再在其内部新建Windows、IOS、Android三个文件夹。
新建AssetBundle文件夹。
修改BundleEditor脚本我们将BundleEditor打AB包的路径m_BundleTargetPath给修改了,然后在BuildAssetBundle方法内添加一些代码
123456789101112131415161718192021222324252627282930313233343536373839404142 private static string ABCONFIGPATH = "Assets/ResFrame.Editor/Editor/Resource ...
双向链表和WashOut
双向链表的作用双向链表用来配合WashOut,将内存中一直保存的、但是很长时间没用到的资源处理掉。
修改ResourceManager的DestroyResourceItem123456789101112131415161718192021222324252627282930 protected void DestroyResourceItem(ResourceItem item, bool destroyCache = false) { if(item == null||item.RefCount>0) { return; } if(!destroyCache) { m_NoReferenceAssetMapList.InsertToHead(item);//+++ return; } if (!AssetDic.Remove(item.m_Crc)) ...
资源API使用方法
ObjectPoolManagerInstantiateObject从对象池中同步实例化对象。
public GameObject InstantiateObject(string path,bool setSceneObj = false, bool bClear = true)
path:对象路径
setSceneObj:是否在场景设置父物体
bClear:是否换场景销毁
注意:调用此方法后只有再调用ReleaseObject方法才能让此对象切换场景销毁
AsyncInstantiateObject从对象池中异步实例化对象。
public long AsyncInstantiateObject(string path, OnAsyncObjFinish dealFinish, LoadResPriority priority, bool setSceneObj = false, object param1 = null, object param2 = null, object param3 = null, bool bClear = true)
path:对象路径
deal ...
场景管理
添加空场景新建一个Scene,命名为“Empty”,删除里面的灯光和摄像机,并将它放进Build Setting里面
GameSceneManager在Scripts文件夹下新建GameSceneManager脚本
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.SceneManagement;public class GameSceneManager : SingletonPattern<GameSceneManager>{ public event Act ...
UI框架基本使用
菜单界面我们设计一个简单的菜单界面,它由一个背景和几个按钮组成
将MenuPane拉取进GameData——Prefabs——UGUI——Panel文件夹内,并右键——创建UI离线数据
MenuPanel我们在Scripts——UGUI——Panel文件夹下新建脚本MenuPanel
12345678using UnityEngine;using UnityEngine.UI;public class MenuPanel : MonoBehaviour{ public Button m_StartButton, m_LoadButton, m_ExitButton;}
Panel只储存当前UI需要的各种组件
MenuWnd我们在Scripts——UGUI——Window文件夹下新建脚本MenuWnd
1234567891011121314151617181920212223242526using UnityEngine;public class MenuWnd : WindowBase{ private MenuPanel m_MenuPa ...
UI管理类和窗口基类
文件准备在Scripts文件夹内新建文件夹命名为UGUI,在UGUI文件夹内新建三个文件夹命名为Item、Panel、Window,在UGUI文件夹内新建三个脚本命名为:ItemBase、WindowBase、UIManager。
在GameData——Prefabs——UGUI文件夹中新建两个文件夹:Item和Panel
UIManagerUIManager脚本内容:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401 ...
UI框架介绍
UI框架概览
Panel脚本没有任何功能,只保存基础的组件。
基本场景设置将Game Start根结点设置成prefab,即把它放在Asset Bundle配置文件标记过的Prefab文件夹里面
在GameStart根结点下放置一个UI Camera,Clear Flags设置为“Depth Only”,Culling Mask设置为“UI”,Projection设置为“Orthographic”,注意它的Depth要比Main Camera大。
在GameStart根结点下放置一个Canvas,命名为UIRoot,将上面的UI Camera作为UIRoot的子节点,将RenderMode设为“Screen Space - Camera”并将UI Camera指定好,Canvas Scaler设为“Sacle With Screen Space”
在GameStart根结点下放置一个EventSystem。
在GameStart根结点下放置一个MainCamera,并将Culling Mask中的UI去掉。
在UIRoot节点下放置一个空对象,改成“Stretch”模式,命名为“Wnd ...
特效离线数据
EffectOfflineData123456789101112131415161718192021222324252627using UnityEngine;public class EffectOfflineData : OfflineData{ public ParticleSystem[] m_Particle; public TrailRenderer[] m_TrailRenderer; public override void ResetProp() { base.ResetProp(); foreach (ParticleSystem particleSystem in m_Particle) { particleSystem.Clear(); particleSystem.Play(); } foreach (TrailRenderer trail in m_TrailRenderer) ...
UI离线数据
UIOfflineDataUI离线数据比普通离线数据增加了一些RectTransform和ParticleSystem信息
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121using UnityEngine;public class UIOfflineData : OfflineData{ public Vector2[] m_AnchorMax; public Vector2[] m_AnchorMin; public Vector2[] m_Pivot; public Vector2[] m_S ...
离线数据
什么是离线数据当我们使用对象池时,如果我们修改了从对象池取出来的对象(大部分情况下,我们会对Prefab做这样的操作),我们会在放回对象池时还原它或者再从对象池取出时还原它。每次手动还原都很麻烦,所以我们可以针对每个Prefab变化的点提前做好“离线数据”,当对象池每次重置Prefab时使用这个数据就好了。
离线数据的分类离线数据可以灵活分类,这里我们将其分为UI离线数据、特效离线数据、普通离线数据三类
离线数据基类12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182using UnityEngine;public class OfflineData : MonoBehaviour{ public Rigidbody m_RigidBody; public Collider m_Collider; pub ...