Reaktive Programmierung fĂĽr Spieleentwickler: Eine EinfĂĽhrung

Hallo Habr. Wir laden zukĂĽnftige Studenten des Kurses "Unity Game Developer. Professional" ein , an einem offenen Webinar zum Thema "Fortgeschrittene kĂĽnstliche Intelligenz von Feinden in SchĂĽtzen" teilzunehmen .



Wir bieten auch die Ăśbersetzung eines interessanten Artikels zum Lesen an.










Wenn Sie ein Spieleentwickler sind und noch nichts von reaktiver Programmierung gehört haben, beenden Sie Ihr gesamtes Geschäft und lesen Sie diesen Artikel. Ich mache keinen Spaß.





Lass dich nicht von Kätzchen ablenken. Lesen Sie mehr über reaktive Programmierung!





Also habe ich deine Aufmerksamkeit bekommen?





Ausgezeichnet! Ich werde mein Bestes tun, um ihn nicht zu verlieren.





Was ist reaktive Programmierung?

Ich werde Sie nicht aus heiterem Himmel mit einer allgemeinen Beschreibung ermĂĽden, was reaktive Programmierung ist, wie sie zustande kam und warum sie fĂĽr jeden von uns so wichtig ist. Ich werde mit viel mehr praktischen Dingen beginnen.





, 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



.





Das sieht toll aus, aber leider sprechen wir nicht ĂĽber einen solchen Strom von Werten.
, , ,

— , ? , , , - .





, , , - , :





? !





, ?





, , 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".



" ".












All Articles