Unity-FrameWorkSong框架手册

版本 V1.0.0

最新编号 更新日期
FrameWorkSong_V1.0.0 20220524

框架下载地址

框架工具

Delay-延时运行

        /// <summary>
        /// 延时功能
        /// </summary>
        /// <param name="seconds">延迟时间</param>
        /// <param name="onFinished">调用方法</param>
        public  void Delay(float seconds, Action onFinished)

Demo

        Delay(2, () => { CreateClientSocket(); });
        Delay(2, CreateClientSocket);

IRefCounter-引用计数器

规定

使用对象必须继承 IRefCounter

使用对象要重写OnZeroRef计数归零运行的虚方法

计数方法

Retain

持有,数量加一

Demo

   res = new Res(resAsset);
   res.Retain();
Release

释放,数量减一

Demo

  res = new Res(resAsset); 
  res.Release();

单例继承

继承Singleton抽象类实现单例功能

public abstract class Singleton <T>: MonoBehaviourSimplify where T:Singleton<T>

Demo

public class PrefabsManager : Singleton<PrefabsManager>

窗口分辨率

规定

在继承了MonoBehaviourSimplify的类下可以直接调用

只适用于pc端

获取当前窗口的分辨率

Resolution[] resolutions = Screen.resolutions;这个方法,可以获取所有分辨率数组,最后一个是最大分辨率。

        resolutions = Screen.resolutions;
        int count = resolutions.Length;
        MaxResolutions = resolutions[count - 1];

方法

SetResolution
        /// <summary>
        /// 设置分辨率
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="isFull">是否全屏</param>
        /// <param name="isShowTitleBar">是否显示标题栏</param>
        /// <param name="posX">窗口位置(窗口左上角为原点)</param>
        /// <param name="posY">窗口位置(窗口左上角为原点)</param>
        public void SetResolution(int width, int height, bool isFull, bool isShowTitleBar,int posX,int posY)

demo

 SetResolution(1080, 720, false, true, (int)((resolution.width-1080)*0.5f), (int)((resolution.height - 720) * 0.5f));//这里的posX和posy是计算屏幕的中心点
SetMaxWindows

全屏有工具栏无标题方法,这里会读取当前的默认分辨率,如果设置了屏幕的分辨率小于最大分辨率,使用后并不能全屏。

SetMinWindows

缩到工具栏

GetTaskBarHeight

得到工具栏的高度,这个方法用来设置全屏时减去工具栏高度,可以在伪全屏的时候显示工具栏

SetFullScreen

windows的全屏方法

DragWindow

这个方法可以绑定在EventTrigger->Drag上使用

管线生成

规定

生成需要应用 FrameWorkSong 后new LineCreateOf3D

LineCreateOf3D.CreateLine
       /// <summary>
        /// 创建管线
        /// </summary>
        /// <param name="createPoint">管线点数组</param>
        /// <param name="material">材质</param>
        /// <param name="circularCount">管线段数</param>
        /// <param name="circularR">管线半径</param>
        /// <param name="elbowR">弯头半径</param>
        /// <returns></returns>
        public GameObject CreateLine(Vector3[] createPoint, Material material, int circularCount, float circularR, float elbowR)

Demo

 GameObject  game= LineCreateOf3D.CreateLine(point, material, 6, 1,4);

文件管理

规定

引用FrameWorkSong

FileMgr是单例

StrFileWrite

文本保存

    /// <summary>
    /// 文本保存到文档
    /// </summary>
    /// <param name="path">本地保存路径</param>
    /// <param name="fileName">文件名称带后缀</param>
    /// <param name="jsonData">文字数据</param>
    public void StrFileWrite(string path, string fileName, string jsonData)

Demo

string CreateJson()
{
    JsonUtil.AddData("A", "a");
    JsonUtil.AddData("B", "b");
    JsonUtil.AddData("C", "c");
    string jsonData = JsonUtil.GetJsonString();
    return jsonData;
}
void demo()
{
       fileMgr = FileMgr.Instance;
        fileMgr.StrFileWrite(fileMgr.PersistentPath, "test.json", CreateJson());
}
StrFileRead

读取文档文字

        /// <summary>
        /// 读取文档文字
        /// </summary>
        /// <param name="path">本地保存路径</param>
        /// <param name="fileName">文件名称带后缀</param>
        /// <returns>文件里的文字</returns>
        public string StrFileRead(string path, string fileName)

Demo

        string json = fileMgr.StrFileRead(fileMgr.PersistentPath, "test.json");
SaveAssetFile

保存资源到本地

        /// <summary>
        /// 保存资源到本地
        /// </summary>
        /// <param name="path">本地保存路径</param>
        /// <param name="fileName">文件名称带后缀</param>
        /// <param name="bytes">byte数据</param>
        /// <param name="byteLength"></param>
        public void SaveAssetFile(string path, string fileName, byte[] bytes, int byteLength)

Demo

       fileMgr.SaveAssetFile(fileMgr.PersistentPath, "cubetest.ab", bytes, bytes.Length);

拼json方法

规定

引用FrameWorkSong

