猿创征文|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);
    }
}

最终效果

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

在这里插入图片描述


结尾总结

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风不停息丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值