Unity 3D模型展示框架篇之框架运用
本项目将整合之前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
脚本,给按钮BtnClose
、BtnReset
、BtnSet
注册事件,按钮的命名一定要和脚本中的名称对应上,否则注册不上。
在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"));}}
Toggle
UI注册事件设置标注隐藏显示
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模型展示框架篇之框架运用相关推荐
- Unity 3D模型展示框架篇之项目整理
本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 1. ...
- Unity 3D模型展示框架篇之自由观察(Cinemachine)
本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...
- Unity 3D模型展示框架篇之ILRuntime快速入门
系列文章目录 Unity 3D模型展示框架篇之项目整理 Unity 3D模型展示框架篇之框架运用 Unity 3D模型展示框架篇之自由观察(Cinemachine) Unity 3D模型展示框架篇之资 ...
- Unity 3D模型展示之webGL平台展现
在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...
- Unity 3D模型展示之UI布局
整体布局情况 导入UI资源并统一将Texture Type设置为Sprite(2D and UI) 1.标题 将Text中的文本设置为'Unity 3D物体展示实例'. 添加Shadow与Outlin ...
- unity 3D模型展示旋转缩放
目标: 在UI层上 自由观察3D 模型,实现鼠标控制模型的旋转,缩放&& 触摸屏手势控制模型的旋转缩放控制: 这里仅将控制代码挂载到相机上,通过对相机的控制来观察模型. 基本上为最小单 ...
- Unity 3D模型展示之模型透明效果
效果展示 1.透明效果实现思路 简单点就是将模型的材质替换成透明材质.需要注意:1.指定范围内的模型进行透明化.2.一个模型会有多个材质,都需要进行透明化.3.还能将模型的材质恢复最初的效果.4.选中 ...
- Unity 3D模型展示之自由观察模型
效果展示 进行调整将灯光放到Main Camera下,旋转的时候光就一直打在这面. 1.观察模型脚本 public class Smooth3DCamera : MonoBehaviour {publ ...
- Unity 3D模型展示之控制标注
效果展示 标注隐藏显示 脚本SwitchOperation中增加控制隐藏显示的方法.在初始化数据时需要给用到的switchPart.info进行赋值. public void hideInfo(boo ...
最新文章
- 图片怎么等比缩放_图片300kb,50kb压缩【方法笔记】
- 重定向index.php,使用htaccess将all重定向到index.php
- HDU 5119 Happy Matt Friends(DP || 高斯消元)
- 一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果
- java poi excel 生成表格的工具封装
- 一图胜千言,8 张图理解 Java
- docker必须要sudo,但是sudo的话,又获得不了环境变量怎么办?
- mysql注入如何读取本地文件_如何通过SQL注入获取服务器本地文件
- TeeChart控件
- APK应用程序的解包、修改、编辑、打包及应用(一)
- python迅雷下载器_简单的迅雷VIP账号获取器(Python)
- 光纤交换机 和 SAN交换机 概念
- 机器学习基础 集成学习进阶(XGBoost+LightGBM)
- 计算机技术服务的增值税税率,咨询系统集成技术服务税率
- SAP-MM 常见移动类型
- 如何做好互联网广告销售
- Python问题:NotImplementedError: The confidence keyword argument is only available if OpenCV is install
- mpvue设置每个页面的标题,网上找的暴漏config对象的方法已经不能使用
- 计算几何03_三次参数样条曲线与Cardinal曲线
- 2019.8.22 1.属性