JsonUtil.AddData

增加一层json,这里传入的两个数分别是string和object类型,属性必须是string,值可以是string、string[];

Demo

        JsonUtil.AddData("A", "a");
        JsonUtil.AddData("B", "b");
        JsonUtil.AddData("C", "c");
JsonUtil.GetJsonString

返回一层jsonString

Demo

 string jsonData = JsonUtil.GetJsonString();
JsonUtil.AddDatas

将上一层转为数组

Demo

JsonUtil.AddDatas;
JsonUtil.GetJsonStrings

返回一层json数组

Demo

 string jsonData = JsonUtil.GetJsonStrings();

扩展方法

1. transform.postion单独赋值

setLocalPosX
        /// <summary>
        /// transform设置x
        /// </summary>
        /// <param name="transform">本transform</param>
        /// <param name="x">x</param>
        public static void setLocalPosX(this Transform transform, float x)
setLocalPosY
        /// <summary>
        /// transform设置y
        /// </summary>
        /// <param name="transform"></param>
        /// <param name="y"></param>
        public static void setLocalPosY(this Transform transform, float y)
setLocalPosZ
        /// <summary>
        /// transform设置z
        /// </summary>
        /// <param name="transform"></param>
        /// <param name="z"></param>
        public static void setLocalPosZ(this Transform transform, float z)
setLocalPosXY
        /// <summary>
        /// transform设置xy
        /// </summary>
        /// <param name="transform"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public static void setLocalPosXY(this Transform transform, float x,float y)
setLocalPosXZ
        /// <summary>
        /// transform设置xz
        /// </summary>
        /// <param name="transform"></param>
        /// <param name="x"></param>
        /// <param name="z"></param>
        public static void setLocalPosXZ(this Transform transform, float x, float z)
setLocalPosYZ
        /// <summary>
        /// transform设置yz
        /// </summary>
        /// <param name="transform"></param>
        /// <param name="y"></param>
        /// <param name="z"></param>
        public static void setLocalPosYZ(this Transform transform, float y, float z)
identity
        /// <summary>
        /// 标准化
        /// </summary>
        /// <param name="transform"></param>
        public static void identity(this Transform transform)

2. 字典读取

AddData
        /// <summary>
        /// 增加可重复覆盖字典数据
        /// </summary>
        /// <typeparam name="Tkey"></typeparam>
        /// <typeparam name="Tvalue"></typeparam>
        /// <param name="dict"></param>
        /// <param name="tkey"></param>
        /// <param name="tvalue"></param>
        public static void AddData<Tkey, Tvalue>(this Dictionary<Tkey, Tvalue> dict, Tkey tkey, Tvalue tvalue)

demo

    void Add()
    {
        objPosDict.AddData("One", new Vector3(0, 0, 0));
        objPosDict.AddData("Two", new Vector3(1, 0, 0));
        objPosDict.AddData("Three", new Vector3(0, 1, 0));
    }

3. Color编码转换

ToRGB
        /// <summary>
        /// 十六进制颜色码转换成RGB颜色值
        /// </summary>
        /// <param name="color">本颜色</param>
        /// <param name="colorStr"> 十六进制颜色码</param>
        /// <param name="Alpha">透明度</param>
        /// <returns></returns>
        public static Color ToRGB(this Color color,string colorStr, float Alpha)
        /// <summary>
        /// 十六进制颜色码转换成RGB颜色值
        /// </summary>
        /// <param name="color">本颜色</param>
        /// <param name="colorStr">十六进制颜色码</param>
        /// <returns></returns>
        public static Color ToRGB(this Color color, string colorStr)

Demo

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            GetColor("#ba5959");
        }
    }
    void GetColor(string s)
    {
        Color color = new Color();
        gameObject.AddComponent<Image>().color = color.ToRGB(s);
    }

4.相机定位

传入目标的Bounds,传出定位位置

GetCameraMovePos
       /// <summary>
        /// 得到Camera定位目标移动位置
        /// </summary>
        /// <param name="camera"></param>
        /// <param name="target">目标的Bound</param>
        /// <returns></returns>
        public static Vector3 GetCameraMovePos(this Camera camera, Bounds target)

demo

    public Vector3 CameraPos;
    public bool isMove = false;
    void Update()
    {
        if (isMove)
        {
            Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, CameraPos, 30f * Time.deltaTime);
            if (Camera.main.transform.position == CameraPos)
            {
                isMove = false;
            }
        }
    }

    private void OnMouseDown()
    {
        //CameraPos = Camera.main.GetCameraMovePos(gameObject.GetComponent<MeshFilter>().mesh.bounds);
        CameraPos = Camera.main.GetCameraMovePos(gameObject.GetComponent<Collider>().bounds);
        isMove = true;
    }

5.得到旋转值

ToAngle
        /// <summary>
        /// 角度旋转
        /// </summary>
        /// <param name="vector3"></param>
        /// <param name="angle">旋转角度</param>
        /// <param name="center">旋转中心点</param>
        /// <param name="direction">旋转轴</param>
        /// <returns></returns>
        public static Vector3 ToAngle(this Vector3 vector3, float angle, Vector3 center, Vector3 direction)

