本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程。增加了Asset Bundle+ILRuntime热更新技术流程。

效果展示

1.通过框架中的BasePanel.cs脚本进行UI事件的注册。
BasePanel.cs的脚本将寻找UI控件并完成事件的注册,使得注册事件变得异常简单。

       /// <summary>/// 找到子对象的对应控件/// </summary>/// <typeparam name="T"></typeparam>private void FindChildrenControl<T>() where T : UIBehaviour{T[] controls = this.GetComponentsInChildren<T>();for (int i = 0; i < controls.Length; ++i){string objName = controls[i].gameObject.name;Debug.Log("面板获取:"+objName);if (controlDic.ContainsKey(objName))controlDic[objName].Add(controls[i]);elsecontrolDic.Add(objName, new List<UIBehaviour>() { controls[i] });//如果是按钮控件if (controls[i] is Button){(controls[i] as Button).onClick.AddListener(() =>{OnClick(objName);});}//如果是单选框或者多选框else if (controls[i] is Toggle){(controls[i] as Toggle).onValueChanged.AddListener((value) =>{OnValueChanged(objName, value);});}}}

要实现自己的事件逻辑,只需要进行重写以下方法。

      /// <summary>/// 显示自己/// </summary>public virtual void ShowMe(){}/// <summary>/// 隐藏自己/// </summary>public virtual void HideMe(){}public virtual void OnClick(string btnName){}protected virtual void OnValueChanged(string toggleName, bool value){}

完整代码如下

 /// <summary>/// 面板基类 /// 帮助我门通过代码快速的找到所有的子控件/// 方便我们在子类中处理逻辑 /// 节约找控件的工作量/// </summary>public class BasePanel : MonoBehaviour{//通过里式转换原则 来存储所有的控件private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();// Use this for initializationpublic virtual void Awake(){FindChildrenControl<Button>();FindChildrenControl<Image>();FindChildrenControl<Text>();FindChildrenControl<Toggle>();FindChildrenControl<Slider>();FindChildrenControl<ScrollRect>();FindChildrenControl<InputField>();}/// <summary>/// 显示自己/// </summary>public virtual void ShowMe(){}/// <summary>/// 隐藏自己/// </summary>public virtual void HideMe(){}public virtual void OnClick(string btnName){}protected virtual void OnValueChanged(string toggleName, bool value){}public static Transform FindTheChild(GameObject goParent, string childName){Transform searchTrans = goParent.transform.Find(childName);if (searchTrans == null){foreach (Transform trans in goParent.transform){searchTrans = FindTheChild(trans.gameObject, childName);if (searchTrans != null){return searchTrans;}}}return searchTrans;}/// <summary>/// 得到对应名字的对应控件脚本/// </summary>/// <typeparam name="T"></typeparam>/// <param name="controlName"></param>/// <returns></returns>protected T GetControl<T>(string controlName) where T : UIBehaviour{if (controlDic.ContainsKey(controlName)){for (int i = 0; i < controlDic[controlName].Count; ++i){if (controlDic[controlName][i] is T)Debug.Log(controlDic);return controlDic[controlName][i] as T;}}return null;}/// <summary>/// 找到子对象的对应控件/// </summary>/// <typeparam name="T"></typeparam>private void FindChildrenControl<T>() where T : UIBehaviour{T[] controls = this.GetComponentsInChildren<T>();for (int i = 0; i < controls.Length; ++i){string objName = controls[i].gameObject.name;Debug.Log("面板获取:"+objName);if (controlDic.ContainsKey(objName))controlDic[objName].Add(controls[i]);elsecontrolDic.Add(objName, new List<UIBehaviour>() { controls[i] });//如果是按钮控件if (controls[i] is Button){(controls[i] as Button).onClick.AddListener(() =>{OnClick(objName);});}//如果是单选框或者多选框else if (controls[i] is Toggle){(controls[i] as Toggle).onValueChanged.AddListener((value) =>{OnValueChanged(objName, value);});}}}}

业务应用:将MainBaseUI.cs继承BasePanel.cs脚本,给按钮BtnCloseBtnResetBtnSet注册事件,按钮的命名一定要和脚本中的名称对应上,否则注册不上。

MainBaseUI.cs重写BasePanel.cs基类的OnClick事件

    public override void OnClick(string btnName){if (btnName== "BtnClose"){Debug.Log("关闭");}else if (btnName == "BtnReset"){Debug.Log("重置");}else if (btnName == "BtnSet"){animator.SetBool("isout", !animator.GetBool("isout"));}}

ToggleUI注册事件设置标注隐藏显示

    public override void OnValueChanged(string toggleName, bool value){if (toggleName == "MemoToggle"){SwitchOperation.Instance.hideInfo(value);}}

MainBaseUI.cs注册事件完整脚本代码

