IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 猿创征文|unity中的MVC编程思想基础 -> 正文阅读

[游戏开发]猿创征文|unity中的MVC编程思想基础

@作者: 风不停息丶 学习笔记
在这里插入图片描述


MVC基本概念

  • MVC全名是Model View Controller

  • 模型(model) - 视图(view) - 控制器(controller)的缩写

  • 是一种软件设计规范,用一种业务逻辑、数据、界面显示分离的方法组织代码

  • 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
    在这里插入图片描述

  • 🐱?💻注意:

  • 1.在unity中它不是必备的内容

  • 2.它主要用于开发游戏UI系统逻辑

  • 在unity中应用于UI界面,可以将你的UI面板逻辑一分为三,数据、界面、业务逻辑
    优点: 降低耦合性,方法修改,逻辑更清晰
    缺点: 脚本多,体量大,流程复杂


案例:使用MVC搭建游戏UI界面

在这里插入图片描述

1、创建数据层Model,存储数据

  • PlayerModel
public class PlayerModel {
    //数据内容 设置只读
    private string playerName;
    public string PlayerName
    {
        get
        {
            return PlayerName;
        }
    }

    private int lev;
    public int Lev
    {
        get
        {
            return lev;
        }
    }

    private int money;
    public int Money
    {
        get
        {
            return money;
        }
    }

    private int gem;
    public int Gem
    {
        get
        {
            return gem;
        }
    }

    private int power;
    public int Power
    {
        get
        {
            return power;
        }
    }

    private int hp;
    public int Hp
    {
        get
        {
            return hp;
        }
    }

    private int atk;
    public int Atk
    {
        get
        {
            return atk;
        }
    }

    private int def;
    public int Def
    {
        get
        {
            return def;
        }
    }

    private int crit;
    public int Crit
    {
        get
        {
            return crit;
        }
    }

    private int miss;
    public int Miss
    {
        get
        {
            return miss;
        }
    }

    private int luck;
    public int Luck
    {
        get
        {
            return luck;
        }
    }

    //事件 委托 
    //触发事件将自己传出去  通知外部更新数据的方法
    //通过它和外部建立联系而不是直接获取外部的面板
    private event UnityAction<PlayerModel> updateEvent;

    //在外部第一次获取这个数据如何获取
    //通过单例模式来达到数据的唯一性和数据的获取
    private static PlayerModel data = null;
    public static PlayerModel Data
    {
        get
        {
            if (data == null)
            {
                //只有第一次才会初始化,之后得到的数据都是新的
                data = new PlayerModel();
                data.Init();
            }
            return data;
        }
    }


    //初始化相关操作
    //初始化
    public void Init()
    {
        //PlayerPrefs.GetString 若查找到相应字符,则属性值返回相应数据,若查不到,则返回默认值
        playerName = PlayerPrefs.GetString("playerName", "小明");
        lev = PlayerPrefs.GetInt("lev", 1);
        money = PlayerPrefs.GetInt("money", 1000);
        gem = PlayerPrefs.GetInt("gem", 1000);
        power = PlayerPrefs.GetInt("power", 99);
        hp = PlayerPrefs.GetInt("hp", 100);
        atk = PlayerPrefs.GetInt("atk", 20);
        def = PlayerPrefs.GetInt("def", 10);
        crit = PlayerPrefs.GetInt("crit", 10);
        miss = PlayerPrefs.GetInt("miss", 10);
        luck = PlayerPrefs.GetInt("luck", 40);
    }

    //更新 升级
    public void LevUp()
    {
        //升级 改变内容
        lev += 1;
        hp += lev;
        atk += lev;
        def += lev;
        crit += lev;
        miss += lev;
        luck += lev;
        //升级之后保存
        SaveData();
    }

    //保存 数据
    public void SaveData()
    {
        //把这些数据内容存储到本地
        PlayerPrefs.SetString("playerName", playerName);
        PlayerPrefs.SetInt("playerLev", lev);
        PlayerPrefs.SetInt("playerMoney", money);
        PlayerPrefs.SetInt("playerGem", gem);
        PlayerPrefs.SetInt("playerPower", power);
        PlayerPrefs.SetInt("playerHp", hp);
        PlayerPrefs.SetInt("playerAtk", atk);
        PlayerPrefs.SetInt("playerDef", def);
        PlayerPrefs.SetInt("playerCrit", crit);
        PlayerPrefs.SetInt("playerMiss", miss);
        PlayerPrefs.SetInt("playerLuck", luck);

        //每次保存数据 更新
        UpdateInfo();
    }
    //传一个函数进来监听
    public void AddEventListener(UnityAction<PlayerModel> function)
    {
        updateEvent += function;
    }
    public void RemoveEventListener(UnityAction<PlayerModel> function)
    {
        updateEvent -= function;
    }
    //通知外部更新数据的方法
    private void UpdateInfo()
    {
        //找到对应的使用数据的脚本去更新数据
        //只要事件不为空 调用
        if (updateEvent != null)
        {
            updateEvent(this);
        }
    }
}

2、创建界面层View,显示UI

  • MainView 主面板