demo

  /// <summary>
        /// 得到管线横切圆
        /// </summary>
        /// <param name="Count">段数</param>
        /// <param name="R">半径</param>
        /// <returns></returns>
        Vector3[] CircularSection(int Count, float R)
        {
            Vector3[] vector3s = new Vector3[Count];
            float angle = 360 / Count;
            Vector3 vector3 = new Vector3(R, 0, 0);
            for (int i = 0; i < Count; i++)
            {
                //根据角度得到圆的分布点
                vector3s[i] = vector3.ToAngle(angle * i, Vector3.zero, Vector3.forward);
            }
            return vector3s;
        }

6.矩阵变换

FromToMoveRotation
        /// <summary>
        /// 矩阵变换
        /// </summary>
        /// <param name="vector3"></param>
        /// <param name="location">位置</param>
        /// <param name="direction">旋转向量</param>
        /// <returns></returns>
        public static Vector3 FromToMoveRotation(this Vector3 vector3, Vector3 location, Vector3 direction)
        {
            return vector3.FromToMoveRotation(location, direction,Vector3.one);
        }
        public static Vector3 FromToMoveRotation(this Vector3 vector3, Vector3 location, Vector3 direction,Vector3 scale)

demo

     for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < circularCount; j++)
                {
                    meshPoint[(i * circularCount) + j] = circular[j].FromToMoveRotation(pipePoint[i].Location, pipePoint[i].Direction);
                }
            }

使用示例

1.消息机制

在继承了MonoBehaviourSimplify的类下可以直接调用

RegisterMsg

注册消息方法

/// <param name="msgName">注册消息的名称</param>
/// <param name="onMsgReceived">接收的方法</param>
RegisterMsg(string msgName, Action<object> onMsgReceived)

Demo

  void Awake()
   {
      RegisterMsg("测试方法", Getinfo);
   }
   void Getinfo(object data)
   {
       Debug.Log(data);
   }
SendMsg

发送消息,可以给已经注册的的方法,传参和调用

        /// <param name="msgName">注册消息的名称</param>
        /// <param name="data">传入的数据</param>
        public void SendMsg(string msgName, object data)

Demo

        void Start()
        {
            SendMsg("测试方法", "发送成功"); 
        }
UnRegisterMsg

注销消息方法

        /// <param name="msgName">注册消息的名称</param>
        /// <param name="onMsgReceived">接收的方法</param>
        public void UnRegisterMsg(string msgName, Action<object> onMsgReceived)
            
        /// <param name="msgName">注册消息的名称</param>
        public void UnRegisterMsg(string msgName)

框架有销毁GameObjct自动注销方法的机制

         void Start()
        {
            UnRegisterMsg("测试方法");
        }

