首先我们打开一个项目

在这个初始界面我们需要做一些准备工作
创建基础通用包

创建一个Plane 重置后 缩放100倍 加一个颜色
(个人喜好)调节渐变色 可更改同种颜色的色调

(个人喜好) 调节天空盒


准备工作做完后 接下我们做【包装器模式】
现在我对包装器模式说一下自己的理解:
包装器模式 又称 适配者模式 不管是哪个名字都是这个模式下的一个扮演角色
我更喜欢称这个模式为包装器模式 。
包装器模式是一种 结构型 设计模式,它能使接口不兼容的对象能够相互合作。
使接口不兼容的对象能够相互合作 就是这个模式最大的特点
我举个例子 圆孔耳机 插不进去 方口手机 但是只需要一个 圆口转方口的转换器 就可以听音乐了
所以说,包装器 一共有三个类
【适配者类】 相当于 圆孔耳机
【可抽象包装器类】 相当于 转换器
【目标类】 相当于 方口手机
最后我们通过Main继承MoNo挂载在脚本上调用即可
任务:按Q键实现 红色方块下落 到黑色木板上 黑色木板数值减少 红色模板数值增加
解释:不同颜色代表不同接口 红色方块 通过 黑色转换器 将数值传递给 没接触的红色木板
说一下完成任务的整体思路:
1.Main类

2.包装器类

3.适配者类

4.目标类

即完成了红色方块 落在黑色模板上 也可以使红色模板数值增加
在实现代码前,我们需要在unity场景中做几个预制体方便我们运行后自动生成

给小方块添加一个重力 使其掉落在黑色木板上

测试一下

接下来我们改名字为
红色方块 = 适配者 Adaptor
黑色木板 = 包装器 Wrapper
红色木板 = 目标类 Target

创建UI-Text显示数值

将Canvas下的Text改成AdaptorText

调Canvas的世界坐标方便我们调节他的长度和高度

调整后随便输入个数值

如果发现数值看不清就需要调节Canvas的清晰度

ctrl + d复制一个Canvas

将另一个的子类改名TargetText

将子类是AdaptorText的Canvas放在Wrapper包装器类作为Wrapper的子类
将子类是TargetText的Canvas放在Target目标类作为Target的子类

做好后将这个三物体放进预制体包 并在场景中删除
实现:
1.【适配者Adaptor类】

using UnityEngine;
 public class Adaptor {
     //1.封装  适配者类 
     public float StoneNum { get; set; } = 100000f;//总体能量
     public float CurrentStoneNum { get; set; }//储存能量
     public string Energy { get; set; } = "魔法能量";
     private GameObject _modelObj;//模型
     public GameObject PrefabObj;//预制体引用
     public Adaptor(float energy){
         StoneNum = energy;
         CurrentStoneNum = energy;
         if (_modelObj == null)
             _modelObj = Resources.Load("Prefabs/Adaptor") as GameObject;
         if (PrefabObj == null)
             PrefabObj = GameObject.Instantiate(_modelObj, new Vector3(0f, 20f, 0f), Quaternion.identity);
     }
     //2.减少能量函数
     //减少目标能量
     public float Reduce(float num){
         if (CurrentStoneNum > num)
             CurrentStoneNum -= num;
         else
             CurrentStoneNum = 0;
         return StoneNum - CurrentStoneNum;//已经抽取的能量数量
     }
 }
 2.【包装器类】