public class MainView : MonoBehaviour {
    //1.找控件
    public Button btnRole;
    public Button btnSill;
    public Text textName;
    public Text textLev;
    public Text textMoney;
    public Text textGem;
    public Text textPower;
    //2.提供面板更新的相关方法给外部
    public void UpDateInfo(PlayerModel data)
    {
        textName.text = data.PlayerName;
        textLev.text = "LV." + data.Lev;
        textMoney.text = "金币:" + data.Money.ToString();
        textGem.text = "钻石:" + data.Gem.ToString();
        textPower.text = "体力:" + data.Power.ToString();
    }
}
  • RoleView 角色面板
public class RoleView : MonoBehaviour {

    //1.找控件
    public Text textLev;
    public Text textHp;
    public Text textAtk;
    public Text textDef;
    public Text textCrit;
    public Text textMiss;
    public Text textLuck;
    public Button btnClose;
    public Button btnLevUp;

    //2.提供面板更新的相关方法给外部
    public void UpdateInfo(PlayerModel data)
    {
        textLev.text = "LV." + data.Lev;
        textHp.text = "血量:" + data.Hp.ToString();
        textAtk.text = "攻击力:" + data.Atk.ToString();
        textDef.text = "防御力:" + data.Def.ToString();
        textCrit.text = "暴击率:" + data.Crit.ToString();
        textMiss.text = "闪避率:" + data.Miss.ToString();
        textLuck.text = "幸运值:" + data.Luck.ToString();
    }
}

3、创建控制层Controller,处理业务逻辑

  • 主页控制器MainController
public class MainController : MonoBehaviour {

    //获取MainView
    private MainView mainView;

    //设置静态 
    private static MainController controller = null;
    public static MainController Controller
    {
        get { return controller; }
    }

    private void Start()
    {
        //获取同样挂载在一个对象上的view脚本
        mainView = GetComponent<MainView>();
        //启动时默认界面更新一次
        mainView.UpDateInfo(PlayerModel.Data);

        //2.界面 事件监听 来处理对应的业务逻辑
        mainView.btnRole.onClick.AddListener(clickRoleBtn);
        //添加委托事件
        //告知数据模块 当更新时 通知哪个函数做处理
        PlayerModel.Data.AddEventListener(UpdateInfo);
    }

    //显示面板
    public static void ShowMe()
    {
        if (controller == null)
        {
            //实例化面板
            GameObject res = Resources.Load<GameObject>("Prefabs/MinPanel");
            GameObject obj = Instantiate(res);
            //设置父对象 为Canvas
            obj.transform.SetParent(GameObject.Find("Canvas").transform, false);

            controller = obj.GetComponent<MainController>();
        }//显示
        controller.gameObject.SetActive(true);
    }
    //隐藏面板
    public static void HideMe()
    {
        if (controller != null)
        {
            //隐藏
            controller.gameObject.SetActive(false);
        }
    }

    private void clickRoleBtn()
    {
        //显示面板
        RoleController.ShowMe();
    }

    //3、更新界面
    private void UpdateInfo(PlayerModel data)
    {
        if (mainView != null)
        {
            mainView.UpDateInfo(data);
        }
    }

    private void Ondestroy()
    {
        PlayerModel.Data.RemoveEventListener(UpdateInfo);
    }
}
  • 角色面板RoleController
public class RoleController : MonoBehaviour {
	//获取RoleView界面
	private RoleView roleView;

	//设置静态
	private static RoleController controller = null;
	public static RoleController Controller
	{
		get { return controller; }
	}

    void Start()
    {
        //获取控件
        roleView = GetComponent<RoleView>();
        //第一次更新面板
        roleView.UpdateInfo(PlayerModel.Data);

        //获取关闭按钮
        roleView.btnClose.onClick.AddListener(() =>
        {
            HideMe();
        });

        //更新数据
        roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);

        //添加委托事件
        //告知数据模块 当更新时 通知哪个函数做处理
        PlayerModel.Data.AddEventListener(UpdateInfo);
    }

    //显隐面板
    public static void ShowMe()
    {
        if (controller == null)
        {
            //实例化面板
            GameObject res = Resources.Load<GameObject>("Prefabs/RolePanel");
            GameObject obj = Instantiate(res);
            //设置父对象 为Canvas
            obj.transform.SetParent(GameObject.Find("Canvas").transform, false);

            controller = obj.GetComponent<RoleController>();
        }
        //如果是隐藏的形式hide.在这要显示
        controller.gameObject.SetActive(true);
    }
    //隐藏面板
    public static void HideMe()
    {
        if (controller != null)
        {
            //方式二 设置隐藏
            controller.gameObject.SetActive(false);
        }
    }

    //升级方法
    private void ClickLevUpBtn()
    {
        //通过数据模块
        PlayerModel.Data.LevUp();
    }

    //界面更新
	private void UpdateInfo(PlayerModel data)
    {
        if (roleView != null)
        {
            roleView.UpdateInfo(data);
        }
    }

    private void Ondestroy()
    {
        PlayerModel.Data.RemoveEventListener(UpdateInfo);
    }
}

最终效果

  • 搭建场景,主页和角色面板
    在这里插入图片描述

在这里插入图片描述


结尾总结

新手记录学习笔记,看到这篇文章的小伙伴们可以点个赞👍支持一下,谢谢!
在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:42:50  更:2022-09-04 01:43:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:34:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码