8.MVC的Controller逻辑层

  1. 8.MVC框架-使用MVC框架-Controller逻辑层
    1. 8.1 知识点
      1. 创建主面板逻辑层脚本MainController类,并继承自MonoBehaviour类,挂载到主面板上。
      2. 声明一个私有成员变量mainView,用于持有界面的引用。
      3. 把主面板逻辑层脚本做成单例。声明一个静态的控制器对象controller。创建一个静态的属性Controller,用于获取控制器对象。
      4. 定义一个静态方法ShowMe(),用于显示界面。在该方法中,判断控制器对象是否为空,若为空则实例化一个MainPanel预制体,并设置其父对象为Canvas,最后获取该对象的MainController组件,并赋值给controller。将控制器游戏对象设为激活状态。定义一个静态方法HideMe(),用于隐藏界面。若控制器对象不为空,则将其游戏对象设为非激活状态。
      5. 在Start()方法中,获取与该脚本同一游戏对象上挂载的MainView组件,并更新界面信息。然后监听界面按钮的点击事件,当按钮被点击时,调用ClickRoleBtn()方法。在Start()方法末尾,将UpdateInfo()方法注册为数据模型(PlayerModel)的事件监听器。这样在玩家数据类保持数据后会调用UpdateInfo方法。
      6. ClickRoleBtn()方法会输出一条日志信息,然后通过控制器对象调用RoleController的ShowMe()方法,以显示角色面板。
      7. 定义一个UpdateInfo()方法,该方法用于更新界面信息。当界面数据模型(PlayerModel)发生变化时,会调用该方法。在该方法中,检查mainView是否为空,如果不为空,则调用其UpdateInfo()方法,传入最新的数据。
      8. 在OnDestroy()方法中,从数据模型(PlayerModel)的事件监听器中移除UpdateInfo()方法。
      9. 创建角色面板逻辑层RoleController类,继承自MonoBehaviour类。
      10. 声明一个私有成员变量roleView,用于持有角色界面的引用。
      11. 对角色面板逻辑层。声明一个静态的控制器对象controller。创建一个静态的属性Controller,用于获取控制器对象。
      12. 定义一个静态方法ShowMe(),用于显示角色界面。在该方法中,判断控制器对象是否为空,若为空,则实例化一个RolePanel预制体,并设置其父对象为Canvas。然后获取该对象的RoleController组件,并赋值给controller。将控制器游戏对象设为激活状态。定义一个静态方法HideMe(),用于隐藏角色界面。如果控制器对象不为空,则将其游戏对象设为非激活状态。
      13. 在Start()方法中,获取与该脚本同一游戏对象上挂载的RoleView组件,并更新界面信息。然后监听界面按钮的点击事件,当按钮被点击时,调用ClickCloseBtn()或ClickLevUpBtn()方法。在Start()方法末尾,将UpdateInfo()方法注册为数据模型(PlayerModel)的事件监听器。
      14. ClickCloseBtn()方法会调用HideMe()方法,隐藏角色界面。ClickLevUpBtn()方法会通过数据模型(PlayerModel)进行升级操作,以改变数据。
      15. 定义一个UpdateInfo()方法,该方法用于更新界面信息。当数据模型(PlayerModel)的数据发生变化时,会调用该方法。检查roleView是否为空,如果不为空,则调用其UpdateInfo()方法,传入最新的数据。
      16. 在OnDestroy()方法中,从数据模型(PlayerModel)的事件监听器中移除UpdateInfo()方法。
      17. 创建测试脚本,进行点击显隐面板的测试
    2. 8.2 知识点代码
      1. MainController
      2. RoleController
      3. MVCMain

8.MVC框架-使用MVC框架-Controller逻辑层


8.1 知识点

创建主面板逻辑层脚本MainController类,并继承自MonoBehaviour类,挂载到主面板上。

/// <summary>
/// Controller要处理的东西 就是业务逻辑
/// </summary>
public class MainController : MonoBehaviour
{
}

声明一个私有成员变量mainView,用于持有界面的引用。

//能够在Controller中得到界面才行
private MainView mainView;

把主面板逻辑层脚本做成单例。声明一个静态的控制器对象controller。创建一个静态的属性Controller,用于获取控制器对象。

private static MainController controller = null;

public static MainController Controller
{
    get
    {
        return controller;
    }
}

定义一个静态方法ShowMe(),用于显示界面。在该方法中,判断控制器对象是否为空,若为空则实例化一个MainPanel预制体,并设置其父对象为Canvas,最后获取该对象的MainController组件,并赋值给controller。将控制器游戏对象设为激活状态。定义一个静态方法HideMe(),用于隐藏界面。若控制器对象不为空,则将其游戏对象设为非激活状态。

//界面的显隐
public static void ShowMe()
{
    if (controller == null)
    {
        //实例化面板对象
        GameObject res = Resources.Load<GameObject>("BaseFramework/UI/UGUI/MVC/MainPanel");
        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);
    }
}

在Start()方法中,获取与该脚本同一游戏对象上挂载的MainView组件,并更新界面信息。然后监听界面按钮的点击事件,当按钮被点击时,调用ClickRoleBtn()方法。在Start()方法末尾,将UpdateInfo()方法注册为数据模型(PlayerModel)的事件监听器。这样在玩家数据类保持数据后会调用UpdateInfo方法。

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

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

ClickRoleBtn()方法会输出一条日志信息,然后通过控制器对象调用RoleController的ShowMe()方法,以显示角色面板。

private void ClickRoleBtn()
{
    Debug.Log("点击按钮显示角色面板");
    //通过Controller去显示 角色面板
    RoleController.ShowMe();
}