using UnityEngine;
 using UnityEngine.UI;
 public class Wrapper{
     //1.封装 包装器
     private Adaptor _adaptor;//魔法能量晶石引用
     private Target _target;//能量水晶版引用
     private const float convert = 10f;//能量转换比率
     private GameObject _modelObj;//模型
     public GameObject PrefabObj;//预制体引用
     private Text _TargetText;//显示能量文本
     public Wrapper(Adaptor adaptor, Target target){
         _adaptor = adaptor;
         _target = target;
         _modelObj = Resources.Load("Prefabs/Wrapper") as GameObject;
         if (_modelObj != null){
             PrefabObj = GameObject.Instantiate(_modelObj, new Vector3(0f, 5f, 0f), Quaternion.identity);
             if (PrefabObj != null){
                 _TargetText = PrefabObj.transform.Find("Canvas/AdaptorText").GetComponent<Text>();
                 Debug.Log(_TargetText);
                 _TargetText.text = adaptor.CurrentStoneNum.ToString();
             }
         }
     }
     //2.显示当前适配者数值
     public void ShowAdaptorlCurrentNum(){
         //显示能量石存储的能量值
         if (_TargetText != null)
             _TargetText.text = _adaptor.CurrentStoneNum.ToString();
     }
     //3.转换函数:接收主函数协程函数每0.2秒传递的数值
     //并且通过每0.2接收的数值让适配者逐渐减少
     //再通过将减少的数值传递给目标类使其增加
     //转换方法
     public void ConvertEnergy(float num){
         //抽取魔法能量
         float extractedMagicenergy = _adaptor.Reduce(num);
         //转换成电力能量
         float convertElectricEnergy = extractedMagicenergy * convert;
         //存储到水晶板中
         _target.Increase(convertElectricEnergy);
         ShowAdaptorlCurrentNum();
     }
 }
 3.【目标类】

using UnityEngine;
 using UnityEngine.UI;
 public class Target {
     //1.封装   目标类
     public float Stone1Num { get; set; } = 100000f;//总体能量
     public float CurrentStone1Num { get; set; }//储存能量
     //能量属性
     public string Energy1 { get; set; } = "电力能量";
     private GameObject _modelObj;//模型
     public GameObject PrefabObj;//预制体引用
     private Text _TargetText;//显示能量文本
     public Target(float energy1, float energy){
         Stone1Num = energy1;
         CurrentStone1Num = energy;
         _modelObj = Resources.Load("Prefabs/Target") as GameObject;
         if (_modelObj != null){
             PrefabObj = GameObject.Instantiate(_modelObj, new Vector3(20f, 5f, 0f), Quaternion.identity);
             //查找UI文本
             if (PrefabObj != null){
                 _TargetText = PrefabObj.transform.Find("Canvas/TargetText").GetComponent<Text>();
                 Debug.Log(_TargetText);
             }
             if (_TargetText != null)
                 _TargetText.text = CurrentStone1Num.ToString();
         }
     }
     //2.增加能量函数
     //增加目标能量
     public void Increase(float num){
         //存储没能量的计算逻辑
         CurrentStone1Num += num;
         if (CurrentStone1Num > Stone1Num)
             CurrentStone1Num = Stone1Num;//确保不超过最大值
         //显示电力值文本
         _TargetText.text = CurrentStone1Num.ToString();
     }
 }
 4.【控制挂载类】

using System.Collections;
 using UnityEngine;
 public class Main : MonoBehaviour{
     Wrapper _wrapper;
     Adaptor _adaptor;
     Target _target;
     void Start(){
         //实例化(运行即创建)三个物体 :
         //【适配者】黑色方块 【包装器】转换器 【目标类】红色方块
         _adaptor = new Adaptor(500f);
         //能量水晶板
         _target = new Target(5000000f, 50f);
         //能量水晶板
         _wrapper = new Wrapper(_adaptor, _target);
         //_wrapper.ConvertEnergy(30f);
     }
     //协程函数:通过协程完成每0.2秒钟 传递给 包装器类一个数值
     private IEnumerator ConverEnergyRoutine()
     {
         while (_adaptor.CurrentStoneNum > 0)
         {
             _wrapper.ConvertEnergy(1f);
             yield return new WaitForSeconds(0.2f);
         }
     }
     void Update(){
         //按Q键开启协程函数
         if (Input.GetKeyDown(KeyCode.Q))
             StartCoroutine(ConverEnergyRoutine());
     }
 }
 最后回到unity场景中创建一个空物体起名为Obj


运行后 按Q键





















