网站公告 | 泰斗网校全新上线了,可以和论坛用户登录同步,如果遇到登录问题联系管理员解决
查看: 4404|回复: 3
收起左侧

[即步] Unity3d MVCS游戏框架Robotlegs

[复制链接]

[即步] Unity3d MVCS游戏框架Robotlegs[复制链接]

13007234056 发表于 2017-7-5 15:19:39 [显示全部楼层] 回帖奖励 |倒序浏览 |阅读模式 回复:  3 浏览:  4404
本帖最后由 13007234056 于 2017-7-6 18:07 编辑

最近在一个新项目中需要使用Robotlegs这套框架来重构代码

学习了下这套开源框架,还是很容易上手的

框架地址:https://github.com/robotlegs-sharp

博主学习了这套框架后也写了一个Demo

本文内容是围绕这个Demo来写的,大家可以下载参考Demo来学习

框架入口
[AppleScript] 纯文本查看 复制代码
using System.Collections;  
using System.Collections.Generic;  
using Robotlegs.Bender.Framework.API;  
using Robotlegs.Bender.Framework.Impl;  
using Robotlegs.Bender.Platforms.Unity.Bundles;  
using Robotlegs.Bender.Platforms.Unity.Extensions.ContextViews.Impl;  
using UnityEngine;  
  
public class MyText : MonoBehaviour  
{  
    IContext context;  
  
    public void Start()  
    {  
        context = new Context();  
  
        context.Install<UnitySingleContextBundle>().Configure<MyTextConfig>().Configure(new TransformContextView(this.transform));  
    }  
}  


Config
实例化框架后将安装配置信息
[AppleScript] 纯文本查看 复制代码
using System;  
using System.Collections;  
using System.Collections.Generic;  
using Robotlegs.Bender.Extensions.EventCommand.API;  
using Robotlegs.Bender.Extensions.Mediation.API;  
using Robotlegs.Bender.Framework.API;  
using UnityEngine;  
  
public class MyTextConfig : IConfig  
{  
    [Inject]  
    public IEventCommandMap eventCommandMap;  
    [Inject]  
    public IMediatorMap mediatorMap;  
    [Inject]  
    public IInjector injector;  
    [Inject]  
    public IContext context;  
  
  
    public void Configure()  
    {  
        //中间介绑定  
        mediatorMap.Map<MyTextView>().ToMediator<MyTextMediator>();  
  
        //事件绑定  
        eventCommandMap.Map(ViewEvent.Type.REQUEST).ToCommand<RequestCommand>();  
        eventCommandMap.Map(ViewEvent.Type.ADD).ToCommand<AddCommand>();  
  
        //注入绑定  
        injector.Map<InterfaceScoreService>().ToSingleton<ScoreService>();  
        injector.Map<ScoreModel>().ToSingleton<ScoreModel>();  
  
        //数据绑定后调用  
        context.AfterInitializing(StartApplication);  
    }  
  
    private void StartApplication()  
    {  
        GameObject gameobj = GameObject.FindGameObjectWithTag("Text");  
        gameobj.AddComponent<MyTextView>();  
    }  
}  



进行了这一系列配置后,可能你的项目需要从服务器中读取数据

这个Demo在运行后将随机生成一个[0,100]的整数,当点击这个数后将持续增大

View
在View层内,有view与mediator两个字分块
view主要实现与客户端界面的交互,mediator是View层与Controller层交互的中间介纽带

MyTextView.cs
[AppleScript] 纯文本查看 复制代码
using Robotlegs.Bender.Platforms.Unity.Extensions.Mediation.Impl;  
using UnityEngine.UI;  
  
public class MyTextView : EventView  
{  
    protected override void Start()  
    {  
        base.Start();  
  
        dispatcher.Dispatch(new ViewEvent(ViewEvent.Type.REQUEST));  
  
        this.GetComponent<Button>().onClick.AddListener(OnBtnClicked);  
    }  
  
    //数据更新  
    public void UpdateScore(int score)  
    {  
        this.GetComponent<Text>().text = score.ToString();  
    }  
  
    //点击事件  
    private void OnBtnClicked()  
    {  
        //View派发器 将派发到mediator  
        dispatcher.Dispatch(new ViewEvent(ViewEvent.Type.ADD));  
    }  
}  


MyTextMediator.cs
[AppleScript] 纯文本查看 复制代码
using System.Collections;  
using System.Collections.Generic;  
using Robotlegs.Bender.Bundles.MVCS;  
using Robotlegs.Bender.Extensions.EventManagement.API;  
using UnityEngine;  
  
public class MyTextMediator : Mediator  
{  
    //注入自身对象下的MyTextView组件  
    [Inject]  
    public MyTextView myTextView;  
  
