随风逐叶 随风逐叶
首页
  • Quick Reference (opens new window)
  • EgretEngine开发者文档 (opens new window)
  • TinaX框架
  • SSH教程
  • VSCode插件开发
关于
  • 分类
  • 标签
  • 归档

rontian

从事游戏开发10多年的老菜鸟一枚!
首页
  • Quick Reference (opens new window)
  • EgretEngine开发者文档 (opens new window)
  • TinaX框架
  • SSH教程
  • VSCode插件开发
关于
  • 分类
  • 标签
  • 归档
  • 框架简介
  • TinaX.Core
  • 基于TinaX创建一个扩展库
  • TinaX.VFS
  • TinaX.UIKit
  • TinaX.I18N
  • TinaX.Lua
  • XLua

  • Google.Protobuf
  • Lua-Protobuf
  • 一些优秀的第三方库

    • CatLib

    • UniRx

      • 简介
      • 基础教程
        • 官方入门文档
        • UniRx入门系列一
        • UniRx入门系列二
        • UniRx入门系列三
        • UniRx入门系列四
        • UniRx入门系列五
      • UniTask

    目录

    基础教程

    # 基础教程

    # EveryUpdate —— 更新

    观察.Update.订阅(要做的事)

    UniRx 就是这样的写法,其他写法主体几乎不变,只是扩展

    using UniRx;
    using UnityEngine;
    
    public class ChinarUpdate : MonoBehaviour
    {
        /// <summary>
        /// 初始化函数
        /// </summary>
        void Start()
        {
            //观察.Update.订阅(要做的事)
            Observable.EveryUpdate().Subscribe(_ =>
            {
                if (Input.GetMouseButtonDown(0))
                {
                    print("鼠标左键");
                }
            });
            Observable.EveryUpdate().Subscribe(_ =>
            {
                if (Input.GetMouseButtonDown(1))
                {
                    print("鼠标右键");
                }
            });
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    # First —— 首次执行

    # AddTo —— 控制生命周期

    First(条件) —— 条件:只在第一次满足条件时,通过

    AddTo(对象)——事件流的生命周期

    首次点击鼠标左键,输出“只执行一次”,以后不再执行

    void Start()
    {
        Observable.EveryUpdate()                   //观察
            .First(_ => Input.GetMouseButtonUp(0)) //条件
            .Subscribe(_ => print("只执行一次"))        //订阅
            .AddTo(this);                          //给事件流添加声明周期(PS:何时消失)
    }
    
    1
    2
    3
    4
    5
    6
    7
    void Start()
    {
        //如果不添加 this ,那 Observable就是全局的,这个方法在重载场景时不会被释放,会无限叠加
        Observable.EveryUpdate().Subscribe(_ => print("Chinar")).AddTo(this);
        this.UpdateAsObservable().Subscribe(_ => print("Chinar")); //等同于上边:省去了AddTo,this指明了事件流的对象生命周期
    }
    
    1
    2
    3
    4
    5
    6

    # Ui Event —— 界面事件交互

    using UniRx;
    using UniRx.Triggers;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    
    /// <summary>
    /// UI相关、按钮、图片、文本框
    /// 脚本挂载:Canvas
    /// </summary>
    public class ChinarUguiOnClick : MonoBehaviour
    {
        private ReactiveProperty<int> testIntProperty = new ReactiveProperty<int>(88); //指明响应属性 int,值88
    
    
        /// <summary>
        /// 初始化函数
        /// </summary>
        void Start()
        {
            //按钮的事件绑定
            //不添加 add to,绑定的监听函数不会叠加
            transform.Find("Button").GetComponent<Button>().OnClickAsObservable().Subscribe(_ => print("按钮事件被执行"));
            transform.Find("Reload Button").GetComponent<Button>().OnClickAsObservable().Subscribe(_ => { SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); }); //重载当前场景
    
            //图片的事件注册
            var image = transform.Find("Image").GetComponent<Image>();
            image.OnBeginDragAsObservable().Subscribe(_ => print("开始拖动"));
            image.OnDragAsObservable().Subscribe(_ =>
            {
                print("正在拖动");
                image.transform.position = Input.mousePosition; //移动图
            });
            image.OnEndDragAsObservable().Subscribe(_ => print("拖动完成"));
    
            //响应 int 直接订阅 Text
            testIntProperty.SubscribeToText(GameObject.Find("Text Subscribe").GetComponent<Text>());
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40

    # Button —— AsObservable

    GetComponent<Button>().OnClickAsObservable().Select(_=>"A")//按钮绑定
    
    GetComponent<Button>().OnPointerClickAsObservable().Subscribe();//支持Ui Event各种事件
    
    1
    2
    3

    # Coroutine —— 协程

    Observable.FromCoroutine(协程函数) —— 协程转 Observable

    Observable.Timer(TimeSpan.FromSeconds(1)).ToYieldInstruction() —— Observable 转 Yield

        void Start()
        {
            Observable.FromCoroutine(TestIEnumerator); //协程转 Observable
        }
    
    
        private IEnumerator TestIEnumerator()
        {
            yield return Observable.Timer(TimeSpan.FromSeconds(1)).ToYieldInstruction(); // 转 指令、
            print("Chinar Test-Func");
        }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    # WhenAll —— 等待执行完毕

    Where() —— 当多个事件流,需要根据逻辑满足所有都执行后,才触发执行

    1:等待2个协程执行完毕 2:当所有事件执行完毕后

        void Start()
        {
            //第一种:等待协程都执行完毕
            var streamA = Observable.FromCoroutine(A);
            var streamB = Observable.FromCoroutine(B);
            Observable.WhenAll(streamA, streamB).Subscribe(_ => print("WenAll执行成功!"));
    
            //第二种:所有操作执行一次后,执行以下订阅
            var event1 = this.UpdateAsObservable().Where(_ => Input.GetMouseButtonDown(0)).First();
            var event2 = this.UpdateAsObservable().Where(_ => Input.GetMouseButtonDown(1)).First();
            Observable.WhenAll(event1, event2).Subscribe(_ => print("左右键执行一次后,执行操作!"));
        }
    
    
        IEnumerator A()
        {
            yield return new WaitForSeconds(1);
            print("A");
        }
    
    
        IEnumerator B()
        {
            yield return new WaitForSeconds(2);
            print("B");
        }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    # Thread —— 线程

    Observable.Start() —— 开启一个线程

    ObserveOnMainThread() —— 线程结果返回到主线程中,在主线程中观察

        void Start()
        {
            var stream1 = Observable.Start(() =>
            {
                Thread.Sleep(5000);//5000毫秒
                print("等待了5秒");
                return 1;
            }); //线程1
            var stream2 = Observable.Start(() =>
            {
                Thread.Sleep(TimeSpan.FromSeconds(2));
                print("等待2秒");
                return 2;
            }); //线程2
    
            
            Observable.WhenAll(stream1, stream2).ObserveOnMainThread().Subscribe(_ => //当线程执行完毕,将其他线程中的值,返回到主线程中
            {
                print(_[0]);
                print(_[1]);
            });
        }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    # ObservableWWW —— RX-WWW请求

    new ScheduledNotifier() —— 声明一个预定进度对象

    ObserveOnMainThread() —— 线程结果返回到主线程中,在主线程中观察

            //第一个 print,请求正常信息
            //第二个 print,错误信息
            ObservableWWW.Get("http://www.chinar.xin/asdf").Subscribe(print, print);//请求一个错误的网路地址
    
    1
    2
    3
        void Start()
        {
            var slider           = GameObject.Find("Slider").GetComponent<Slider>();                                                                    //滑动器
            var progressText     = GameObject.Find("ProgressText").GetComponent<Text>();                                                                //进度条文本
            var progressNotifier = new ScheduledNotifier<float>();                                                                                      //RX 预定通知 float
            ObservableWWW.GetAndGetBytes("http://www.chinar.xin/TestUpdate/granulesprite.unity3d", progress: progressNotifier).Subscribe(bytes => { }); //下载完成,做储存
            progressNotifier.Subscribe(progressFloat => { slider.value = progressFloat; });                                                             //更新进度
            progressNotifier.SubscribeToText(progressText);                                                                                             //进度值显示在 progressText
        }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    上次更新: 2023/10/17, 14:09:52 访问次数: 0
    简介
    官方入门文档

    ← 简介 官方入门文档→

    最近更新
    01
    一些Shell常用的功能写法整理
    10-20
    02
    删除git仓库submodule的步骤
    10-20
    03
    django基本命令
    10-16
    更多文章>
    Copyright © 2017-2025 随风逐叶
    沪ICP备18008791号-1 | 沪公网安备31011502401077号

    网站访问总次数: 0次
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式