مرحبا هبر. ندعو الطلاب المستقبليين لدورة "Unity Game Developer. Professional" للمشاركة في ندوة مفتوحة عبر الإنترنت حول موضوع "الذكاء الاصطناعي المتقدم للأعداء في الرماة" .
نقدم أيضًا ترجمة لمقال مثير للاهتمام للقراءة.
إذا كنت مطور ألعاب ولم تسمع عن البرمجة التفاعلية حتى الآن ، فتوقف عن عملك واقرأ هذا المقال. أنا لا أمزح.
لا تنشغل بالقطط الصغيرة. اقرأ عن البرمجة التفاعلية!
إذن حصلت على انتباهك؟
ممتاز! سأبذل قصارى جهدي حتى لا أفقده.
ما هي البرمجة التفاعلية؟
, , . .
, 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".
" ".