[返回目录](# 框架目录)


2.运行模式

需要继承MianManagers抽象类

设置了三种进入模式

    public enum EnviromentMode
    {
        开发,
        测试,
        发布,
    }

继承后自动生成抽象方法作为进入方法,需要在面板选择一种模式

LaunchInDevelopingMode

开发模式

LaunchInTestMode

测试模式

LaunchInProductionMode

发布模式

[返回目录](# 框架目录)


3.UI框架

规定:

  1. 每个面板都有一个脚本要继承BasePanel;
  2. 面板要做成预制体放到Resources/UIPanel;
  3. 预制体名称和位置要记录到UIPanelType和UIPanelType.json里。
  4. 面板是栈的形式读取,每次只能控制一个面板
UIManager.PushPanel

public static void PushPanel(UIPanelType uIPanelType)

面板进站,并在栈顶

传入的是UIPanelType枚举

Demo

        public void buttenClick(string name)
        {
            UIPanelType uIPanelType = (UIPanelType)Enum.Parse(typeof(UIPanelType), name);
            UIManager.PushPanel(uIPanelType);
        }
UIManager.PopPanel

public static void PopPanel()

面板移除,并出栈

Demo

      public void onCloseButten()
        {
            UIManager.PopPanel();
        }

[返回目录](# 框架目录)


4.音频框架

规定:

  1. 声音要存储放到Resources/Audios
  2. 声音名称和位置要记录到AudioName和AudioNameJson.json里。
  3. 声音的名称是本身资源的名称,不能自定义
PlaySound

播放声音,可以重叠播放

Demo

        if (Input.GetKeyDown(KeyCode.A))
        {
            AudioManager.Instance.PlaySound(AudioName.soundOne);
        }
PlayMusic

播放音乐 ,只能播放一个

Demo

        if (Input.GetKeyDown(KeyCode.C))
        {
            AudioManager.Instance.PlayMusic(AudioName.soundTwo);
        }
OffSound

打开全部声音

Demo

 AudioManager.Instance.OffSound()
OnSound

关闭全部声音

Demo

 AudioManager.Instance.OnSound()
PlayMusic

播放音乐

Demo

 AudioManager.Instance.PlayMusic()
StopMusic

停止音乐

Demo

 AudioManager.Instance.StopMusic()
PauseMusic

暂停音乐

Demo

 AudioManager.Instance.PauseMusic()
ResumeMusic

继续音乐

Demo

 AudioManager.Instance.ResumeMusic()
OffMusic

打开音乐

Demo

 AudioManager.Instance.OffMusic()
OnMusic

关闭音乐

Demo

 AudioManager.Instance.OnMusic()

[返回目录](# 框架目录)


5.http访问回调封装

webGet
        /// <summary>
        /// get查询消息
        /// </summary>
        /// <param name="url"></param>
        /// <param name="getInfo">接收信息的方法</param>
        public void webGet(string url, Action<string>getInfo )

Demo

        if (Input.GetKeyDown(KeyCode.A))
        {
            string url = "http://192.168.11.106:86/hello/sever.php";
            HttpRequest.Instance.webGet(url,Getinfo);
        }
webPost
        /// <summary>
        /// post增加消息
        /// </summary>
        /// <param name="url"></param>
        /// <param name="jsonString">传入的json数据</param>
        /// <param name="getInfo">接收信息的方法</param>
        public void webPost(string url, string jsonString, Action<string> getInfo)

Demo

    void postInfo()
    {
        Dictionary<string, string> info = new Dictionary<string, string>();
        info.Add("name", "名称");
        info.Add("id", "ID");
        string JsonInfo = JsonMapper.ToJson(info);
        string url = "http://192.168.11.106:86/hello/sever.php";
        HttpRequest.Instance.webPost(url, JsonInfo, Getinfo);
    }
webPut
        /// <summary>
        /// put修改消息
        /// </summary>
        /// <param name="url"></param>
        /// <param name="jsonString"></param>
        /// <param name="getInfo">接收信息的方法</param>
        public void webPut(string url, string jsonString, Action<string> getInfo)
webDelete
        /// <summary>
        /// webDelete删除消息
        /// </summary>
        /// <param name="url"></param>
        /// <param name="getInfo">接收信息的方法</param>
        public void webDelete(string url, Action<string> getInfo)
读取图片
        /// <summary>
        /// 读取图片
        /// </summary>
        /// <param name="url"></param>
        /// <param name="getInfo">接收信息的方法</param>
        public void WebGetImg(string url, string receiveFunction)
        {
            StartCoroutine(GetRequestImg(url, receiveFunction));
        }

Demo

    void Start()
    {
        RegisterMsg("SetBackGround", SetBackGround);//注册"getinfo"方法
    }
    public void SetBackGroundImg(string Url)
    {
        HttpRequest.Instance.WebGetImg(Url, Getinfo);
    }
下载资源
        /// <summary>
        /// 下载资源
        /// </summary>
        /// <param name="url">下载地址</param>
        /// <param name="getAsset">返回资源</param>
        /// <param name="getProgree">返回进度</param>
        public void DownloadData(string url, Action<Byte[]> getAsset, Action<float> getProgree=null)

Demo

        /// <summary>
        /// 下载资源
        /// </summary>
        /// <param name="assetName"></param>
        /// <param name="DownloadUrl"></param>
        void DownloadAsset()
        {
          
            httpRequest.DownloadData(my_CurDownloadUrl+ my_CurAssetName, SaveAsset, GetProgree);
            //GetProgree(httpRequest.Progree);
        }
        /// <summary>
        /// 保存资源
        /// </summary>
        /// <param name="data"></param>
        void SaveAsset(object data)
        {
            byte[] bytes = (byte[])data;
            fileMgr.SaveAssetFile(fileMgr.PersistentPath, my_CurAssetName, bytes, bytes.Length);
            My_UpdateState = LoadState.Loaded;
            WriteVersionInfo();// 重写本地版本信息
        }
        void GetProgree(float progree)
        {
            if (my_Progree!=null)
            {
                my_Progree(progree);
            }
        }

[返回目录](# 框架目录)


6.对象池封装

规定

  1. 需要一个对象创建方法
  2. 需要一个对象重置方法,这里不是销毁,销毁后对象池的记录还在,但是对象不存在,会报空引用
  3. 需要new一个SimpleObjectPool
SimpleObjectPool

创建构造对象池

/// <param name="factoryMethod">创建实例方法</param>
/// <param name="resetMethod">对象重置时调用</param>
/// <param name="initCount">预创建的个数</param>
public SimpleObjectPool(Func<T> factoryMethod, Action<T> resetMethod = null, int initCount = 0)
SimpleObjectPool.Allocate

获取或激活对象

Demo

Pool = new SimpleObjectPool<BasePrefabs>(() => getBasePrefabs(prefabsType), RecycleBasePrefabs, 0);//BasePrefabs是对象的类型
BasePrefabs mBasePrefabs= Pool.Allocate();
SimpleObjectPool.Recycle

回收对象

Demo

Pool = new SimpleObjectPool<BasePrefabs>(() => getBasePrefabs(prefabsType), RecycleBasePrefabs, 0);
Pool.Recycle(mBasePrefabs);

[返回目录](# 框架目录)


7.预制体管理(PrefabsManager)

规定

  1. 预制体要继承BasePrefabs;
  2. 预制体要存放到Resources/Prefabs;
  3. 预制体名称和位置要记录到PrefabsType和PrefabsTypeJson;
  4. PrefabsTypeJson中预制体路径需要带“resources://”前缀
  5. UI预制体的名称和实例预制体的名称不能相同

方法一

使用前要先一个预制体的创建类,每一个预制体要new一个。

prefabsCreate = new PrefabsCreate(PrefabsType.ObjCube,false,null);
prefabsCreateUI = new PrefabsCreate(PrefabsType.UIImage,true,null);
PrefabsCreate

构造预制体创建类,用于建立预制体对象池,实例预制体,清除预制体。

     /// <summary>
     /// 构造预制体创建
     /// </summary>
     /// <param name="prefabsType">预制体类型</param>
     /// <param name="isUI">是否是UI</param>
     /// <param name="Fa">父物体</param>
     public PrefabsCreate(PrefabsType prefabsType, bool isUI, Transform Fa)
PrefabsCreate.Add

用预制体创建类创建预制体。

        /// <summary>
        /// 实例预制体
        /// </summary>
        /// <param name="prefabsVec">预制体位置字典</param>
        public void Add(Dictionary<string, Vector3> prefabsVec)
        /// <summary>
        /// 实例预制体
        /// </summary>
        /// <param name="name">预制体名称</param>
        /// <param name="vector3">预制体位置</param>
        public void Add(string name,Vector3 vector3)
PrefabsCreate.Remove

用预制体创建类清除预制体

        /// <summary>
        /// 清除预制体实例
        /// </summary>
        /// <param name="names">清除预制体名称表</param>
        public void Remove(List<string> names)
        /// <summary>
        /// 清除预制体实例
        /// </summary>
        /// <param name="name">清除预制体名称</param>
        public void Remove(string name)
        /// <summary>
        /// 清除全部预制体实例
        /// </summary>
        public void Remove()

方法二

在方法一的基础上再次封装

PrefabsInfo

预制体信息类

   public class PrefabsInfo
   {
        PrefabsType prefabsType;//预制体类型
        string prefabsName;//预制体名称
        Vector3 prefabsPos;//预制体位置
        bool isUI;//是否是UI
   }
PrefabsManager.AddPrefabs

直接创建预制体,对象池交给PrefabsManager管理

    /// <summary>
    /// 增加预制体
    /// </summary>
    /// <param name="prefabsInfo">预制体信息表</param>
    /// <param name="Fa">预制体父级</param>
   public static void AddPrefabs(List<PrefabsInfo> prefabsInfo, Transform Fa)
    /// <summary>
    /// 增加预制体
    /// </summary>
    /// <param name="prefabsInfo">预制体信息</param>
    /// <param name="Fa">预制体父级</param>
    public static void AddPrefabs(PrefabsInfo prefabsInfo, Transform Fa)
PrefabsManager.RemovePrefabs

清除预制体

  /// <summary>
  /// 清除预制体
  /// </summary>
  /// <param name="prefabsType">预制体类型</param>
  /// <param name="name">清除的预制体名称表</param>
  public static void RemovePrefabs(PrefabsType prefabsType, List<string> name)
  /// <summary>
  /// 清除预制体
  /// </summary>
  /// <param name="prefabsType">预制体类型</param>
  /// <param name="name">清除的预制体名称</param>
   public static void RemovePrefabs(PrefabsType prefabsType, string name)
   /// <summary>
   /// 清除预制体类型
   /// </summary>
   /// <param name="prefabsType">预制体类型</param>
   public static void RemovePrefabs(PrefabsType prefabsType)

demo

方法一demo

  1. 预制体创建

    • 创建模型实例
        PrefabsCreate prefabsCreate;
        prefabsCreate = new PrefabsCreate(PrefabsType.ObjCube,false);
    
    • 创建UI实例
        PrefabsCreate prefabsCreateUI;
        prefabsCreateUI = new PrefabsCreate(PrefabsType.UIImage,true);
    
  2. 预制体实例增加

  Dictionary<string, Vector3> objPosDict = new Dictionary<string, Vector3>();  
        objPosDict.AddData("One", new Vector3(0, 0, 0));
        objPosDict.AddData("Two", new Vector3(1, 0, 0));
        objPosDict.AddData("Three", new Vector3(0, 1, 0));
        prefabsCreate.Add(objPosDict);
  1. 预制体实例清除
//清除部分
   List<string> names = new List<string>();
        names.Add("One");
        prefabsCreate.Remove(names);
//清除全部
    prefabsCreate.Remove();

方法二demo

这里创建了一个预制体信息类的对象池,目的是不用每次都new PrefabsInfo;(可以不用)

prefabsInfos = new SimpleObjectPool<PrefabsInfo>(() => new PrefabsInfo(), mDestroy, 0);
    void mDestroy(PrefabsInfo obj)
    {
        obj = null;
    }
  1. 增加预制体
   void add(PrefabsType prefabsType, string name, Vector3 vector3)
    {
       //预制体信息的对象池可以不用
        PrefabsInfo prefabsInfo = prefabsInfos.Allocate();
        prefabsInfo.PrefabsType = prefabsType;
        prefabsInfo.PrefabsName = name;
        prefabsInfo.PrefabsPos = vector3;
        prefabsInfo.IsUI = false;
        PrefabsManager.AddPrefabs(prefabsInfo, fa.transform);
        prefabsInfos.Recycle(prefabsInfo);
    }
  1. 清除预制体
    void removePre(PrefabsType prefabsType, string name)
    {
        PrefabsManager.RemovePrefabs(prefabsType, name);
    }

[返回目录](# 框架目录)

8.Socket封装

规定:

  1. 要定义接收方法接收返回信息;
  2. 接收方法要用RegisterMsg注册。

1.webSocket

通过"ws://"地址连接

CreateWebSockets

创建Socket连接

        /// <summary>
        /// 创建Socket连接
        /// </summary>
        /// <param name="RegisterMsg">注册方法</param>
        /// <param name="URL">连接地址</param>
        public void CreateWebSockets(string RegisterMsg, string URL)

Demo

    void CreateSocket()
    {
        RegisterMsg("getinfo", getInfo);//注册"getinfo"方法
        string ULR = "ws://50.32.15.125:8888/camera/";
        WebSocketsRequest.Instance.CreateWebSockets("getinfo", ULR);
    }

2. SocketClient(客户端)

Socket客户端,通过ip和端口连接

CreateSocketClient

创建客户端连接

        /// <summary>
        /// 创建客户端连接
        /// </summary>
        /// <param name="Msg">注册方法</param>
        /// <param name="IP">ip</param>
        /// <param name="Port">端口</param>
        public void CreateSocketClient(string Msg, string IP, int Port)

Demo

    void CreateClientSocket()
    {
        RegisterMsg("getinfo", getInfo);//注册"getinfo"方法
        int port = 6001;
        string ip = "192.168.11.106";
        WebSocketsRequest.Instance.CreateSocketClient("getinfo", ip, port);
    }
SocketClientSend

客户端消息发送

        /// <summary>
        /// 客户端消息发送
        /// </summary>
        /// <param name="Msg">注册方法</param>
        /// <param name="Info">发送消息string</param>
        public void SocketClientSend(string Msg, string Info)

Demo

     public void ClientSocketSend()
    {
        WebSocketsRequest.Instance.SocketClientSend("getinfo", input.text);
    }

3.SocketServe(服务端)

Socket服务端,通过ip和端口连接

CreateSocketServer

创建服务器服务

        /// <summary>
        ///  创建服务器端连接
        /// </summary>
        /// <param name="Msg">注册方法</param>
        /// <param name="Port">端口</param>
        public void CreateSocketServer(string Msg, int Port)
            
        /// <summary>
        /// 创建服务器端连接
        /// </summary>
        /// <param name="Msg">注册方法</param>
        /// <param name="IP">ip</param>
        /// <param name="Port">端口</param>
        public void CreateSocketServer(string Msg, string IP, int Port)

Demo

    void CreateServerSocket()
    {
        RegisterMsg("getinfo", getInfo);//注册"getinfo"方法
        int port = 6001;
        WebSocketsRequest.Instance.CreateSocketServer("getinfo", port);
    }

    void CreateServerSocket()
    {
        RegisterMsg("getinfo", getInfo);//注册"getinfo"方法
        int port = 6001;
        string IP="127.0.0.1";
        WebSocketsRequest.Instance.CreateSocketServer("getinfo",IP, port);
    }
SocketServerSend

服务器发布消息

        /// <summary>
        /// 服务器发布消息
        /// </summary>
        /// <param name="Msg"></param>
        /// <param name="Info"></param>
        public void SocketServerSend(string Msg, string Info)

Demo

    void ServerSend()
    {
        string info="hello";
        WebSocketsRequest.Instance.SocketServerSend("getinfo",info);
    }

5. 断开Sockets连接方法

RemoveWebSockets

断开Socket连接

        /// <summary>
        /// 断开Socket连接
        /// </summary>
        /// <param name="RegisterMsg">注册方法</param>
        public void RemoveSockets(string RegisterMsg)

Demo

    void RemoveSockets()
    {
        WebSocketsRequest.Instance.RemoveSockets("getinfo");
        UnRegisterMsg("getinfo");//注销"getinfo"方法
    }

[返回目录](# 框架目录)

9.web通信使用示例(浏览器脚本交互)

规定

  1. unity Call web的方法需要在Plugings/CallWebJs .jslib中声明;
  2. 调用CallWebJs里的方法要用[DllImport(“__Internal”)]定义属性

技巧

​ 应为unity官方新的浏览器脚本交互方案,不能直接使用Application.ExternalCall() ,调取webJS里面的方法。新的方案会将原本webJavaScript 里面的代码直接写到以 .jslib 扩展名的文件里,会造成web不能直接修改的问题。解决该方法,是在CallWebJs .jslib里的调用方法下,重新调用webJavaScript下的方法如下。

CallWebJs .jslib

//unity调用的方法
Myinfo: function(str) {
    
    
       Info(Pointer_stringify(str));
    },
        

webJavaScript

		function Info(oo)//这里是CallWebJs .jslib调用的方法
			{
    
    
				alert(oo);
			}
			function call()
			{
    
    
                //web通信unity
				gameInstance.SendMessage("GameManager", "Call", "哈哈哈");
			}

unity

    [DllImport("__Internal")]
    private static extern void Myinfo(string str);
    void Call(string info)//webJavaScript调用的方法
    {
        //unity通信web
        Myinfo(info);
    }

这样调用方法重新开放给webJavaScript。

web全屏方法

		<style type="text/css">
			body {
    
    
				overflow: scroll;
				overflow-x: hidden;
				overflow-y: hidden;
			} //滚动条隐藏
		</style>
		<script>
		//调用方法
        //function call() {gameInstance.SendMessage("GameManager", "Call", "哈哈哈");}
		</script>
		<script type="text/javascript">
			function ChangeCanvas() {
    
    
				document.getElementById("gameContainer").style.width = window.innerWidth + "px";
				document.getElementById("gameContainer").style.height = window.innerHeight + "px";
				document.getElementById("#canvas").style.width = window.innerWidth + "px";
				document.getElementById("#canvas").style.height = window.innerHeight + "px";
			} //窗口自适应
		</script>
	</head>
	<body onResize="ChangeCanvas()">
		<div class="webgl-content" style="position:absolute;width: 100%; height: 100%;z-index:1" id="gameContainer"></div>
		<div style="position:absolute;z-index:2">
            //调用按钮
			//<button type="button" οnclick=call()>call</button>
		</div>
	</body>
</html>

2019后网页全屏方法

<!DOCTYPE html>
<html lang="en-us">
  <head>
   <meta charset="utf-8">
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>Unity WebGL Player | NJMap</title>
   <link rel="shortcut icon" href="TemplateData/favicon.ico">
   <link rel="stylesheet" href="TemplateData/style.css">
   <script src="TemplateData/UnityProgress.js"></script>
   <script src="Build/UnityLoader.js"></script>
   <script>
     var unityInstance = UnityLoader.instantiate("unityContainer", "Build/NJMap.json", {
      
      onProgress: UnityProgress});
   </script>
    <style type="text/css">
	body {
      
      
			overflow: scroll;
			overflow-x: hidden;
			overflow-y: hidden;
			} //滚动条隐藏
	</style>
	<script type="text/javascript">
	function ChangeCanvas() {
      
      
	document.getElementById("unityContainer").style.width = window.innerWidth + "px";
	document.getElementById("unityContainer").style.height = window.innerHeight + "px";
	document.getElementById("#canvas").style.width = window.innerWidth + "px";
	document.getElementById("#canvas").style.height = window.innerHeight + "px";
			} //窗口自适应
	</script>
  </head>
  	<body onResize="ChangeCanvas()">
		<div class="webgl-content" style="position:absolute;width: 100%; height: 100%;z-index:1" id="unityContainer"></div>
		<div style="position:absolute;z-index:2">
		</div>
	</body>
</html>

[返回目录](# 框架目录)

10.资源管理器

规定

  1. 使用前需要new一个ResLoader

同步加载资产

支持资源

  • AssetBundle
  • prefab
  • 音频格式(.mp3 .wav)
        /// <summary>
        /// 同步加载资产
        /// </summary>
        /// <typeparam name="T">资产类型</typeparam>
        /// <param name="assetName">资产名称</param>
        /// <param name="assetPath">资产路径</param>
        /// <returns></returns>
        public T LoadAssetSync<T>(string assetName, string assetPath) 

demo

ResLoader resLoader = new ResLoader();//资源管理器
GameObject game = Instantiate(resLoader.LoadAssetSync<GameObject>("Sphere", "resources://Sphere"));

同步加载AssetBundle资产

支持资源

  • AssetBundle
        /// <summary>
        /// 同步加载assetBundle资产
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="assetBundleName">assetBundle名称</param>
        /// <param name="assetName">资源名称</param>
        /// <param name="assetPath">assetBundle路径</param>
        /// <returns></returns>
        public T LoadAssetSync<T>(string assetBundleName, string assetName, string assetBundlePath)

demo

ResLoader resLoader = new ResLoader();//资源管理器
    /// <param name="abName">AB包名称</param>
    /// <param name="AssetName">资源名称</param>
    void SyncLoadABAsset(string abName,string AssetName)
    {
        var mianAB = resLoader.LoadAssetSync<GameObject>(abName, AssetName, Application.streamingAssetsPath + "/" + abName);
        GameObject game = Instantiate(mianAB);
    }

异步加载资产

支持资源

  • AssetBundle
  • prefab
  • 音频格式(.mp3 .wav)
        /// <summary>
        /// 异步加载资产
        /// </summary>
        /// <typeparam name="T">资产类型</typeparam>
        /// <param name="assetName">资产名称</param>
        /// <param name="assetPath">资产路径</param>
        /// <param name="onLoaded">资产名称</param>
        public void LoadAssetAsync<T>(string assetName, string assetPath, Action<T> onLoaded) 
        {
            DoLoadAssetAsync<T>(assetName, assetPath, onLoaded);
        }

demo

ResLoader resLoader = new ResLoader();//资源管理器           
 var coinClip = resLoader.LoadAssetSync<AudioClip>("Firefly", "resources://Audios/Firefly");
            mianAudioSound.clip = coinClip;
            mianAudioSound.loop = loop;
            mianAudioSound.Play();

异步加载assetBundle资产

支持资源

  • AssetBundle
        /// <summary>
        /// 异步加载assetBundle资产
        /// </summary>
        /// <typeparam name="T">资产类型</typeparam>
        /// <param name="assetBundleName">assetBundle名称</param>
        /// <param name="assetName">资产名称</param>
        /// <param name="assetBundlePath">assetBundle路径</param>
        /// <param name="onLoaded">资产名称</param>
        public void LoadAssetAsync<T>(string assetBundleName, string assetName, string assetBundlePath, Action<T> onLoaded)
        {
            DoLoadAssetAsync<T>(assetName, assetBundlePath, onLoaded, assetBundleName);
        }

demo

AsyncLoadABAsset("gameobject", "Game");   
ResLoader resLoader = new ResLoader();//资源管理器
void AsyncLoadABAsset(string abName, string AssetName)
    {
        resLoader.LoadAssetAsync<GameObject>(abName, AssetName, Application.streamingAssetsPath + "/" + abName, ab => { GameObject game = Instantiate(ab); });
    }

清理资产

清理指定资产

        /// <summary>
        /// 清理资产
        /// </summary>
        /// <param name="AssetName">资产名称</param>
        public void Release(string AssetName)

销毁所有资产

        /// <summary>
        /// 销毁所有资产
        /// </summary>
        public void ReleaseAll()

销毁所有记录

        /// <summary>
        /// 销毁所有记录
        /// </summary>
        public void ReleaseAllRecord()

11资源热更新

热更新管理器,是单例模式。集成了assetBundle和一般资源的版本管理,版本判断,资源下载和assetBundle加载,进程描述,进度返回(只返回下载进度,不支持加载进度)。

FromAssetBundle

热更新AssetBundle文件

       /// <summary>
       /// 更新AssetBundle
       /// </summary>
       /// <param name="assetName">资源名称</param>
       /// <param name="version">资源版本</param>
       /// <param name="downloadUrl">完整下载地址</param>
       /// <param name="asset">返回资源方法</param>
       /// <param name="describe">返回描述方法</param>
       /// <param name="progree">返回进度方法</param>
       public void FromAssetBundle(string assetName, string version, string downloadUrl, Action<AssetBundle> asset, Action<String> describe=null, Action<float>progree=null)

demo

    string assetUrl = "http://192.168.127.000:1011/U3DModel/";
    string assetName = "ZGYKDX.ab";
    string versionUrl = "http://192.168.11.106:86/hello/Version.php?action=readVersion&Scene=";    
void LoadMode(string data)
    {
        Debug.Log(data);
        JsonData jsonData = JsonMapper.ToObject(data);
        string version = jsonData["version"].ToString();
        updateManagers.FromAssetBundle(assetName, version, assetUrl+assetName, ToLoadAsset, SetUpdateDescribe, SetUpdateProgree);
    }
    void SetUpdateDescribe(object data)
    {
        textDescribe.text = (string)data;
    }
    void SetUpdateProgree(float data)
    {
        textProgree.text = data.ToString();
    }

FromFile

热更新文件

        /// <summary>
        /// 更新文件
        /// </summary>
        /// <param name="assetName">资源名称</param>
        /// <param name="version">资源版本</param>
        /// <param name="downloadUrl">完整下载地址</param>
        /// <param name="asset">返回资源方法</param>
        /// <param name="describe">返回描述方法</param>
        /// <param name="progree">返回进度方法</param>
        public void FromFile(string assetName, string version, string downloadUrl, Action asset, Action<String> describe = null, Action<float> progree = null)

demo

    string assetUrl = "http://www.192.168.127.000:1011/U3DModel/";
    string assetName = "testAsset.txt";
    string versionUrl = "http://192.168.11.106:86/hello/Version.php?action=readVersion&Scene=";   
void LoadAsset()
    {
        updateManagers.FromFile(assetName, "0.1", assetUrl+assetName, openAsset, SetUpdateDescribe, SetUpdateProgree);
    }
    void openAsset()
    {
        
            Debug.Log(fileMgr.PersistentPath);
            Application.OpenURL(fileMgr.PersistentPath + "testAsset.txt");
      
      
    }

    void SetUpdateDescribe(object data)
    {
        textDescribe.text = (string)data;
    }
    void SetUpdateProgree(float data)
    {
        textProgree.text = data.ToString();
    }

[返回目录](# 框架目录)

猜你喜欢

转载自blog.csdn.net/dxs1990/article/details/124941893