简单的UI框架 | 五、开发BasePanel面板基类和控制UI面板Prefab的实例化创建和管理

简单的UI框架

开发BasePanel面板基类和控制UI面板Prefab的实例化创建和管理




一、BasePanel基类

每个面板都有共有的功能,所以说给每个面板一个共有的基类BasePanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BasePanel : MonoBehaviour
{

}

让所有的面板都基础BasePanel这样就可以再UIManager中管理。
这里BasePanel需要继承与MonoBehaviour,因为他要挂载到我们的场景对象上。我们先新建立一个空的BasePanel脚本,后续再对功能进行完善。

接下来我们对每个UI面板进行操作。
我们只需要在每个UI面板下建立一个脚本,脚本继承BasePanel即可。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TextPanel : BasePanel
{

}

接下来我们对UI面板进行控制。

二、控制UI面板Prefab的实例化创建和管理

回到我们的UIManager,我们需要在这里管理我们的UI面板。
我们在创建一个字典,用来保存我们所以实例化的面板。

private Dictionary<UIType, BasePanel> panelDict;//保存所以实例化面板的游戏物体身上的BasePanel组件

Key当然就是这个面板的UITypeValue可以直接保存这个游戏物体,同样也可以保存这个游戏物体身上的组件。这里我直接保存了BasePanel组件。

我们创建一个方法用来得到实例化的面板。

 public BasePanel GetPanel(UIType panelType)
    {

    }

首先我们要检查这个字典里有没有这个面板,如果没有我们创建这个面板,如果有直接返回这个面板。

    public BasePanel GetPanel(UIType panelType)
    {
        if (panelDict == null)
        {
            panelDict = new Dictionary<UIType, BasePanel>();
        }

        BasePanel panel;
        panelDict.TryGetValue(panelType, out panel)}

我们怎么得到这个面板,分两步:
1、定义一个要得到的类型。
2、调用字典的TryGetValue方法,把Key传递过去。
接下来我们判断一下这个panel有没有得到。

    public BasePanel GetPanel(UIType panelType)
    {
        if (panelDict == null)
        {
            panelDict = new Dictionary<UIType, BasePanel>();
        }

        BasePanel panel;
        panelDict.TryGetValue(panelType, out panel);

        if (panel == null)
        {
            //如果找不到,那么就找这个面板的Prefab的路径,然后去根据Prefab去实例化面板
            string path;
            panelPathDict.TryGetValue(panelType, out path);
            GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;
            instPanel.transform.SetParent(canvasTransform);
            panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
            return instPanel.GetComponent<BasePanel>();
        }
        else
        {
            return panel;
        }
    }

如果为空,说明我们从来没有实例化过这个panelType的面板,我们就要根据

private Dictionary<UIType, string> panelPathDict;//存储所有的面板Prefab的路径

这个字典取到Prefab的路径来实例化他。
这里我们得到路径,然后去加载他。
因为我们的面板都放在了Resource文件下的路径,所以我们可以直接Load加载。加载之后就可以直接实例化他。这里需要强制转型成GameObject类型,这里就用到了之前在枚举的时候不能用到的as方法。

GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;

我创建出来面板后,我么应该把面板放在我们的画布Canvas下面。
所以我们需要得到画布。

    private Transform canvasTransform;
    private Transform CanvasTransform
    {
        get
        {
            if (canvasTransform == null)
            {
                canvasTransform = GameObject.Find("Canvas").transform;
            }
            return canvasTransform;
        }
    }

我们可以通过构造方法的得到,也可以在使用的时候得到,这里我选择了使用的时候得到,定义一个Get方法取得。
这里我们用到了GameObject中的Find方法,因为目前我们的场景中只有一个画布,所以可以直接通过名字查找,同样也可以通过路径去查找。
为什么我们取得画布的Transform类型呢?因为我们要把新实例化的面板放在画布下面,通过Transform组件设置一个父子等级关系。
接下来回到GetPanel方法中。
接下来我们设置父子等级关系,把实例化的面板放在画布的下面。

 instPanel.transform.SetParent(canvasTransform);

SetParent方法有两个参数,第一个是要设置的父类,第二个是是否保持他在世界坐标轴的位置。这里我们是不需要保持的,因为Canvas一般是由一定的缩放比例的,把外界实例化的面板放在Canvas下面,会导致Canvas的缩放比例变得不正常,所以我们第二个参数可以设置false或者不加。
设置好父类我们就可以直接把实例化面板放在字典中,使用Add方法即可。

总结

我们建立好了面板的基类脚本BasePanel,方便以后我们对面板公共功能的设置。
同时我们也设置好了控制UI面板的功能。

