Unityのグローバルスクリプトをどこに添付しますか?


14

Unityの知る限り、すべてのスクリプトはオブジェクトに添付する必要があります。しかし、グローバルスクリプトの場合はどうなりますか?たとえば、テトリスのようなゲームで、どのオブジェクトに要素スポーナーおよびムーバースクリプトを添付する必要がありますか?または、要素はそれ自体の動きを処理する必要がありますか?この問題のベストプラクティスはありますか?

回答:


14

Tetradの答えを拡張するには、次のようなスクリプトを検討してください。

public class GameSystem : MonoBehavior
{
  private GameSystem m_Instance;
  public GameSystem Instance { get { return m_Instance; } }

  void Awake()
  {
    m_Instance = this;
  }

  void OnDestroy()
  {
    m_Instance = null;
  }

  void Update()
  {
    // global game update logic goes here
  }

  void OnGui()
  {
    // common GUI code goes here
  }

  // etc.
}

その後、シーンのルートに「GameSystem」というオブジェクトを作成できます。それが持つ唯一のコンポーネントは、組み込みの変換コンポーネントです(その位置を原点に、回転をアイデンティティに、スケールを1に設定します。それは重要ではありませんが、良い習慣です)。GameSystemコンポーネントをそのオブジェクトにアタッチしました。

GameSystem.Instance.blah()を使用するだけで、グローバルオブジェクトにアクセスできるようになりました。そのイベントハンドラメソッドは、MonoBehaviorから派生し、コンポーネントとして存在するため、Unityによって自動的に呼び出されます。他のゲームオブジェクトまたはコンポーネントを参照するフィールドを追加して、Unityオブジェクト階層ビューでそれらを接続できます。

はい、これは少し「奇妙」です。常に単なるグローバルシングルトンであるオブジェクト(変換も含む)を作成する必要があるのは、少し汚い感じがすることがあります。ただし、更新メッセージを取得し、デフォルトのUnityプロパティエディターで操作可能なグローバルオブジェクトを作成するためにUnityが必要とするものです。


この答えをありがとう。私はそれが奇妙に感じることに同意します!そして、物事のこの側面にはほとんど情報がないと思います。これらの「マネージャー」タイプのクラスを統一してアプローチするための最良の方法に関する資料をお勧めできますか?
UpTheCreek

@UpTheCreek:私は本当に知りません。数年前にほとんどの仕事でそれをすべて把握しましたが、現在のプロジェクトはカスタムテクノロジに関するものであるため、最近のUnityのベストプラクティスはかなり時代遅れです。ごめんなさい。
ショーンミドルディッチ

3

そのスクリプトを配置するマネージャーオブジェクトを作成するだけです。割り当てたスクリプトの静的変数を作成しAwakeて、簡単にグローバルにアクセスできるようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.