Hai, Habr. Kami mengundang calon siswa kursus "Pengembang Game Persatuan. Profesional" untuk mengambil bagian dalam webinar terbuka tentang "Kecerdasan buatan lanjutan dari musuh dalam penembak" .
Kami juga menawarkan terjemahan artikel yang menarik untuk dibaca.
Jika Anda adalah pengembang game dan belum pernah mendengar tentang pemrograman reaktif sekarang, hentikan semua bisnis Anda dan baca artikel ini. Aku tidak bercanda.
Jangan terganggu oleh anak kucing. Baca tentang pemrograman reaktif!
Jadi saya mendapat perhatian Anda?
Luar biasa! Saya akan melakukan yang terbaik untuk tidak kehilangan dia.
Apa itu Pemrograman Reaktif?
Saya tidak akan membuat Anda lelah tiba-tiba dengan deskripsi tingkat tinggi tentang apa itu pemrograman reaktif, bagaimana hal itu terjadi, dan mengapa itu sangat penting bagi kita masing-masing. Saya akan mulai dengan lebih banyak hal praktis.
, Unity, — . , — . , .
?
, Player!
, ?
Rocket!
, ?
. Level.
? , , . , , .
Glue Code ( ) — …
, , , . , , , (UI). ?
, ? , Player (label) UI UI , ?
. , ?
? Level UI , .
, , .
, Player, ?
, ? , , , .
, … …
…
!
, . , .
, Unity C# . , . .
: , - , , .
, C# — . , , . , , , .
— , Unity C# (Reactive Extensions) Unity (UniRx).
!
. !
Player
, :
using UnityEngine;
using UnityEngine.UI;
public class Player : MonoBehaviour {
public int health = 100;
public Text scoreLabel;
public void ApplyDamage(int damage) {
health -= damage;
scoreLabel.text = health.ToString();
}
}
- , , «» (glue) , ( “sticky”).
using UnityEngine;
using UnityEngine.UI;
public class Player : MonoBehaviour {
public int health = 100;
public Text scoreLabel;
public void ApplyDamage(int damage) {
health -= damage;
scoreLabel.text = health.ToString();
}
}
! .
, :
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class Player : MonoBehaviour {
public ReactiveProperty<int> health
= new ReactiveProperty<int>(100);
public void ApplyDamage(int damage) {
health.Value -= damage;
}
}
? - . ReactiveProperty
.
, , , ( , ). , , , .
ReactiveProperty
, UiPresenter
:
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class UiPresenter : MonoBehaviour {
public Player player;
public Text scoreLabel;
void Start() {
player.health.SubscribeToText(scoreLabel);
}
}
scoreLabel
. -, ?
, .
, , - , , ? ?
! , , , . , .
, , , ( ). ReactiveProperty
. , , ( , — , ?).
? ReactiveProperty? , .
ReactiveProperty — Observable
( “), , Reactive Properties
. Observable
.

— , ? , , , - .
, , , - , :
? !
, ?
, , Observable
!
6 Observable
!
, , Observable
, . , , — -Observable
«» (emit) . . X :
, observable
— . ?
, , observable
, , .
: , , . — — , . - :
, , , :
all_balls_in_order = Observable.Merge(h1, h2, h3, h4, h5, h6);
, . . , - . , , , . .
: .
!
, . , .
. , , , , .
all_balls_delayed = Observable.Merge(
h1.Delay(
TimeSpan.FromSeconds(1)
),
h2.Delay(
TimeSpan.FromSeconds(2)
),
h3.Delay(
TimeSpan.FromSeconds(3)
),
h4.Delay(
TimeSpan.FromSeconds(3)
),
h5.Delay(
TimeSpan.FromSeconds(2)
),
h6.Delay(
TimeSpan.FromSeconds(1)
)
);
, ?
?
rxmarbles.com , .
UI
, UI, - ? !
. , observable
, , . , UiPresenter
:
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class UiPresenter : MonoBehaviour {
public Player player;
public Text scoreLabel;
void Start() {
player.health
.Select(health => string.Format("Health: {0}", health))
.Subscribe(text => scoreLabel.text = text);
}
}
Select
( rxmarbles
map
). . ( ) .
, , — . , , ?
Subscribe
, . , . SubscribeToText
, , — , .
, , . :
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class UiPresenter : MonoBehaviour {
public Player player;
public Text scoreLabel;
public Animator animator;
void Start() {
player.health
.Select(health => string.Format("Health: {0}", health))
.Do(x => animator.Play("Flash"))
.Subscribe(text => scoreLabel.text = text);
}
}
, ? , , , Do
, .
, , — () :
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class UiPresenter : MonoBehaviour {
public ReactiveProperty<Player> player
= new ReactiveProperty<Player>();
public Text scoreLabel;
public Animator animator;
void Start() {
var playerHealth = this.player
.Where(player => player != null)
.Select(player => player.health);
playerHealth
.Select(health => string.Format("Health: {0}", health))
.Do(x => animator.Play("Flash"))
.Subscribe(text => scoreLabel.text = text);
}
}
? ReactiveProperty
, . , , .
, , , .
, , , . , , , . Unity UniRx.
rxmarbles.com, , . , UniRx (map
, , Select
UniRx).
« , » — .
!
"Unity Game Developer. Professional".
" ".