public class MainBaseUI : BasePanel
{public static MainBaseUI Instance;private Animator animator;public override void Awake(){Instance = this;base.Awake();}public void InitData() {Debug.Log("初始化信息!");animator = this.GetComponent<Animator>();}[FormerlySerializedAs("taskPrefabs")][Tooltip("Prefab of the  object. Prefab must have a Info component. May be an empty game object or a full avatar.")]public GameObject taskPrefabs;public Transform taskParentTransform;// Start is called before the first frame updatevoid Start(){}public override void OnClick(string btnName){if (btnName== "BtnClose"){Debug.Log("关闭");}else if (btnName == "BtnReset"){Debug.Log("重置");}else if (btnName == "BtnSet"){animator.SetBool("isout", !animator.GetBool("isout"));}}public override void OnValueChanged(string toggleName, bool value){if (toggleName == "MemoToggle"){SwitchOperation.Instance.hideInfo(value);}}// Update is called once per framevoid Update(){}}

2.通过框架中的ResMgr.cs脚本进行开关预制体初始化。
MyGameManager.cs脚本中将预制体的路径传入即可

ResMgr.GetInstance().Load<GameObject>("Prefabs/Switch");

由于现在是动态加载预制体,所以要控制一下出现的位置(parentObj)以及进行加载后预制体命名,完整代码如下

public class MyGameManager : MonoBehaviour
{public GameObject parentObj;// Start is called before the first frame updatevoid Start(){var tempDD = ResMgr.GetInstance().Load<GameObject>("Prefabs/Switch");tempDD.transform.SetParent(parentObj.transform);tempDD.name = "Switch";}
}

下一篇将物体自由观察通过Cinemachine进行实现。

专栏:Unity 3D模型展示,Unity程序基础小框架

关于框架资源包,评论处留下你的邮箱地址。

Unity 3D模型展示框架篇之框架运用相关推荐

  1. Unity 3D模型展示框架篇之项目整理

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 1. ...

  2. Unity 3D模型展示框架篇之自由观察(Cinemachine)

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...

  3. Unity 3D模型展示框架篇之ILRuntime快速入门

    系列文章目录 Unity 3D模型展示框架篇之项目整理 Unity 3D模型展示框架篇之框架运用 Unity 3D模型展示框架篇之自由观察(Cinemachine) Unity 3D模型展示框架篇之资 ...

  4. Unity 3D模型展示之webGL平台展现

    在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...

  5. Unity 3D模型展示之UI布局

    整体布局情况 导入UI资源并统一将Texture Type设置为Sprite(2D and UI) 1.标题 将Text中的文本设置为'Unity 3D物体展示实例'. 添加Shadow与Outlin ...

  6. unity 3D模型展示旋转缩放

    目标: 在UI层上 自由观察3D 模型,实现鼠标控制模型的旋转,缩放&& 触摸屏手势控制模型的旋转缩放控制: 这里仅将控制代码挂载到相机上,通过对相机的控制来观察模型. 基本上为最小单 ...

  7. Unity 3D模型展示之模型透明效果

    效果展示 1.透明效果实现思路 简单点就是将模型的材质替换成透明材质.需要注意:1.指定范围内的模型进行透明化.2.一个模型会有多个材质,都需要进行透明化.3.还能将模型的材质恢复最初的效果.4.选中 ...

  8. Unity 3D模型展示之自由观察模型

    效果展示 进行调整将灯光放到Main Camera下,旋转的时候光就一直打在这面. 1.观察模型脚本 public class Smooth3DCamera : MonoBehaviour {publ ...

  9. Unity 3D模型展示之控制标注

    效果展示 标注隐藏显示 脚本SwitchOperation中增加控制隐藏显示的方法.在初始化数据时需要给用到的switchPart.info进行赋值. public void hideInfo(boo ...

最新文章

  1. 图片怎么等比缩放_图片300kb,50kb压缩【方法笔记】
  2. 重定向index.php,使用htaccess将all重定向到index.php
  3. HDU 5119 Happy Matt Friends(DP || 高斯消元)
  4. 一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果
  5. java poi excel 生成表格的工具封装
  6. 一图胜千言,8 张图理解 Java
  7. docker必须要sudo,但是sudo的话,又获得不了环境变量怎么办?
  8. mysql注入如何读取本地文件_如何通过SQL注入获取服务器本地文件
  9. TeeChart控件
  10. APK应用程序的解包、修改、编辑、打包及应用(一)
  11. python迅雷下载器_简单的迅雷VIP账号获取器(Python)
  12. 光纤交换机 和 SAN交换机 概念
  13. 机器学习基础 集成学习进阶(XGBoost+LightGBM)
  14. 计算机技术服务的增值税税率,咨询系统集成技术服务税率
  15. SAP-MM 常见移动类型
  16. 如何做好互联网广告销售
  17. Python问题:NotImplementedError: The confidence keyword argument is only available if OpenCV is install
  18. mpvue设置每个页面的标题,网上找的暴漏config对象的方法已经不能使用
  19. 计算几何03_三次参数样条曲线与Cardinal曲线
  20. 2019.8.22 1.属性

热门文章

  1. 如何去除网页噪声提取数据(02) —— 汽车之家(字体反爬)
  2. 如何快速搜索电脑文件
  3. 让你的爱宠不止于你的爱--宠物领养(寄养)系统
  4. 学生管理系统(添加、查看、删除、修改学生信息)
  5. crash工具使用方法
  6. python 框架 scrapy_python之框架篇(scrapy)
  7. 整数拆分的两种解法(已完成)
  8. ArrayList的扩容机制
  9. 如何和测试团队做复盘?
  10. 08 Git中本地工作与远程仓库的同步