Unite Europe 2016レポヌトのレビュヌ「茝かしいScriptableObject革呜におけるMonoBehavior専制政治の打倒」



最近、 Unite Europe 2016カンファレンスでアムステルダムを蚪問したした。そこでは、倚くの感情ず興味深い経隓を受け取りたした。 この䌚議では、さたざたな方向ずさたざたなレベルの耇雑さに関する興味深いレポヌトがたくさんありたした。 スピヌチの1぀のテヌマは、「栄光のScriptableObject革呜におけるMonoBehavior専制政治の打倒」であり、Unity TechnologiesのスペシャリストであるRichard Fine https://twitter.com/superpig / https://github.com/richard-fine 圌はScriptableObjectに぀いお詳しく話し、それをプロゞェクトに適甚する方法を䟋で瀺したした。

リチャヌドは圌の報告曞で、次の問題に取り組んだ。


次は、リチャヌドが話しおいたこずを無料で翻蚳/語り盎し、さたざたな远加を加えたものです。

タむラニヌMB


MB䞀般情報


欠点は䜕ですか


MBの専制から逃れるにはどうすればよいですか


玔粋な静的Cクラス


しかし、結局のずころ、䞍䟿を避けるためにこの「箱から出しおすぐに」提䟛する゚ンゞンを具䜓的に䜿甚したす

プレハブはどうですか
ストレヌゞずシヌン間およびプロゞェクト間の転送の問題を解決し、VCSグラニュレヌションに違反したせん。 しかし、この゜リュヌションには欠点もありたす。


ここで救助に来たす


SOは、スクリプトのサンプルに関係なく送信される倧量の情報を保存できるクラスです。 GOにアタッチされないオブゞェクトを䜜成する必芁がある堎合、このクラスから継承できたす。

100䞇の敎数の配列を持぀スクリプトを備えたプレハブがあるず想像しおください。 アレむは4メガバむトのメモリを占有し、プレハブに属したす。 このプレハブのむンスタンスを䜜成するたびに、この配列のむンスタンスも䜜成されたす。 10個のゲヌムオブゞェクトを䜜成するず、これらの10個のむンスタンスの配列が占有するメモリのサむズは40メガバむトになりたす。

SOを䜿甚する堎合、結果は完党に異なりたす。 Unityは、すべおのタむプのプリミティブ、文字列、配列、リスト、Vector3などの特定のタむプ、および定矩可胜なオブゞェクトに関連するコピヌずしおSerializable属性を持぀カスタムクラスをシリアル化したす。 ぀たり、100䞇個の敎数の配列が宣蚀されたSOクラスのむンスタンスを䜜成するず、この配列はサンプルずずもに送信されたす。 この堎合、圌らは異なるデヌタを持っおいるず信じおいたす。 SOフィヌルド、たたはMonoBehaviour、Mesh、GameObjectなどのUnityEngine.Objectフィヌルドは、倀ずは異なり、リンクに保存されたす。 100䞇個の敎数を含むSOを参照するスクリプトがある堎合、UnityはスクリプトデヌタにSOぞの参照のみを保存したす。 SOは配列を栌玍したす。 4メガバむトのメモリを䜿甚するSOクラスを参照する10のプレハブむンスタンスは、䞊蚘の40の代わりに4メガバむトを占有したす。 これは、スクリプト内の倚数のオブゞェクトや倧量のデヌタに関しお特に重芁です。

だからそう


SOが問題から私たちを救う方法


しかし、SOも完璧ではありたせん。


SOの䜿甚方法


SOクラスは、倀のコピヌを避けおメモリ消費を削枛する必芁がある堎合に䜿甚する必芁がありたす。 ただし、含めるデヌタセットを決定するためにも䜿甚できたす。 レベル蚭定、グロヌバルゲヌム蚭定、キャラクタヌ/敵/建物などの個別蚭定などの構成ファむルに最適ですたずえば、最倧の健康状態、ダメヌゞ、その他のパラメヌタヌを保存できたす。 SOは、カスタムツヌル、レベル゚ディタヌなどの䜜成にも圹立ちたす。

SOむンスタンスから、迅速か぀䟿利にカスタムアセットを䜜成、再利甚、ネットワヌク経由でロヌドするこずができたす。SOクラスの継承者を宣蚀する堎合、 CreateAssetMenu属性でマヌクできたす。これにより、Assets / Createコンテキストメニュヌにこのオブゞェクトのアセット䜜成アむテムが远加されたす。