<think>嗯,用户之前问过C#的学习路径,现在又提到“基于Unity”,可能是在想如何将C#应用到Unity游戏开发中。需要明确用户的具体需求,是想了解Unity的基础知识,还是想了解如何结合C#进行开发,或者更深入的学习路径? 首先,用户可能已经掌握了C#的基础,现在想进一步学习Unity。考虑到Unity使用C#作为主要脚本语言,可能需要强调C#Unity中的实际应用,比如游戏对象控制、物理引擎、协程等。 用户可能对Unity的模块结构感兴趣,比如核心模块、脚本编程、图形渲染、物理系统、UI、动画、音效、跨平台发布等。需要分模块结构化呈现,帮助用户建立系统化的学习框架。 还要注意用户可能的实际应用场景,比如独立游戏开发、VR/AR应用,或者是移动端游戏。因此,在介绍各个模块时,可以给出相应的应用示例,如移动端优化技巧、Shader编写等。 另外,用户之前的学习建议中提到了实践项目,所以这里也应该强调项目实战的重要性,比如2D/3D小游戏、网络功能实现等。同时,推荐资源部分要包括官方教程、社区论坛实用工具,帮助用户找到进一步学习的途径。 需要检查是否有遗漏的重要模块,比如Unity的输入系统、粒子系统、导航系统等,确保思维导图全面覆盖Unity的关键知识点。最后,提醒用户学习路线,从基础到高级,逐步深入,保持结构清晰,便于用户理解应用。</think>以下是基于Unity引擎开发的知识体系思维导图(分模块结构化呈现): ```plaintext Unity开发核心框架 ├── 1. 引擎基础 │ ├── 编辑器界面 │ │ ├── Scene/Game视图 │ │ ├── Hierarchy面板 │ │ └── Inspector属性调试 │ ├── 坐标系系统 │ │ ├── 世界坐标系 │ │ └── 局部坐标系 │ └── 预制体系统 │ ├── Prefab创建 │ └── 实例化机制 │ ├── 2. C#脚本编程 │ ├── MonoBehaviour基类 │ │ ├── Start/Update生命周期 │ │ └── 常用方法(Instantiate, Destroy) │ ├── 组件通信 │ │ ├── GetComponent │ │ ├── SendMessage │ │ └── 事件系统 │ └── 协程与异步 │ ├── IEnumerator │ └── yield指令 │ ├── 3. 图形渲染 │ ├── 材质系统 │ │ ├── Standard Shader │ │ └── 自定义Shader编程 │ ├── 光照体系 │ │ ├── 光源类型(点光/聚光/方向光) │ │ └── Lightmap烘焙 │ └── 粒子系统 │ ├── 基础粒子控制 │ └── VFX Graph │ ├── 4. 物理系统 │ ├── 刚体组件(Rigidbody) │ │ ├── 物理属性(质量/阻力) │ │ └── 碰撞检测模式 │ ├── 碰撞体系 │ │ ├── Collider类型 │ │ └── OnCollisionEnter事件 │ └── 关节系统 │ ├── Hinge Joint │ └── Character Controller │ ├── 5. UI系统 │ ├── Canvas体系 │ │ ├── 渲染模式(Screen/World) │ │ └── 锚点系统 │ ├── 基础控件 │ │ ├── Image/Text │ │ └── Button交互 │ └── UI动画 │ ├── DoTween插件 │ └── Animator控制 │ ├── 6. 动画系统 │ ├── Animator控制器 │ │ ├── 状态机设计 │ │ └── 混合树使用 │ ├── 骨骼动画 │ │ ├── 人形动画重定向 │ │ └── Avatar系统 │ └── Timeline │ ├── 过场动画编排 │ └── 动画轨道控制 │ ├── 7. 数据管理 │ ├── 本地存储 │ │ ├── PlayerPrefs │ │ └── JSON序列化 │ ├── ScriptableObject │ │ ├── 数据容器创建 │ │ └── 配置系统应用 │ └── 场景管理 │ ├── 场景加载 │ └── DontDestroyOnLoad │ └── 8. 跨平台发布 ├── 构建设置 │ ├── 平台切换(PC/移动/主机) │ └── 分辨率适配 ├── 优化策略 │ ├── 批处理优化 │ └── 内存管理 └── 云服务 ├── Unity Collaborate └── Addressables资源管理 ``` 典型应用场景: $$ \begin{cases} \text{独立游戏开发:2D平台跳跃/3D动作游戏} \\ \text{VR/AR应用:HTC Vive/Oculus Quest开发} \\ \text{工业仿真:物理模拟/可视化呈现} \\ \text{移动端游戏:Android/iOS性能优化} \end{cases} $$ 学习路线建议: 1. 从官方「Roll-a-Ball」教程入门基础操作 2. 通过「2D UFO」项目掌握物理系统 3. 用「Survival Shooter」学习动画与AI 4. 使用「Netcode」实现多人联机功能 5. 通过「Shader Graph」创建自定义视觉效果 推荐资源: ```plaintext 1. 官方学习平台:learn.unity.com 2. 社区论坛:Unity中文课堂、优快云 Unity专区 3. 工具插件:ProBuilder(快速建模)、Cinemachine(智能相机) 4. 开源项目:Unity官方示例库(Github) ``` 调试技巧: - 使用Debug.Log输出变量值 - 通过Frame Debugger分析绘制过程 - 利用Profiler检测性能瓶颈 - 使用Console窗口过滤警告/错误信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值