定义一个UpdateInfo()方法,该方法用于更新界面信息。当界面数据模型(PlayerModel)发生变化时,会调用该方法。在该方法中,检查mainView是否为空,如果不为空,则调用其UpdateInfo()方法,传入最新的数据。

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

在OnDestroy()方法中,从数据模型(PlayerModel)的事件监听器中移除UpdateInfo()方法。

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

创建角色面板逻辑层RoleController类,继承自MonoBehaviour类。

public class RoleController : MonoBehaviour
{
}

声明一个私有成员变量roleView,用于持有角色界面的引用。

private RoleView roleView;

对角色面板逻辑层。声明一个静态的控制器对象controller。创建一个静态的属性Controller,用于获取控制器对象。

private static RoleController controller = null;

public static RoleController Controller
{
    get
    {
        return controller;
    }
}

定义一个静态方法ShowMe(),用于显示角色界面。在该方法中,判断控制器对象是否为空,若为空,则实例化一个RolePanel预制体,并设置其父对象为Canvas。然后获取该对象的RoleController组件,并赋值给controller。将控制器游戏对象设为激活状态。定义一个静态方法HideMe(),用于隐藏角色界面。如果控制器对象不为空,则将其游戏对象设为非激活状态。

public static void ShowMe()
{
    if (controller == null)
    {
        //实例化面板对象
        GameObject res = Resources.Load<GameObject>("BaseFramework/UI/UGUI/MVC/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)
    {
        //方式一 直接删
        //Destroy(panel.gameObject);
        //panel = null;
        //方式二 设置可见为隐藏
        controller.gameObject.SetActive(false);
    }
}

在Start()方法中,获取与该脚本同一游戏对象上挂载的RoleView组件,并更新界面信息。然后监听界面按钮的点击事件,当按钮被点击时,调用ClickCloseBtn()或ClickLevUpBtn()方法。在Start()方法末尾,将UpdateInfo()方法注册为数据模型(PlayerModel)的事件监听器。

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



    roleView.btnClose.onClick.AddListener(ClickCloseBtn);
    roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);

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

ClickCloseBtn()方法会调用HideMe()方法,隐藏角色界面。ClickLevUpBtn()方法会通过数据模型(PlayerModel)进行升级操作,以改变数据。

private void ClickCloseBtn()
{
    HideMe();
}

private void ClickLevUpBtn()
{
    //通过数据模块 进行升级 达到数据改变
    PlayerModel.Data.LevUp();
}

定义一个UpdateInfo()方法,该方法用于更新界面信息。当数据模型(PlayerModel)的数据发生变化时,会调用该方法。检查roleView是否为空,如果不为空,则调用其UpdateInfo()方法,传入最新的数据。

private void UpdateInfo( PlayerModel data )
{
    if( roleView != null )
    {
        roleView.UpdateInfo(data);
    }
}

在OnDestroy()方法中,从数据模型(PlayerModel)的事件监听器中移除UpdateInfo()方法。

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

创建测试脚本,进行点击显隐面板的测试

public class MVCMain : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.M))
        {
            //显示主面板
            MainController.ShowMe();
        }
        else if (Input.GetKeyDown(KeyCode.N))
        {
            //隐藏主面板
            MainController.HideMe();
        }
    }
}

8.2 知识点代码

MainController

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

/// <summary>
/// Controller要处理的东西 就是业务逻辑
/// </summary>
public class MainController : MonoBehaviour
{
    //能够在Controller中得到界面才行
    private MainView mainView;

    private static MainController controller = null;

    public static MainController Controller
    {
        get { return controller; }
    }

    //1.界面的显隐
    public static void ShowMe()
    {
        if (controller == null)
        {
            //实例化面板对象
            GameObject res = Resources.Load<GameObject>("BaseFramework/UI/UGUI/MVC/MainPanel");
            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 Start()
    {
        //获取同样挂载在一个对象上的 view脚本
        mainView = this.GetComponent<MainView>();
        //第一次的 界面更新
        mainView.UpdateInfo(PlayerModel.Data);


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


    private void ClickRoleBtn()
    {
        Debug.Log("点击按钮显示角色面板");
        //通过Controller去显示 角色面板
        RoleController.ShowMe();
    }

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

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

RoleController

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

public class RoleController : MonoBehaviour
{
    private RoleView roleView;

    private static RoleController controller = null;

    public static RoleController Controller
    {
        get
        {
            return controller;
        }
    }

    public static void ShowMe()
    {
        if (controller == null)
        {
            //实例化面板对象
            GameObject res = Resources.Load<GameObject>("BaseFramework/UI/UGUI/MVC/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)
        {
            //方式一 直接删
            //Destroy(panel.gameObject);
            //panel = null;
            //方式二 设置可见为隐藏
            controller.gameObject.SetActive(false);
        }
    }


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

        roleView.btnClose.onClick.AddListener(ClickCloseBtn);
        roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);

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


    private void ClickCloseBtn()
    {
        HideMe();
    }

    private void ClickLevUpBtn()
    {
        //通过数据模块 进行升级 达到数据改变
        PlayerModel.Data.LevUp();
    }

    private void UpdateInfo( PlayerModel data )
    {
        if( roleView != null )
        {
            roleView.UpdateInfo(data);
        }
    }

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

}

MVCMain

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

public class MVCMain : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.M))
        {
            //显示主面板
            MainController.ShowMe();
        }
        else if (Input.GetKeyDown(KeyCode.N))
        {
            //隐藏主面板
            MainController.HideMe();
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