    //当全部的属性变量注入对象成功的时候,将调用该函数  
    public override void Initialize()  
    {  
        //view派发器的监听  
        AddViewListener<ViewEvent>(ViewEvent.Type.REQUEST, Dispatch);  
        AddViewListener<ViewEvent>(ViewEvent.Type.ADD, Dispatch);  
          
        //context自定义派发器的监听  
        AddContextListener<CommandEvent>(CommandEvent.Type.REQUEST, UpdateScore);  
        AddContextListener<CommandEvent>(CommandEvent.Type.ADD, UpdateScore);  
  
    }  
  
    private void UpdateScore(CommandEvent evt)  
    {  
        myTextView.UpdateScore(evt.score);  
    }  
}  


Controller

在config上对事件进行是事件绑定后,将调用对应的Command
要向服务器发送数据请求,这里我定义一个RequestCommand
RequestCommand.cs
[AppleScript] 纯文本查看 复制代码
using System;  
using System.Collections;  
using System.Collections.Generic;  
using Robotlegs.Bender.Extensions.CommandCenter.API;  
using Robotlegs.Bender.Extensions.EventManagement.API;  
using UnityEngine;  
  
public class RequestCommand : ICommand  
{  
    [Inject]  
    public InterfaceScoreService scoreService;  
  
    [Inject]  
    public ScoreModel scoreModel;  
  
    [Inject]  
    public IEventDispatcher dispatcher;  
  
    //当命定被使用后开始调用该函数  
    public void Execute()  
    {  
        Debug.Log("Command...");  
  
        scoreService.dispatcher.AddEventListener<ServiceEvent>(ServiceEvent.Type.REQUEST, GetRequestScore);  
        scoreService.OnRequestScore("127.0.0.1");  
    }  
  
    public void GetRequestScore(ServiceEvent evt)  
    {  
        scoreModel.score = evt.score;  
  
        dispatcher.Dispatch(new CommandEvent(CommandEvent.Type.REQUEST, scoreModel.score));  
  
        scoreService.dispatcher.RemoveEventListener<ServiceEvent>(ServiceEvent.Type.REQUEST, GetRequestScore);  
    }  
}  


config中对model与service进行注入绑定
[AppleScript] 纯文本查看 复制代码
//注入绑定  
injector.Map<InterfaceScoreService>().ToSingleton<ScoreService>();  
injector.Map<ScoreModel>().ToSingleton<ScoreModel>();  


Service

在service上定义一个派发器,在Command进行监听,在Service派发数据
ScoreService.cs
[AppleScript] 纯文本查看 复制代码
using System;  
using System.Collections;  
using System.Collections.Generic;  
using Robotlegs.Bender.Extensions.EventManagement.API;  
using Robotlegs.Bender.Extensions.EventManagement.Impl;  
  
public class ScoreService : InterfaceScoreService  
{  
    [Inject]  
    public IEventDispatcher dispatcher { get; set; }  
  
    public void OnReceiveScore()  
    {  
  
    }  
  
    public void OnRequestScore(string url)  
    {  
        UnityEngine.Debug.Log("向服务器发送请求");  
  
        int score = UnityEngine.Random.Range(0, 100);  
        dispatcher.Dispatch(new ServiceEvent(ServiceEvent.Type.REQUEST,score));  
    }  
  
    public void UpdateScore(string url, int score)  
    {  
  
    }  
}  


Model

从服务器上接收到数据后,在Command上进行对model进行数据处理(存储、修改等操作)
[AppleScript] 纯文本查看 复制代码
using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
  
public class ScoreModel  
{  
    public int score { get; set; }  
  
    public int Add()  
    {  
        return this.score++;  
    }  
}  


这样,运行程序后,向服务器发送数据请求,并呈现给客户端


点击事件的对Model层存储了的数据进行处理了
这里就不给大家介绍了,可以参考源码学习!

这里需要注意的是,两种派发器的监听
[AppleScript] 纯文本查看 复制代码
//view派发器的监听  
        AddViewListener<ViewEvent>(ViewEvent.Type.REQUEST, Dispatch);  
        AddViewListener<ViewEvent>(ViewEvent.Type.ADD, Dispatch);  
          
        //context自定义派发器的监听  
        AddContextListener<CommandEvent>(CommandEvent.Type.REQUEST, UpdateScore);  
        AddContextListener<CommandEvent>(CommandEvent.Type.ADD, UpdateScore);  

前两种是监听View层上的派发器
后两种四监听自定义的派发器

原文地址(含Demo源码):blog.liujunliang.com.cn

评分

参与人数 1泰斗币 +100 收起 理由
优弧 + 100 原创内容

查看全部评分

+1
4400°C
3
  • yeweidon111
  • xtxy
  • kingtopchina
过: 他们
因分享而快乐,学习以自强!
yeweidon111 发表于 2017-7-6 09:47:53 显示全部楼层
66666666666666666666666
因分享而快乐,学习以自强!
xtxy 发表于 2017-7-6 11:11:37 显示全部楼层
没有我自己的好用
因分享而快乐,学习以自强!
kingtopchina 发表于 2018-8-15 10:49:50 显示全部楼层
没有我自己的好用
因分享而快乐,学习以自强!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 浙ICP 备 13006852号-15 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