【连载1】PureMVC和Unity3D的UGUI制作一个录音变声小软件

关于PureMVC的相关内容可以看我之前这个贴
http://www.jianshu.com/p/904b36ad37e2

这次实现的软件界面如下。


示意图.png

我们把内容分为几块,这次专门负责写View部分,我们一步一步的完成这个MVC项目。

Step 1

准备工作,把PureMVC.DotNET.35.dll放到Plugins里面。

首先,写UI的代码。放到View模块的/Scripts/View/Components/模块里面

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;

//View层
public class UserRecord : MonoBehaviour {

    //UI
    public UnityEngine.UI.Text title;
    public UnityEngine.UI.Button Btn_rec;
    public UnityEngine.UI.Button Btn_normal;
    public UnityEngine.UI.Button Btn_hight;

    // others
    public System.Action StartRecoder;
    public System.Action StopRecoder;
    public System.Action PlayRecoderNomal;
    public System.Action PlayRecoderHight;

    //Add Listener
    public void Start(){
        Btn_rec.onClick.AddListener (Btn_rec_OnClick);
        Btn_normal.onClick.AddListener (Btn_normal_OnClick);
        Btn_hight.onClick.AddListener (Btn_hight_OnClick);
    }

    //判断是否在录音
    public bool isRecord = false;

    //点击录制的按钮
    public void Btn_rec_OnClick(){
        Debug.Log ("点击录制的按钮");
        if (isRecord == false) {
            StartRecoder ();
            isRecord = true;
        } else {
            StopRecoder ();
            isRecord = false;
        }
    }

    //点击正常播放的按钮
    public void Btn_normal_OnClick(){
        Debug.Log ("点击正常播放的按钮");
        PlayRecoderNomal ();
    }

    //点击高音播放的按钮
    public void Btn_hight_OnClick(){
        Debug.Log ("点击高音播放的按钮");
        PlayRecoderHight ();
    }

    //改变应用的标题
    public void ChangeTitle(string myTitle)
    {
        Debug.Log ("开始改变标题的文字");
        title.text = myTitle;
    }

    //改变中间按钮的文字部分
    public void ChangeButtonText(string myText)
    {
        Btn_rec.GetComponentInChildren<UnityEngine.UI.Text> ().text = myText;
    }
}

其中,该脚本需要附在Unity3d的编辑器UI的局部位置之中,需要拉动相关的UI依赖的。如图。

拉组件依赖.png

Step 2

然后,写刚才UI对应的Mediator的代码,放在/Scripts/View/模块里面

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;
using PureMVC.Interfaces;
using System.Collections.Generic;

public class UserRecordMediator : Mediator, IMediator {

    //初始化
    private UserRecord View
    {
        get { return (UserRecord)ViewComponent; }
    }

    //构造函数
    public UserRecordMediator(UserRecord viewComponent):base(NAME, viewComponent)
    {
        Debug.Log("进入Mediator()的构造函数");

        // others
        View.StartRecoder += Listener_StartRecoder;
        View.StopRecoder += Listener_StopRecoder;
        View.PlayRecoderNomal += Listener_PlayRecoderNomal;
        View.PlayRecoderHight += Listener_PlayRecoderHight;
    }

    //接收按钮的消息
    public void Listener_StartRecoder(){
        Debug.Log("进入Mediator()的StartRecoder");
    }

    public void Listener_StopRecoder(){
        Debug.Log("进入Mediator()的StopRecoder");
    }

    public void Listener_PlayRecoderNomal(){
        Debug.Log("进入Mediator()的PlayRecoderNomal");
    }

    public void Listener_PlayRecoderHight(){
        Debug.Log("进入Mediator()的PlayRecoderHight");
    }

    //接收广播的监听
    public override void HandleNotification(INotification note)
    {
        switch (note.Name)
        {
        case EventsEnum.STARTUP:
            View.ChangeTitle ("欢迎使用录音变声软件 Make By @小小酥XX");
            break;
        }
    }
}

Step 3

接着,新建一个处理该UI的界面RecordUI,放在/Scripts/目录下。附上如下的代码。

using UnityEngine;
using System.Collections;

public class RecordUI : MonoBehaviour {

    public UserRecord myRecord;

    void Awake()
    {
        //启动PureMVC程序
        ApplicationFacade facade = ApplicationFacade.Instance as ApplicationFacade;
        facade.Startup(this);
    }
}

之后,把这个启动UI的代码拉倒Unity3D总的UI控制器上,以便它一启动就被调用,并且还要把刚刚局部UI控制的脚本拉到其依赖关系上。如下图所示。

启动RecordUI.png

Step 4

然后,我们需要修改PureMVC的启动文件
Scripts/ApplicationFacade,以使得它能正确调用刚刚的RecodrdUI。

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;
using PureMVC.Interfaces;

public class ApplicationFacade : Facade
{
    //单例启动
    public new static IFacade Instance
    {
        get
        {
            if(m_instance == null)
            {
                lock(m_staticSyncRoot)
                {
                    if (m_instance == null)
                    {
                        Debug.Log("启动PureMVC的入口函数ApplicationFacade");
                        m_instance = new ApplicationFacade();
                    }
                }
            }
            return m_instance;
        }
    }

    //开始执行
    public void Startup(RecordUI r)
    {
        Debug.Log("Startup()函数,发送消息EventsEnum.STARTUP到RecordUI的UI总控制那里");
        SendNotification(EventsEnum.STARTUP, r);
    }
        
    //初始化
    protected override void InitializeController()
    {
        Debug.Log("初始化PureMVC框架");
        base.InitializeController();
        RegisterCommand(EventsEnum.STARTUP, typeof(StartupCommand));
        RegisterCommand(EventsEnum.DELETE_USER, typeof(DeleteUserCommand));
    }
}

Step 5

最后,我们对Scipts/Controller/StartupCommand这个控制器进行简单修改,以满足其初始化的调用。

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;
using PureMVC.Interfaces;

public class StartupCommand : SimpleCommand, ICommand
{
    public override void Execute(INotification notification)
    {
        Debug.Log("执行StartupCommand.Execute()的函数");
        RecordUI r = notification.Body as RecordUI;
        Facade.RegisterMediator(new UserRecordMediator(r.myRecord));
    }
}

最后,如果成功的话。应该可以看到如下的记录。

DebugLog窗口.png

至此,我们已经完整的完成了一个PureMVC项目的View部分代码的大致编写。其中Controller和Model部分我们下次再继续探讨。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容