Unity3D数学基础(6)_简单的MVC

来源:互联网 发布:淘宝盗图怎么修改 编辑:程序博客网 时间:2024/06/11 11:00

简单的MVC

(之前在做JavaWeb作业的学过了一下MVC,知道原理却不知道怎么使用,刚刚了解一下,做一下总结,只是一个很简单的例子而已)


大神参考(简单易懂)

简书:http://www.jianshu.com/p/acc689be52f9


1.MVC构成


2.MVC业务流程



3.例子

效果图:



主要代码:

Model(M)

using UnityEngine;using System.Collections;/*玩家模型委托*//*当用户信息改变的时候执行*/public delegate void OnValueChange(int value);public class PlayerMsgModel {    #region 数据定义    /*属性*/    private int level;      /*等级*/    private int expValue;   /*经验值*/    private int fullExp;    /*升级经验*/    private int attack;     /*攻击力*/    private int defense;    /*防御力*/    /*委托事件*/    public OnValueChange OnLevelChange;     /*等级变化触发事件*/    public OnValueChange OnExpValueChange;  /*经验值变化触发事件*/    public OnValueChange OnFullExpChange;   /*升级经验变化触发事件*/    public OnValueChange OnAttackChange;    /*攻击力变化触发事件*/    public OnValueChange OnDefenseChange;   /*防御力变化触发事件*/    #endregion    /*单例*/    private static PlayerMsgModel instance;    public static PlayerMsgModel Instance    {        get        {            if (instance == null)            {                instance = new PlayerMsgModel();            }            return instance;        }    }    /*私有构造函数*/    private PlayerMsgModel() { }    /*等级*/    public int Level    {        get        {            return level;        }        set        {            level = value;            if (OnLevelChange != null)            {                OnLevelChange(level);            }        }    }    /*经验值*/    public int ExpValue    {        get        {            return expValue;        }        set        {            expValue = value;            if (OnExpValueChange != null)            {                OnExpValueChange(expValue);            }        }    }    /*升级经验*/    public int FullExp    {        get        {            return fullExp;        }        set        {            fullExp = value;            if (OnFullExpChange != null)            {                OnFullExpChange(fullExp);            }        }    }    /*攻击力*/    public int Attack    {        get        {            return attack;        }        set        {            attack = value;            if (OnAttackChange != null)            {                OnAttackChange(attack);            }        }    }    /*防御力*/    public int Defense    {        get        {            return defense;        }        set        {            defense = value;            if (OnDefenseChange != null)            {                OnDefenseChange(defense);            }        }    }}
View(V)

using UnityEngine;using System.Collections;using UnityEngine.UI;using System;/*V:视图*/public class PlayerMsgView : MonoBehaviour {    #region 定义变量    /*这里的UI直接赋值了,不查找了*/    public Button[] buttons;    /*按钮*/    public Slider slider;       /*经验条*/    public Text levelText;      /*等级*/    public Text attackText;     /*攻击力*/    public Text defenseText;    /*防御力*/    #endregion    private void Start()    {        /*按钮处理*/        for (int i = 0; i < buttons.Length; i++)        {            switch (buttons[i].name)            {                case "Exit":        /*退出*/                    break;                case "Exp":                    buttons[i].onClick.AddListener(PlayerMsgControl.Instance.OnExpUp);                        break;            }        }        /*委托事件绑定*/        PlayerMsgModel.Instance.OnLevelChange += OnLevelChange;        PlayerMsgModel.Instance.OnExpValueChange += OnExpValueChange;        PlayerMsgModel.Instance.OnFullExpChange += OnFullExpChange;        PlayerMsgModel.Instance.OnAttackChange += OnAttackChange;        PlayerMsgModel.Instance.OnDefenseChange += OnDefenseChange;    }    /*防御力改变*/    private void OnDefenseChange(int value)    {        defenseText.text = value.ToString();    }    /*攻击力改变*/    private void OnAttackChange(int value)    {        attackText.text = value.ToString();    }    /*升级经验改变*/    private void OnFullExpChange(int value)    {        slider.value = (float)PlayerMsgModel.Instance.ExpValue / value;    }    /*经验值改变*/    private void OnExpValueChange(int value)    {        slider.value = value / (float)PlayerMsgModel.Instance.FullExp;    }    /*等级改变*/    private void OnLevelChange(int value)    {        levelText.text = value.ToString();    }}
Controller(C)
using UnityEngine;using System.Collections;/*C:控制器*/public class PlayerMsgControl : MonoBehaviour{    #region 数据定义    private int expUpValue = 20;  /*每次点击增加的经验值*/    #endregion    /*单例*/    public static PlayerMsgControl Instance;    private void Awake()    {        Instance = this;    }    private void Start()    {        Init();    }    /*初始化数据*/    private void Init()    {        PlayerMsgModel.Instance.Level = 1;        PlayerMsgModel.Instance.ExpValue = 0;        PlayerMsgModel.Instance.FullExp = 100;        PlayerMsgModel.Instance.Attack = 0;        PlayerMsgModel.Instance.Defense = 0;    }    /*增加经验*/    public void OnExpUp()    {        PlayerMsgModel.Instance.ExpValue += expUpValue;     /*增加经验*/        /*经验值 >= 升级经验.....可以升级了*/        if (PlayerMsgModel.Instance.ExpValue >= PlayerMsgModel.Instance.FullExp)        {            PlayerMsgModel.Instance.Level += 1;     /*等级 + 1*/            PlayerMsgModel.Instance.ExpValue = 0;    /*现有经验清零*/            PlayerMsgModel.Instance.FullExp += 200 * PlayerMsgModel.Instance.Level; /*升级经验幅度增长*/            expUpValue += 20;   /*升级经验增加*/        }    }    /*改变攻击力*/    public void OnAttackChange(int value)    {        int tempValue = PlayerMsgModel.Instance.Attack + value;        PlayerMsgModel.Instance.Attack = tempValue;    }    /*改变防御力*/    public void OnDefenseChange(int value)    {        int tempValue = PlayerMsgModel.Instance.Defense + value;        PlayerMsgModel.Instance.Defense = tempValue;    }}


还有一些主要代码:

GoodDrag.cs (将脚本挂在物体上面,使得物体可拖拽,在这个脚本里面实现逻辑)

using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;/*拖拽物品,脚本挂在到物品上面*/public class GoodDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler{    private Transform parent;    /*开始拖拽*/    public void OnBeginDrag(PointerEventData eventData)    {        parent = transform.parent;        transform.localScale = Vector3.one;             /*设置动画*/        gameObject.GetComponent<Image>().raycastTarget = false;     /*关闭射线检测*/    }    /*拖拽中*/    public void OnDrag(PointerEventData eventData)    {        transform.position = Input.mousePosition;    }    /*停止拖拽*/    public void OnEndDrag(PointerEventData eventData)    {        transform.localScale = Vector3.one * 0.8f;                         /*动画*/        GameObject go = eventData.pointerCurrentRaycast.gameObject;        /*检测放置背景*/        if (go.tag == "K")   /*放置背包空格子*/        {            if (parent.tag == "E")     /*装备栏 -> 背包,解除装备*/            {                /*设置数据*/                int attack = 0 - GetAttack(gameObject);                int defense = 0 - GetDefense(gameObject);                PlayerMsgControl.Instance.OnAttackChange(attack);                PlayerMsgControl.Instance.OnDefenseChange(defense);            }            transform.SetParent(go.transform);                      /*设置新的父物体*/            transform.localPosition = Vector3.zero;                 /*设置新位置*/        }        else if (go.tag == "E")  /*装备栏*/        {            transform.SetParent(go.transform);            transform.localPosition = Vector3.zero;            if (parent.tag == "K")            {                /*设置攻击防御力变化*/                PlayerMsgControl.Instance.OnAttackChange(GetAttack(gameObject));                PlayerMsgControl.Instance.OnDefenseChange(GetDefense(gameObject));            }            transform.SetParent(go.transform);                      /*设置新的父物体*/            transform.localPosition = Vector3.zero;                 /*设置新位置*/        }        else if (go.tag == "Good")        {            if (parent.tag == "K")        /*当前物体的父物体为背包*/            {                if (go.transform.parent.tag == "K")     /*背包物体 -> 背包物体*/                {                    /*无*/                }                else if (go.transform.parent.tag == "E")    /*背包物体 -> 背包物体*/                {                    int attackValue = GetAttack(gameObject) - GetAttack(go);                    int defenseValue = GetDefense(gameObject) - GetDefense(go);                    PlayerMsgControl.Instance.OnAttackChange(attackValue);                    PlayerMsgControl.Instance.OnDefenseChange(defenseValue);                }            }            else if (parent.tag == "E")       /*当前物体的父物体为装备栏*/            {                if (go.transform.parent.tag == "E")     /*装备栏物体 -> 装备栏物体*/                {                }                else if (go.transform.parent.tag == "K")    /*装备栏 -> 背包物体*/                {                    int attackValue = GetAttack(go) - GetAttack(gameObject);                    int defenseValue = GetDefense(go) - GetDefense(gameObject);                    PlayerMsgControl.Instance.OnAttackChange(attackValue);                    PlayerMsgControl.Instance.OnDefenseChange(defenseValue);                }            }            /*交换位置*/            SwapWith(go);        }        gameObject.GetComponent<Image>().raycastTarget = true;  /*最后开启射线检测*/    }    /*开始拖拽时的操作*/    private void BeginDrag()    {    }    /*获取物体的攻击力*/    private int GetAttack(GameObject go)    {        string[] array = go.GetComponentInChildren<Text>().text.Split('+', '\n');        return int.Parse(array[1]);    }    /*获取物体的防御力*/    private int GetDefense(GameObject go)    {        string[] array = go.GetComponentInChildren<Text>().text.Split('+', '\n');        return int.Parse(array[3]);    }    /*和go交换位置*/    private void SwapWith(GameObject go)    {        transform.SetParent(go.transform.parent);        transform.localPosition = Vector3.zero;        go.transform.SetParent(parent);        go.transform.localPosition = Vector3.zero;    }}


这是一个简单的MVC,只是为了解基础而总结。还要下一步了解更多东西,如pureMVC。



原创粉丝点击