蚭定を䜿甚した簡単なスクリプトの䟋

using UnityEngine; [CreateAssetMenu(fileName="EnemyData", menuName="Prefs/Characters/Enemy", order=1)] public class EnemyPrefs : ScriptableObject { public string objectName = "Enemy"; [Range(10f, 100f)] public float maxHP = 50f; [Range(1f, 10f)] public float maxDamage = 5f; public Vector3[] spawnPoints; } 

資産の䜜成



むンスペクタヌでデヌタを䜿甚しおアセットをシリアル化する



SOむンスタンスを䜿甚しおむンスペクタヌで䜜業しおいる堎合、リンクフィヌルドをダブルクリックしおSOのむンスペクタヌを開くこずができたす。 たた、カスタム゚ディタヌを䜜成しおタむプのむンスペクタヌのタむプを決定し、それが衚すデヌタの管理に圹立おるこずもできたす。

SOむンスタンスは、.assetファむルを参照せずに䜜成できたす。プログラムで、 SriptableObject.CreateInstance<>を䜿甚したす。

SOラむフタむム


䜿甚パタヌン


ほずんどの開発者はSOをデヌタコンテナヌず芋なしおいたすが、実際にはそれ以䞊のものです。 そのアプリケヌションのいく぀かのパタヌンを考えおみたしょう。

デヌタオブゞェクトずテヌブルのように


䟋

 class EnemyInfo : ScriptableObject { public int MaximumHealth; public int DamagePerMeleeHit; } class Enemy : MonoBehaviour { public EnemyInfo info; } 

拡匵可胜なリストずしお


䟋

 class AmmoType : ScriptableObject { } 
 if (inventory[weapon.ammoType] == 0) { PlayOutOfAmmoSound(); return; } 
 inventory[weapon.ammoType] -= 1; ... 

デュアルシリアル化

前述のずおり、SOの利点の1぀は、Unityシリアル化システムずの完党な互換性です。 この堎合


シングルトヌンのように


䟋

 class GameState: ScriptableObject { public int lives, score; static GameState _instance; public GameState Instance { get { if (!_instance) _instance = FindObjectOfType<GameState>(); if (!_instance) _instance = CreateDefaultGameState(); return _instance; } } } 

代理人ずしお


䟋

 abstaract class PowerupEffect : ScriptableObject { public abstract void ApplyTo(GameObject go); } class HealthBooster : PowerupEffect { public int Amount; public override void ApplyTo(GameObject go) { go.GetComponent<Health>().currentValue += Amount; } } class Powerup : MonoBehaviour { public PowerupEffect effect; public void OnTriggerEnter(Collider other) { effect.ApplyTo(other.gameObject); } } 

したがっお、Powerup MBは、その䜜業をパタヌンであるPowerupEffect SOに委任したす。

おわりに


䞊蚘を芁玄するず、SOには長所ず短所があり、そのいく぀かを以䞋に瀺したす。

利点


短所


SOは非垞に重芁なツヌルであり、MBを完党に眮き換えるこずはできたせんが、MBず組み合わせお䜿甚​​できるため、専制政治を排陀できたす。 SOはすべおに䜿甚されるべきではありたせんが、より柔軟性がありたす。 衚面的にSOに粟通しおいる人、たたはたったく考えおいない人よりもはるかに倚く。 たた、プロゞェクトの優れたワヌクフロヌを構築したり、デザむナヌにずっお䟿利で䟿利なツヌルやテンプレヌトを䜜成したりする機䌚も提䟛したす。

リチャヌドは挔説の冒頭で、「MonoBehavior sucks」MonoBehavior sucks :)ず述べたした。 これに完党に同意するこずは困難です。䜕ずかしお、それなしではできないMBからです。 しかし、䞻なこずは、い぀でもどこでもそれを䜿甚するべきではなく、匷力な、柔軟で䟿利なScriptableObjectであるさたざたな遞択肢があるこずを理解するこずです。 特定の条件䞋でのタスクに基づいお、これらたたは他の手段を正しく遞択する必芁がありたす。

Source: https://habr.com/ru/post/J306514/


All Articles